Як виміряти одну частоту

Якщо у вас є мензурка, повна морської води, ви могли б задатися питанням: скільки хлориду калію в цій мензурці Точно так само, якщо у нас є оцифрований звук, який складається з безлічі різних синусоїд, можна було б поцікавитися, наскільки сильна синусоїда частотою 1000 Гц в цьому звуці Дискретне перетворення Фурє (ДПФ) дає можливість відповісти на це питання Якщо вам цікава тільки одна частота, використовуйте ДПФ для вимірювання того, наскільки сильна ця частота як частина загальної звукової картини Повторюючи цей вимір для різних частот, ви можете отримати досить повне уявлення про спектрі звукового сигналу

Хоча ДПФ спирається на досить складну математику, основна ідея проста: якщо ви помножите дві різних синусоїди, то отримаєте різні результати, які залежать від ставлення між частотами

Наприклад, припустимо, що ви хочете зясувати, наскільки сильно представлена ​​хвиля частотою 1000 Гц в певному сигналі Спочатку множимо заданий сигнал на синусоїду з частотою 1000 Гц, а потім складаємо разом отримані відліки Ha рис 244 показаний цей процес для випадку, коли досліджуваний сигнал є синусоїда з частотою 1000 Гц з тією ж фазою (Очевидно, що картина буде змінюватися в залежності від фази ми докладно розглянемо це пізніше) Може це і неочевидно, але в нашому випадку кінцева сума пропорційна амплітуді досліджуваного сигналу

B противагу цьому, на рис 245 показано, що станеться, якщо дослі-

дуємо сигнал є синусоїдою з відмінною частотою Тут у творі

представлені як позитивні, так і негативні значення Якщо ви сло-

житі разом вийшли на рис 245 відліки, то отримаєте нуль

Це спостереження показує, що для вимірювання амплітуди однієї частоти потрібно помножити наявний сигнал на синусоїду тієї ж частоти і скласти отримані відліки

Щоб записати це в символьному вигляді, припустимо, що відліки мають значення s0, s1, .., st,… Мінлива t являє собою номер відліку (який заміняє значення часу) Ви можете виміряти амплітуду частотиf  в першому наближенні, обчисливши наступну суму:

N −1

амплітуда = ∑ st cos(2πtf  / N )

=0

Вивчивши вищесказане, можна помітити, що основний метод вимірювання годину-

той працює не для всіх частот

Значенняt  іf  не відповідають у точності часу і частоті Більше того,

f – ціле число, а реальна досліджувана частота це частота дискретизації,

помножена наf/N  Подібним чином,t  це цілочисельний номер відліку Крім того, підсумовування дає не безпосереднє значення амплітуди, а всього лише число, пропорційне амплітуді Незважаючи на ці застереження, результат все ж заслуговує на увагу

Якщо ви повторите ці обчислення для різних значеньf, То зможете виміряти амплітуду всіх частот у вашому сигналі Для будь-якого цілого f меншого N ви легко визначите значенняAf,   представляє амплітуду відповідної частоти як частку від загального сигналу Ці значення можуть бути обчислені за тією ж формулою:

−1

Af   = ∑ st cos(2πtf  / N )

=0

Якщо ми знаємо значенняАF,ми можемо відновити вихідні відліки Згадаймо, щоAf     амплітуда синусоїди з частотоюfS/N  Для відновлення сигналу необхідно скласти всі значення для різних частот Аналітично це записується так:

−1

st  = ∑ Af  cos(2πtf  / )

=0

Зворотне перетворення аналогічно прямому, про який ми говорили вище Якщо ви постійно працюєте з перетвореннями Фурє, це подібність стає важливим

Облік фази

Щоб здійснювати точне зворотне перетворення Фурє, крім амплітуди і частоти необхідно вимірювати фазу кожної частоти Ми вже знаємо, як вимірювати амплітуду кожної частоти A фазу

Ha допомогу приходять комплексні числа Можна змінити описаний раніше метод обчислень так, що він буде давати двовимірний результат Просте комплексне число це, по суті, двовимірне значення, тому воно одночасно представляє і амплітуду, і фазу

При такому підході фазова частина обчислюється неявно Замість амплітуди і фази ви вимірюєте дві амплітуди, що відповідають різним фазам Одна з цих фаз представляється косинусом (Cos ()), інша синусом (sin ())

Використовуючи комплексні числа, ви можете проводити вимірювання одновремен-

але, множачи синусну частина на-i  (Для представлення торие воліють букву j)

N −1

– 1 я використовуюi,  неко-

Af   = ∑ (st cos(2πtf  / N ) − ist sin(2πtf  / N ))

=0

Кожне значення Af    тепер представляється комплексним числом действи-

кові і уявна частини задають амплітуду двох синусоїдальних хвиль з різними

фазами Згадаймо, що будь-яке комплексне числоa+ib  має модуль, рівний

a 2  + b 2, і аргумент, рівний tan-1 (a/b) Модуль Af    це амплітуда однієї синусо-

ідальня хвилі, фаза якої дорівнює аргументу Af

Для компактності зазвичай заміняють вираз cos(2πtf/N)     isin(2πtf/N) на еквівалентнуe-2πtf/N,  що дає варіант запису ДПФ, що часто використовується в книгах:

N −1

Af   = ∑

t =0

st e

− 2πitf  / N

He дивно, що повне зворотний ДПФ виглядає абсолютно так само Тепер ви повинні розуміти, що при такому формулюванні для кожної частоти відбувається комбінування синусоїди і косінусоіди для отримання однієї хвилі з істинною амплітудою, частотою і фазою Додавання цих хвиль дає вам вихідний сигнал:

−1

s() = ∑

=0

Af e

− 2πitf / N

Реалізація ДПФ

Для ДПФ легко розробити програмний код Використовуючи бібліотеку complex із стандартної бібліотеки C + +, ми можемо реалізувати пряме ДПФ способом, наведеним в лістингу 241, скориставшись тим, що polar (10, x) те ж саме,

що і eix

Лістинг 241 Дискретне перетворення Фурє

void ForwardDft(complex &ltdouble&gt *samples,

int length, complex&ltdouble&gt*result) {

static const double

twoPi = 2*31415926535897932384626 for(int f = 0 f&ltlength f++) { result[f] = 00

for(int t = 0 t &lt length t++)

result[f] += samples[t] * polar(10,-twoPi*f*t/length)

}

}

Ця функція заманливо проста, і вам слід завжди тримати її під рукою, якщо ви часто працюєте з перетвореннями Фурє Можна не сумніватися, що завдяки цій простоті вона працює правильно Порівнюючи інші програми перетворення Фурє з цієї, ви можете перевіряти вірність їх роботи

Однак ця функція працює досить повільно, навіть занадто повільно для практичного застосування Ви здатні значно збільшити швидкість її роботи, реорганізувавши вищенаведений код (Виносячи обчислення експоненти за внутрішній цикл), але можна зробити і краще

Основна проблема полягає в тому, що ця формула обчислює кожну точку спектра окремо Ha практиці вам майже завжди потрібно обрахувати відразу весь спектр, що дозволяє поєднати обчислення для різних частот

Масштабування

Якщо ви візьмете набір відліків, застосуєте до нього пряме ДПФ, описане раніше, для отримання спектру, а потім використовуєте зворотне ДПФ для отримання набору відліків, то відліки будуть іншими у порівнянні з вихідними Результат насправді буде в N разів більше Щоб компенсувати це, потрібно гденибудь ввести поправочний множникІснує, принаймні, три способи зробити це

Один із способів отримання коректно промасштабірованного результату розділити результати прямого ДПФ наN  Пряме і зворотне ДПФ тоді будуть виглядати так:

1 N −1

A f   =

t =0

st e

− 2πitf  / N

N −1

s() = ∑

f =0

Af e

− 2πitf / N

Тепер, якщо ви застосуєте пряме ДПФ до набору відліків, а потім зворотне

ДПФ до отриманого спектру, результат, як уже згадувалося, буде нульовим

Деякі вважають за краще ділити результати прямого і зворотного ДПФ

на, Що дає виключно симетричні формули:

A f   =

N −1

∑ s e − 2πitf  / N

N  t =0

N −1

s(t ) =

1   ∑ A e −2πitf / N

N  f =0

Проте зазвичай програмістів забуття час, необхідний для виконання прямого перетворення, тому найбільш поширений метод коригування полягає в поділі результату зворотного ДПФ на N:

N −1

A   = ∑ s e − 2πitf  / N

t =0

1 N −1

f

N f =0

Хоча перший метод і претендує на деяку технічну коректність, основний практичний інтерес представляєвідносна амплітуда вихідного сигналу Будь-який з цих трьох методів масштабування дає одні й ті ж відносні результати

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = A Programmers Guide to Sound: Пер з англ М: ДМК Пресс, 2000 432 с, іл (Серія «Для програмістів»)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*