确定iPhone上某个频率的大小

Sen*_*ful 6 iphone audio fft

我想知道确定声音中给定频率大小的最简单/最好的方法是什么.

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

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

更新: 根据康拉德的建议,我更新了问题更清楚.

Jas*_*n B 14

如果您只需要测试一个频率,则只需计算DFT的对应点即可.DFT算法是O(N ^ 2),但FFT算法重用中间结果以实现用于DFT计算的O(NlogN).但是,如果只需要一个频率样本,则只需计算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)
Run Code Online (Sandbox Code Playgroud)

要么

k = F*N/Fs  for F = 0Hz ... Fs/2-Fs/N
Run Code Online (Sandbox Code Playgroud)

其中F以Hz为单位的频率N是FFT大小,Fs是采样频率(Hz).有些事情需要注意:

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

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