Как извлечь информацию о частоте из образцов из PortAudio, используя FFTW в C - PullRequest
15 голосов
/ 17 июня 2010

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

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

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

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

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

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

1 Ответ

16 голосов
/ 17 июня 2010

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

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