我想知道确定声音中给定频率幅度的最简单/最好的方法是什么。
据我了解,FFT 函数将返回信号中所有频率的幅度。如果我只关心特定频率,我想知道是否有任何捷径可以使用。
我将使用 iPhone 麦克风录制音频。我的猜测是我将使用音频队列服务进行录制,因为我不需要将音频录制到文件中。我正在使用 SDK 4.0,因此如果需要,我可以使用 Accelerate 框架中定义的任何函数(例如 FFT 函数)。
更新: 根据康拉德的建议,我将问题更新为更清楚。
如果您只需要测试一个频率,您可以计算DFT的对应点。DFT算法是O(N^2),但是FFT算法重用中间结果来实现O(NlogN)的DFT计算。但是,如果您只想要一个频率样本,您可以只计算 DFT 的一个输出样本并实现 O(N) 性能。
这可以通过查看维基百科页面上的 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)。需要注意的一些事项:
为简单起见,我省略了很多其他细节,这些细节对您的应用程序无关紧要