我正在使用一些执行傅里叶变换的代码(以计算音频样本的倒谱)。在计算傅里叶变换之前,它会对样本应用汉明窗:
for(int i = 0; i < SEGMENTATION_LENGTH;i++){
timeDomain[i] = (float) (( 0.53836 - ( 0.46164 * Math.cos( TWOPI * (double)i / (double)( SEGMENTATION_LENGTH - 1 ) ) ) ) * frameBuffer[i]);
}
它为什么要这样做?我找不到任何理由在代码中或在线执行此操作。
这是一个老问题,但我认为答案可以改进。
想象一下要进行傅里叶变换的信号是纯正弦波。在频域中,您会期望它仅在正弦频率处出现尖锐尖峰。然而,如果你采用傅里叶变换,你漂亮的尖锐尖峰将被这样的东西取代:
这是为什么?真正的正弦波在两个方向上延伸至无穷大。计算机无法对无限数量的数据点进行计算,因此所有信号在两端都会被“切断”。这会导致您看到的峰值两侧出现波纹。汉明窗减少了这种纹波,让您更准确地了解原始信号的频谱。
对于感兴趣的人来说,更多理论是:当您在两端切断信号时,您就隐式地将信号乘以方形窗口。方形窗口的傅立叶变换如上图所示,称为 sinc 函数。每当你在计算机上进行傅里叶变换时,无论你喜欢与否,你总是会选择some窗户。方形窗口是隐式默认值,但不是一个很好的选择。人们已经提出了多种窗口,具体取决于您想要优化的某些特征。汉明窗是标准窗之一。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)