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

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

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

我只对在音频中找到一系列频率成分感兴趣,而且我不会执行任何逆DFT。 在这种情况下,所有必要的是真实到真实的转换,因此fftw_plan_r2r_1d()函数?

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

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

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

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

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

 p = fftw_plan_r2r_1d(11025, audioData, spectrum, FFTW_REDFT00, FFTW_ESTIMATE); 

从上面回答您的一些个人问题:

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

补充说明:

  • 计划创建实际上不执行FFT – 通常您创建一次计划然后多次使用它(通过调用fftw_execute
  • 对于性能,您可能希望使用单精度调用(例如fftwf_execute而不是fftw_execute ,类似于计划创建等)

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

  • 如何获得FFT中每个值的频率?

  • 如何从fft结果获得频率?

  • 如何在C ++中使用fft生成音频频谱?

还有许多类似的问题和答案,您可能还想阅读 – 搜索fft和fftw标签。

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