Как да извлечете информация за честотата от проби от PortAudio с помощта на FFTW в C

Искам да направя програма, която да записва аудио данни с помощта на PortAudio (свърших тази част) и след това да показва информацията за честотата на това записано аудио (засега бих искал да покажа средната честота на всяка от групата проби докато влизат).

От някои проучвания, които направих, знам, че трябва да направя FFT. Така че потърсих в Google библиотека, която да направи това, в C, и намерих FFTW.

Сега обаче съм малко изгубен. Какво точно трябва да направя със семплите, които записах, за да извлека някаква честотна информация от тях? Какъв тип FFT трябва да използвам (предполагам, че ще имам нужда от реални данни 1D?)?

И след като направя FFT, как мога да получа информация за честотата от данните, които ми дава?

РЕДАКТИРАНЕ: Сега намерих и алгоритъма за автокорелация. по-добре ли е По-прост?

Благодаря много предварително и съжалявам, нямам абсолютно никакъв опит в това отношение. Надявам се да има поне малко смисъл.


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


Отговори (1)


За да конвертирате вашите аудио проби в спектър на мощност:

  • ако вашите аудио данни са цели числа, тогава ги преобразувайте в плаваща запетая
  • изберете размер на FFT (напр. N=1024)
  • приложете прозоречна функция към N проби от вашите данни (напр. Hanning)
  • използвайте FFT от реално към комплексно с размер N за генериране на данни от честотната област
  • изчислете големината на вашите сложни данни за честотен домейн (magnitude = sqrt(re^2 + im^2))
  • по желание конвертирайте величината в логаритмична скала (dB) (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 Hz (среден A). Как да направя това? - person houbysoft; 17.06.2010
comment
Ако честотата на дискретизация, Fs = 44,1 kHz, и размерът на FFT, N = 1024, тогава разделителната способност на вашия спектър ще бъде Fs / N = 44100 / 1024 = 43,1 Hz. С други думи, всеки бин от вашия спектър на мощност е около 43 Hz широк. Следователно компонент от 440 Hz ще се показва най-вече в контейнер 10. Ако имате нужда от повече разделителна способност, тогава ще трябва да увеличите N. - person Paul R; 17.06.2010