Мне дали аудиофайл (синусоида) 1000 Гц в качестве входных данных для моего алгоритма FFT. У меня есть 8192 выборки спектра мощности в массиве.
Каков наилучший и самый простой способ проверить правильность моего вывода?
Если я приведу тихий аудиофайл, то выход будет нулевым для всех семплов. В синусоидальной волны o / p увеличивается от 20 (0-й образец) до 26059811 (743-й образец) и постепенно уменьшается до 40.
Если я получу представление о выходном диапазоне, то смогу технически доказать, работает ли БПФ.
Любые идеи будут полезны.
Обратитесь по этой ссылке для любых технических сомнений.
Ответы:
Кажется, вы рассчитываете спектр путем усреднения 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:
Входной сигнал x, который состоит из двух синусоид, дискретизированных при Fs = 22050 отсчетов в секунду, сегментируется на 10 непересекающихся окон размера NFFT = 2048 отсчетов. Призыв к psd (спектральной плотности мощности) вычисляет спектр y как среднее значение квадрата величины из десяти ДПФ с 16384 точками (на самом деле это 8193 точки, поскольку x является действительной величиной).
Вычисленная энергия в частотной области имеет масштабный коэффициент N / 16384, поскольку функция psd масштабируется у до размера ДПФ, а не до общей длины сигнала. Является ли это проблемой, зависит от того, как ваша система справляется с нормализацией PSD. Другая необязательная нормализация - масштабирование на 1 / Fs. Это соответствует энергии оригинального аналогового сигнала. Нормализации по умолчанию должны быть хорошо документированы в библиотеке.
источник
Вам нужно нанести на график величину выходного сигнала БПФ. Я не знаком с вашим языком программирования, но в Python вы бы использовали что-то вроде
plot(abs(fft(a)))
. Для тихого ввода на выходе должны быть все нули. Для синусоидального входа вы должны увидеть два пика:Для реального сигнала шипы будут симметричными слева направо. Однако если вы выполняете настоящее БПФ (что более эффективно с точки зрения вычислений), вы получите только левую половину графика в качестве выходных данных, поскольку оно игнорирует избыточное зеркальное отображение.
Если частота выше, шипы будут ближе к центру. Если частота идеально синхронизируется с размером фрагмента , шип будет иметь ширину всего в одну точку, а все остальное будет ровно 0. В противном случае у него будет сужающаяся «юбка», как указано выше.
источник
Я использовал инструмент анализа Фурье в пакете инструментов анализа Excel для быстрой проверки данных и результатов.
источник