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

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

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

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

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

EDIT: теперь я нашел также алгоритм автокорреляции. Это лучше? Simpler?

Спасибо большое заблаговременно, и извините, у меня нет абсолютно никакого опыта, если это произойдет. Надеюсь, это по крайней мере немного.

Ответ 1

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

  • если ваши аудиоданные являются целыми данными, затем преобразуйте их в плавающую точку.
  • выберите размер FFT (например, N = 1024)
  • примените функцию окна к N образцам ваших данных (например, Hanning)
  • использовать реальный комплексный БПФ размера N для генерации данных в частотной области.
  • рассчитать величину данных вашей сложной частотной области (magnitude = sqrt(re^2 + im^2))
  • опционально преобразовать величину в шкалу регистрации (дБ) (magnitude_dB = 20*log10(magnitude))