Как извлечь полуточные частоты из WAV файла с использованием преобразований Фурье
Скажем, у меня есть WAV файл. В этом файле представлена серия синусоидов с точными интервалами в 1 секунду. Я хочу использовать библиотеку FFTW для последовательного извлечения этих тонов. Это особенно трудно сделать? Как я могу это сделать?
Также, как лучше всего записать тоны такого типа в WAV файл? Я предполагаю, что мне понадобится простая аудио-библиотека для вывода.
Мой язык выбора - C
Ответы
Ответ 1
Чтобы получить спектр мощности раздела вашего файла:
-
собирайте N выборок, где N - мощность 2 - если ваша частота дискретизации равна 44,1 кГц, и вы хотите пробовать приблизительно каждую секунду, тогда идите, скажем, N = 32768 образцов.
-
примените подходящую функцию окна к образцам, например. Hanning
-
передайте оконные образцы в процедуру FFT - в идеале вы хотите получить реальный комплексный FFT, но если все вы имеют комплексно-сложный БПФ, затем передают 0 для всех мнимых входных частей
-
вычислить квадрат величины выходов БПФ (re * re + im * im)
-
(необязательно) вычислить 10 * log10 каждого выходного лотка с квадратичной величиной, чтобы получить значение величины в dB
Теперь, когда у вас есть спектр мощности, вам просто нужно определить пик (ы), который должен быть довольно простым, если у вас есть разумное соотношение S/N. Обратите внимание, что частотное разрешение улучшается с увеличением N. Для приведенного выше примера частоты дискретизации 44,1 кГц и N = 32768 частотное разрешение каждого бина составляет 44100/32768 = 1,35 Гц.
Ответ 2
В основном вы заинтересованы в оценке спектра - если вы уже прошли этап чтения WAV и превратили его в дискретный сигнал времени.
Среди различных методов наиболее важным является Периодограмма, которая сводится к принятию дискретного преобразования Фурье с оконным окном (с БПФ) и сохранению его квадрата. Это отвечает Павлу. Вам нужно окно, которое охватывает несколько периодов самой низкой частоты, которую вы хотите обнаружить. Пример: если ваши синусоиды могут быть как 10 Гц (период = 100 мс), вы должны взять окно 200 мс o 300 мс или около того (или больше). Тем не менее, периодограмма имеет некоторые недостатки, хотя ее просто вычислить и ее более чем достаточно, если не требуется высокая точность:
Необработанная периодограмма не является хорошей спектральная оценка по спектральным смещения и того факта, что дисперсия при заданной частоте не уменьшается поскольку количество образцов, используемых в вычисление увеличивается.
Периодограмма может работать лучше, усредняя несколько окон, с разумным выбором ширины (метод Бартлета). И существует множество других методов оценки спектра (AR-моделирование).
На самом деле вам не совсем интересно оценивать полный спектр, а только местоположение одной частоты. Это можно сделать, ища пик оценочного спектра (как описано), но также более конкретными и мощными (и сложными) методами ( Писаренко, МУЗЫКАЛЬНЫЙ алгоритм). Вероятно, они будут излишними в вашем случае.
Ответ 3
Файлы WAV содержат данные с линейным импульсным кодом (LPCM). Это просто означает, что это последовательность значений амплитуд при фиксированной частоте дискретизации. A заголовок RIFF содержится в начале файла для передачи информации типа частота дискретизации и бит на выборку (например, 16-бит бит 8 кГц).
Формат очень прост, и вы можете легко свернуть свой собственный. Однако для ускорения процесса существует несколько библиотек, таких как libsndfile. Простой уровень Direct-Media (SDL)/SDL_mixer и PortAudio - две красивые библиотеки для воспроизведения.
Что касается подачи данных в FFTW, вам нужно будет буферизовать 1 секунду кусков (определить размер по частоте выборки и битам на образец). Затем преобразуйте все образцы в плавающую точку IEEE (т.е. float
или double
в зависимости от конфигурации FFTW - libsndfile может сделать это для вас). Затем создайте еще один массив для хранения вывода частотной области. Наконец, создайте и выполните план FFTW, передав оба буфера fftw_plan_dft_r2c_1d
и вызывая fftw_execute
с возвращенным дескриптором fftw_plan
.