7

我想知道确定声音中给定频率幅度的最简单/最好的方法是什么。

据我了解,FFT 函数将返回信号中所有频率的幅度。如果我只关心特定频率,我想知道是否有任何捷径可以使用。

我将使用 iPhone 麦克风录制音频。我的猜测是我将使用音频队列服务进行录制,因为我不需要将音频录制到文件中。我正在使用 SDK 4.0,因此如果需要,我可以使用 Accelerate 框架中定义的任何函数(例如 FFT 函数)。

更新: 根据康拉德的建议,我将问题更新为更清楚。

4

1 回答 1

16

如果您只需要测试一个频率,您可以计算DFT的对应点。DFT算法是O(N^2),但是FFT算法重用中间结果来实现O(NlogN)的DFT计算。但是,如果您只想要一个频率样本,您可以只计算 DFT 的一个输出样本并实现 O(N) 性能。

这可以通过查看维基百科页面上的 DFT 方程来完成(我什至不打算在这里输入它),只需计算对应于感兴趣频率的单个 k 的 Xk。k 只是 DFT 输出的索引。

将 k(DFT 输出的索引)映射到实际频率 (Hz) 取决于两件事:

  • 采样频率(例如,CD 音频为 44100 Hz)
  • FFT 大小

实际频率映射到 k 如下:

F = k*Fs/N  for k = 0 ... N/2-1 ((N-1)/2 for odd N)

或者

k = F*N/Fs  for F = 0Hz ... Fs/2-Fs/N

其中F是频率(Hz),N是 FFT 大小,Fs是采样频率 (Hz)。需要注意的一些事项:

  • k 是整数,因此并非所有频率都会映射到整数 k。找到最近的 k
  • 如果您需要更高的频率分辨率,请增加 N。
  • 以 Fs 采样的信号只能准确表示最高但不包括 Fs/2(奈奎斯特速率)的频率。这就是为什么我展示了从 k 到 Hz 的映射只对一半的输出样本有用。我不会讨论后半部分代表的内容(对于真实输入信号,它实际上是前半部分的镜像)
  • DFT/FFT 的输出很复杂。你很可能想要采取这种规模。
  • 如果您甚至需要计算几个 DFT 输出,最好只使用可用的 FFT 函数并获取所有输出样本,而不是使用 DFT 仅计算您需要的输出样本。原因是大多数 FFT 算法都经过大量优化,因此即使理论上您可能做的工作更少,但它可能需要比 FFT 更长的时间。您可能只需要对此进行基准测试,看看哪种方法更好。

为简单起见,我省略了很多其他细节,这些细节对您的应用程序无关紧要

于 2010-05-30T06:31:41.550 回答