我想知道确定声音中给定频率幅度的最简单/最佳方法是什么。
据我所知,FFT函数将返回信号中所有频率的大小。我想知道如果我只关心特定频率,是否有任何捷径可以使用。
我将使用iPhone麦克风录制音频。我的猜测是我将使用音频队列服务进行录制,因为我不需要将音频录制到文件中。我正在使用SDK 4.0,因此如果需要,我可以使用Accelerate框架中定义的任何函数(例如FFT函数)。
更新 根据康拉德的建议,我更新了这个问题。
答案 0 :(得分:13)
如果您只需测试一个频率,则只需计算DFT的对应点即可。 DFT算法是O(N ^ 2),但FFT算法重用中间结果以实现用于DFT计算的O(NlogN)。但是,如果只需要一个频率样本,则只需计算DFT的一个输出样本并获得O(N)性能。
这可以通过查看wikipedia page上的DFT的等式来完成(我甚至不打算在这里尝试输入)并且仅计算与感兴趣的频率相对应的单个k的Xk 。 k只是DFT输出的索引。
将k(DFT输出的索引)映射到实际频率(Hz)取决于两件事:
实际频率映射到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)。有些事情需要注意:
为了简单起见,我遗漏了其他一些细节,这对您的应用程序无关紧要