Как извлечь полуточные частоты из 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.