什么是汉明窗口?

时间:2011-03-24 12:17:48

标签: signal-processing window-functions

我正在使用一些执行傅里叶变换的代码(计算音频样本的倒谱)。在计算傅里叶变换之前,它会对样本应用汉明窗口:

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]);
}

为什么这样做?我找不到任何理由在代码中或在线上执行此操作。

4 个答案:

答案 0 :(得分:39)

每当你进行有限傅里叶变换时,你就会隐含地将它应用于无限重复的信号。因此,例如,如果有限样本的开始和结束不匹配,那么看起来就像信号中的不连续性,并且在傅立叶变换中显示为大量高频无意义,而您不会真的很想要。如果你的样本碰巧是一个漂亮的正弦曲线,但整数个周期并不恰好适合有限样本,那么你的FT将在各种不太接近实际频率的地方显示出可观的能量。你不需要任何这些。

对数据进行窗口化可确保两端匹配,同时保持一切顺利;这大大减少了前一段中描述的“频谱泄漏”。

答案 1 :(得分:36)

这是一个老问题,但我认为答案可以改进。

想象一下,你想要傅里叶变换的信号是一个纯粹的正弦波。在频域中,您可以预期它仅在正弦频率处具有尖峰。但是如果你采用了傅立叶变换,你的漂亮的尖峰将被这样的东西取代:

Sinc function

为什么?真正的正弦波在两个方向上都延伸到无穷大。计算机无法使用无限数量的数据点进行计算,因此所有信号都在两端“切断”。这会导致您看到峰值两侧的纹波。汉明窗减少了这种纹波,让您更准确地了解原始信号的频谱。

更多理论,对于感兴趣的人:当你在两端切断信号时,你隐含地将信号乘以方形窗口。方形窗口的傅立叶变换是上面的图像,称为sinc函数。无论何时在计算机上进行傅里叶变换,无论喜欢与否,您总是选择某些窗口。方形窗口是隐式默认值,但不是一个很好的选择。人们已经提出了各种各样的窗口,具体取决于您想要优化的特定特征。汉明窗是标准窗之一。

答案 2 :(得分:11)

根据我对声音和快速研究的了解,看起来Hamming Window可以最大限度地减少信号旁瓣(不需要的辐射)。从而改善声音的质量或谐波。 我也理解这种类型的window function适合DTFT。

如果你准备好数学,你会在stanford researcher pagewikipedia以及Harris的论文中找到一些很好的技术说明:D。

答案 3 :(得分:9)

正弦曲线的有限长度段的FT将窗口的傅里叶变换与正弦波的频率峰值进行卷积,因为FFT的特性是一个域中的向量乘法是另一个域中的卷积。矩形窗口的FT(这是FFT中任何未经修改的有限长度的样本)都是看起来很乱的Sinc函数,它会在整个频谱上溅出窗口中不完全周期性的任何信号。

汉明形状窗口的FT将这种“飞溅”集中在卷积后的频率峰值(比Sinc函数)更近,导致更频繁但更平滑的频率峰值,但在远离频率的频率上飞溅更少频率峰值。这不仅可以获得更清晰的频谱,而且可以减少远距离频率对任何感兴趣信号的干扰。

这种解释(与“无限重复”的解释相反)使得更清楚为什么不同形状的窗户比汉明可以给你更好的结果,甚至更少的“泄漏”。特别是,汉明窗口将减小频率峰值旁边的“泄漏”的第一个Sinc旁瓣的大小,以换取实际上更远离感兴趣的频率的“泄漏”(或卷积飞溅)。如果您希望进行不同的权衡,其他窗口可能更合适。在上面另一个答案中链接的哈里斯论文(pdf here)给出了这些不同窗口的几个例子。