Як перевірити результати FFT синусоїди?


9

Мені дали аудіофайл (синусоїда) 1000 Гц як вхід до мого алгоритму FFT. У мене в масиві 8192 зразків спектру потужності.

Який найкращий і найпростіший спосіб перевірити, чи правильний мій вихід чи неправильний?

Якщо я даю безшумний аудіофайл, то вихід для всіх зразків дорівнює нулю. У синусоїді wa / p збільшується з 20 (0-й зразок) до 26059811 (743-й зразок) і поступово зменшується до 40.

Якщо я отримаю уявлення про вихідний діапазон, то я можу довести технічно, чи працює FFT.

Будь-які ідеї були б корисні.

Зверніться до цим посиланням для будь-яких технічних сумнівів.


1
Ви можете побудувати свій масив? (можливо, у програмі для електронних таблиць?)

У масиві є 8192 значень. Ви хочете, щоб я малював вручну або електронну таблицю обробляв би це. Я працюю над MAC

2
Я побудував десятки тисяч зразків у MS Excel; Підходить також гнумерний чи інший. Або gnuplot теж.

Не забудьте відкрити офіс
підроблене ім’я

@Fake Ім'я: я не в змозі побудувати графік ..

Відповіді:


4

Здається, ви обчислюєте спектр, усереднюючи 10 вікон (не перекриваючись?), Щоб отримати величину в квадраті на частотах 8192 або 8193 (від 0 до Nyquist, але деякі алгоритми можуть знизити частоту Nyquist у біні 8192).

Перше, що потрібно перевірити, це те, що вершина знаходиться у правій відро. Ви не сказали, що таке показник вибірки, але bin 743 буде в 743/16384 більше, ніж показник вибірки. Якщо сигнал дійсно знаходиться на частоті 800 Гц, це ставить Fs приблизно 17640 зразків / секунду. Це здається неправильним. Ваш тестовий сигнал, ймовірно, буде зі стандартною швидкістю, наприклад 8000, 16000, 22050, 32000, 44100 або 48000. Для Fs = 22050, пік буде різко у біні 800/22050 * 16384 = 594.

Іншим критерієм, який слід перевірити, є те, що загальна енергія в сигналі приблизно однакова і в часовій, і в частотній областях. Ось приклад в Python:

In [1]: NFFT = 2048; N = 10*NFFT; n = arange(N); Fs = 22050
In [2]: x = 0.4*cos(2*pi*400/Fs*n) + 0.6*cos(2*pi*800/Fs*n)

In [3]: y,freqs = psd(x, NFFT=NFFT, Fs=Fs, pad_to=16384)  # PSD by Welch's Method

In [4]: sum(x**2)/Fs           # time-domain energy
Out[4]: 0.24149869319296949
In [5]: sum(y) * N/16384       # frequency-domain energy
Out[5]: 0.24148752834391252

Вхідний сигнал x, який складається з двох синусоїд, відібраних при Fs = 22050 проб / секунду, сегментований на 10 вікон, що не перекриваються, розміром NFFT = 2048 зразків. Заклик до psd (спектральна щільність потужності) обчислює спектр y як середнє значення величини в квадраті десяти 16384-бальних DFT (насправді це 8193 бали, оскільки x є реальною величиною).

Обчислена енергія частотної області має коефіцієнт масштабування N / 16384, оскільки функція psd масштабується y до розміру DFT замість загальної довжини сигналу. Невже це питання чи ні, залежить від того, як ваша система поводиться з нормалізацією PSD. Інша необов'язкова нормалізація - масштабування на 1 / Fs. Це відповідає енергії вихідному аналоговому сигналу. Нормалізації за замовчуванням повинні бути добре задокументовані в бібліотеці.


Я перевірив свій синусоїдальний сигнал, що це 1000 Гц. Шахта FFT дає правильну відповідь. Дякую за вашу допомогу.

10

Вам потрібно побудувати графік виходу FFT. Я не знайомий з вашою мовою програмування, але в Python ви б використовували щось подібне plot(abs(fft(a))). Для безшумного вводу на виході повинні бути всі нулі. Для вводу синусоїди слід побачити два шипи:

alt текст

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

Якщо частота вище, шипи будуть ближче до центру. Якщо частота ідеально синхронізується з розміром шматка , шип буде шириною лише на одну точку, а все інше буде рівно 0. Інакше у нього буде звужена «спідниця», як вище.


Ви маєте на увазі значення спектру потужності як амплітуду?

t -> з посиланням на час?

Не хвилюйтесь про час. Якщо ви просто перевіряєте, чи працює FFT, все, що вам потрібно зробити, це перевірити, чи форма величини схожа на цю.
ендоліт

Я не в змозі скласти змову все одно мій FFT працює правильно. Я спробую напевно реалізувати графік у вільний час. Дякую багато.

1
@clabacchio: О. FFT виробляє вихід з віссю f = 0 на початку та в кінці ділянки. Середня точка ділянки - вісь f = fs / 2. Часто існує функція fftfreq або fftshift для перестановки ділянки так, щоб частота 0 була в центрі. flic.kr/p/arVeZT
ендоліти

0

Я скористався інструментом аналізу Фур’є в програмі інструментів аналізу Excel, щоб швидко перевірити дані та результати.


Я працюю на MAC.

@Warrior - Тоді використовуйте MacPorts або Fink, щоб встановити Gnumeric (також див. Цю сторінку для отримання інформації про обгортку Platypus, якщо ви цього хочете)
Кевін Вермер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.