我是信号处理的新手,请稍等一下。我已经为Windows下载并安装了FFTW。该文档还可以,但是我仍然有疑问。

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

我只想在音频中找到一定范围的频率分量,而不会执行任何逆DFT。在这种情况下,是否需要进行从真实到真实的转换,因此fftw_plan_r2r_1d()函数?

我要转换的数据块的长度为11025个样本。我的函数如下所示。这将导致11025个bin的频谱阵列。我如何知道结果中的最大频率分量?

我相信bin间隔是Fs / n,44100/11025,所以4。这是否意味着我将在阵列中拥有一个频谱,从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))上计算复杂输出仓的大小
  • 频率分辨率的确是Fs / N = 44100 / 11025 = 4 Hz,即每个输出仓的宽度为4 Hz
  • 进行实数到复杂的转换,您将获得N / 2 + 1个输出仓,从而为您提供从0Fs / 2的频率
  • 您只需忽略不感兴趣的频率-FFT非常高效,因此您可以“浪费”多余的输出仓(除非您只对相对较少的输出频率感兴趣)

    补充说明:
  • 计划创建实际上并不执行FFT-通常,您一次创建一个计划,然后多次使用它(通过调用fftw_execute)
  • 为了提高性能,您可能希望使用单精度调用(例如fftwf_execute而不是fftw_execute,并且类似地用于计划创建等)

  • 有关StackOverflow的一些有用的相关问题/解答:
  • How do I obtain the frequencies of each value in an FFT?
  • How to get frequency from fft result?
  • How to generate the audio spectrum using fft in C++?

  • 您可能还想阅读更多类似的问题和答案-搜索fftfftw标签。

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

    09-27 08:21