我正在使用一个我在网上找到的很好的FFT库来尝试编写一个音高检测程序。目前为止,我已经成功地让库对包含几个正弦波(其中一个频率为440Hz)的测试音频信号进行FFT计算(我将采样大小设置为16384,采样率设置为44100Hz)。
FFT输出如下:
正如您所见,441.431Hz和438.739Hz的频率均显示出同等高的幅度输出(“MAG:”后面的最右侧数字),因此很明显目标频率440Hz介于两者之间。增加分辨率可能是一种逼近的方法,但这会增加计算时间。
FFT输出如下:
433.356Hz - Real: 590.644 - Imag: -27.9856 - MAG: 16529.5
436.047Hz - Real: 683.921 - Imag: 51.2798 - MAG: 35071.4
438.739Hz - Real: 4615.24 - Imag: 1170.8 - MAG: 5.40352e+006
441.431Hz - Real: -3861.97 - Imag: 2111.13 - MAG: 8.15315e+006
444.122Hz - Real: -653.75 - Imag: 341.107 - MAG: 222999
446.814Hz - Real: -564.629 - Imag: 186.592 - MAG: 105355
正如您所见,441.431Hz和438.739Hz的频率均显示出同等高的幅度输出(“MAG:”后面的最右侧数字),因此很明显目标频率440Hz介于两者之间。增加分辨率可能是一种逼近的方法,但这会增加计算时间。
我该如何计算介于两个频率区间之间的确切频率?
更新:
我尝试了DSPGuru网站上讨论的{{link1:Barry Quinn的“第二估计器”}},并取得了很好的结果。以下是440Hz方波的结果 - 现在只有0.003Hz的偏差!
这是我使用的代码。我只是改编了我找到的这个例子,它是为Swift准备的。谢谢大家提供宝贵的意见,这是一次很棒的学习之旅 :)