我正在尝试创建一个音高检测程序,该程序提取从 FFT ( fftpack
) 获得的功率谱中的峰值频率。我正在使用Quinn 的 First Estimator从频谱中提取峰值频率,以在 bin 编号之间进行插值。该方案似乎在某些条件下运行良好。例如,使用窗口大小为 1024,采样率为 16000 的矩形窗口函数,我的算法正确识别出纯 A440 音调的频率为 440.06,第二部分频率为 880.1。但是,在其他条件下,它会产生不准确的结果。如果我更改采样率(例如到 8000)或窗口大小(例如到 2048),它仍然正确地将第一个分音识别为 440,但第二个分音在 892 左右。对于像那些不和谐的音调,问题变得更糟由吉他或钢琴产生。
我的一般问题是:采样率、窗口大小和窗口函数以什么方式影响 FFT 峰值的频率估计?我的假设是简单地增加频谱的分辨率会增加峰值频率估计的准确性,但这显然不是我的经验(零填充也无济于事)。我还假设窗口函数的选择不会产生太大影响,因为频谱泄漏不应该改变峰值位置(尽管现在我考虑了一下,如果相邻的 bin 的幅度,频谱泄漏可能会影响插值频率估计峰是通过其他峰的泄漏人为增加的……)。
有什么想法吗?