用FFTW计算音频数据的离散傅里叶变换

时间:2016-10-03 19:54:37

标签: c audio signal-processing fft fftw

我对信号处理很陌生,所以请原谅我,如果我吵了一下。我已下载并安装了适用于Windows的FFTW。文档还可以,但我仍然有疑问。

我的总体目标是从计算机上的声卡中捕获以44100采样/秒采样的原始音频数据(此任务已使用库和我的代码实现),然后对此音频数据块执行DFT。

我只对在音频中找到一系列频率成分感兴趣,而且我不会执行任何逆DFT。在这种情况下,所有必要的是真实到真实的转换,因此 a b c abc 0 1 0 def 0 0 1 ghi 0.33 0.33 0.33 jkl 1 0 0 函数?

我要转换的数据块长度为11025个样本。我的函数调用如下所示。这将产生11025个频段的频谱阵列。我如何知道结果中的最大频率成分?

我相信bin间距是Fs / n,44100/11025,所以4.这是否意味着我将在阵列中将频谱从0 Hz一直升至44100Hz,步长为4或更高一半的奈奎斯特频率22200?

这对我来说是个问题,因为我只想搜索60Hz到3000Hz的频率。有没有办法限制变换范围?

我没有看到该函数的任何参数,或者可能还有其他方法?

非常感谢您提供任何帮助。

fftw_plan_r2r_1d()

1 个答案:

答案 0 :(得分:2)

回答上述一些问题:

  • 你需要一个真实到复杂的转换,而不是真实的转换
  • 您将计算感兴趣频率(magnitude = sqrt(re*re + im*im)
  • 的复杂输出区间的大小
  • 频率分辨率确实为Fs / N = 44100 / 11025 = 4 Hz,即每个出纸槽的宽度为4 Hz
  • 对于实际到复杂的变换,您可以获得N / 2 + 1个输出频段,为您提供从0Fs / 2
  • 的频率
  • 您只需忽略您不感兴趣的频率 - FFT非常有效,因此您可以负担得起浪费"不需要的输出箱(除非您只对相对较少的输出频率感兴趣)

附加说明:

  • 计划创建实际上并不执行FFT - 通常您创建一次计划然后多次使用(通过调用fftw_execute
  • 为了提高性能,您可能希望使用单精度调用(例如fftwf_execute而不是fftw_execute,同样适用于计划创建等)

StackOverflow上的一些有用的相关问题/答案:

您可能还想阅读更多类似的问题和答案 - 搜索代码。

另请注意,dsp.stackexchange.com是有关DSP 理论的问题的网站的首选网站,而非实际的特定编程问题。