Как проверить результаты БПФ синусоиды?


9

Мне дали аудиофайл (синусоида) 1000 Гц в качестве входных данных для моего алгоритма FFT. У меня есть 8192 выборки спектра мощности в массиве.

Каков наилучший и самый простой способ проверить правильность моего вывода?

Если я приведу тихий аудиофайл, то выход будет нулевым для всех семплов. В синусоидальной волны o / p увеличивается от 20 (0-й образец) до 26059811 (743-й образец) и постепенно уменьшается до 40.

Если я получу представление о выходном диапазоне, то смогу технически доказать, работает ли БПФ.

Любые идеи будут полезны.

Обратитесь по этой ссылке для любых технических сомнений.


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

В массиве 8192 значения. Вы хотите, чтобы я построил график вручную, или электронная таблица справится с этим. Я работаю над MAC

2
Я составил десятки тысяч образцов в MS Excel; Gnumeric или другой тоже подходит. Или гнуплот тоже.

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

@ Фальшивое имя: я не могу построить график ..

Ответы:


4

Кажется, вы рассчитываете спектр путем усреднения 10 окон (не перекрывающихся?), Чтобы получить квадрат в квадрате на частотах 8192 или 8193 (от 0 до Найквиста, но некоторые алгоритмы могут сбрасывать частоту Найквиста в ячейке 8192).

Первое, что нужно проверить, это то, что вершина находится в правой корзине. Вы не сказали, что такое частота дискретизации, но 743/16384 будет в 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 точками (на самом деле это 8193 точки, поскольку x является действительной величиной).

Вычисленная энергия в частотной области имеет масштабный коэффициент N / 16384, поскольку функция psd масштабируется у до размера ДПФ, а не до общей длины сигнала. Является ли это проблемой, зависит от того, как ваша система справляется с нормализацией PSD. Другая необязательная нормализация - масштабирование на 1 / Fs. Это соответствует энергии оригинального аналогового сигнала. Нормализации по умолчанию должны быть хорошо документированы в библиотеке.


Я проверил мой сигнал синусоидальной волны, это 1000 Гц. Мой БПФ дает правильный ответ. Спасибо за вашу помощь.

10

Вам нужно нанести на график величину выходного сигнала БПФ. Я не знаком с вашим языком программирования, но в Python вы бы использовали что-то вроде plot(abs(fft(a))). Для тихого ввода на выходе должны быть все нули. Для синусоидального входа вы должны увидеть два пика:

альтернативный текст

Для реального сигнала шипы будут симметричными слева направо. Однако если вы выполняете настоящее БПФ (что более эффективно с точки зрения вычислений), вы получите только левую половину графика в качестве выходных данных, поскольку оно игнорирует избыточное зеркальное отображение.

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


Вы имеете в виду значение спектра мощности в качестве амплитуды?

t -> со ссылкой на время?

Не беспокойся о времени. Если вы просто проверяете, работает ли БПФ, все, что вам нужно сделать, это проверить, что форма величины похожа на эту.
эндолит

Я не могу построить график, так как мой БПФ работает правильно. Я постараюсь реализовать график в свое свободное время определенно. Большое спасибо.

1
@clabacchio: Ох. БПФ производит вывод с осью 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.