如何使用FFT获得频率?什么是正确的程序和代码?
答案 0 :(得分:4)
音高检测通常涉及测量功率谱中的谐波之间的间隔。通过取前N / 2个区间的大小(sqrt(re ^ 2 + im ^ 2))从FFT获得功率谱。然而,有更复杂的音调检测技术,例如cepstral analysis,其中我们采用功率谱的对数的FFT,以便识别谱峰中的周期性。
答案 1 :(得分:2)
乐器的持续音符是周期性信号,我们的朋友傅立叶(“FFT”中的第二个“F”)告诉我们任何周期性信号都可以通过添加一组正弦波来构造(通常具有不同的幅度,频率和相位)。 基波是最低频率分量,它对应于音调;其余的组件是泛音,是基频的倍数。它是基本和泛音的相对混合,决定了音色或乐器的特征。单簧管和小号一致播放声音“调和”,因为它们具有相同的基频,但是,由于它们的音色不同(泛音混合),它们可以单独识别。
对于您的问题,您可以在一个时间窗口上对小号进行采样,计算FFT(将样本序列分解为其组成的数字频率),然后断言音高是具有最大幅度的bin的频率。如果你愿意,可以将其简单地量化到最近的音乐半步,就像E flat一样。 (如果您不了解采样频率与结果频率箱之间的关系,或者您不理解采样频率过低的不利因素,请在Wikipedia上查找FFT。)这可能会满足您的需求,因为基本原理组件通常比任何其他组件具有更大的能量。窗口越长,音调精度越高,因为音箱中心的频率间隔越来越紧密。但是,如果窗口太长以至于喇叭在窗口持续时间内明显改变其间距,那么该技术的有效性将大大降低。
答案 2 :(得分:0)
Here是一篇关于估算PSD(功率谱密度)的非参数技术的简短博客文章,以及一些更详细的链接。这可能会让你开始估算PSD - 然后找到音高。
答案 3 :(得分:0)
DansTuner是我解决此问题的开源项目。我其实是trumpet player。它的音调检测代码取自Audacity。
答案 4 :(得分:0)
我将这个org.apache.commons.math.transform.FastFourierTransforme包添加到项目中并且它的工作完美