Как извлечь частотную информацию из семплов из PortAudio с помощью FFTW на C

Я хочу создать программу, которая будет записывать аудиоданные с помощью PortAudio (я уже сделал эту часть), а затем отображать частотную информацию этого записанного звука (сейчас я хотел бы отображать среднюю частоту каждой из группы сэмплов. когда они входят).

Из некоторых исследований, которые я провел, я знаю, что мне нужно выполнить БПФ. Итак, я поискал в Google библиотеку для этого на C и нашел FFTW.

Однако сейчас я немного заблудился. Что именно я должен делать с записанными семплами, чтобы извлечь из них некоторую частотную информацию? Какой тип БПФ я должен использовать (я полагаю, мне понадобится 1D с реальными данными?)?

И как только я выполню БПФ, как мне получить информацию о частоте из данных, которые он мне дает?

РЕДАКТИРОВАТЬ: теперь я нашел также алгоритм автокорреляции. Это лучше? Проще?

Заранее большое спасибо, и извините, у меня нет абсолютно никакого опыта, если это. Я надеюсь, что в этом есть хоть какой-то смысл.


person houbysoft    schedule 17.06.2010    source источник


Ответы (1)


Чтобы преобразовать ваши аудиосэмплы в спектр мощности:

  • если ваши аудиоданные являются целочисленными данными, преобразуйте их в числа с плавающей запятой
  • выберите размер БПФ (например, N = 1024)
  • примените оконную функцию к N образцам ваших данных (например, Ханнинг)
  • использовать БПФ реального в комплексное размера N для генерации данных в частотной области
  • рассчитать величину ваших комплексных данных частотной области (magnitude = sqrt(re^2 + im^2))
  • опционально преобразовать величину в логарифмическую шкалу (дБ) (magnitude_dB = 20*log10(magnitude))
person Paul R    schedule 17.06.2010
comment
portaudio позволяет записывать данные в формате с плавающей запятой (32 бита с плавающей запятой). Поэтому я рекомендую использовать это предложение. - person INS; 17.06.2010
comment
@Iulian: да, это, вероятно, было бы разумным поступком, если у вас нет другой предварительной обработки, которую вы хотите выполнить в целочисленной области, прежде чем генерировать спектр мощности. - person Paul R; 17.06.2010
comment
Спасибо, еще один, наверное, глупый вопрос. Я рассчитал все, но теперь, допустим, я хочу проверить, присутствует ли в сигнале частота 440 Гц (средняя A). Как мне это сделать? - person houbysoft; 17.06.2010
comment
Если частота дискретизации Fs = 44,1 кГц и размер FFT N = 1024, то разрешение вашего спектра будет Fs / N = 44100/1024 = 43,1 Гц. Другими словами, ширина каждого бина вашего спектра мощности составляет около 43 Гц. Таким образом, компонент 440 Гц будет отображаться в основном в ячейке 10. Если вам нужно большее разрешение, вам придется увеличить N. - person Paul R; 17.06.2010