确定iPhone上某个频率的大小

时间:2010-05-27 13:49:05

标签: iphone audio fft

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

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

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

更新 根据康拉德的建议,我更新了这个问题。

1 个答案:

答案 0 :(得分:13)

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

这可以通过查看wikipedia page上的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(Nyquist rate)。这就是为什么我表明从k到Hz的映射仅适用于输出样本的一半。我不会进入后半部分代表的内容(它实际上是实际输入信号的上半部分的镜像)
  • DFT / FFT的输出很复杂。你很可能想要达到这个程度。
  • 如果您需要计算甚至几个DFT输出,最好只使用可用的FFT函数并获取所有输出样本,而不是仅计算使用DFT所需的输出样本。原因是大多数FFT算法都经过了大量优化,因此即使您理论上可能做的工作较少,也可能需要比FFT更长的时间。你可能只需要对此进行基准测试,看看哪种方法更好。

为了简单起见,我遗漏了其他一些细节,这对您的应用程序无关紧要