什么是汉明窗口?它有什么作用?

42

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

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

为什么会这样?我在代码中和网上找不到任何原因。


2
仅作为附注:这个版本的Hamming窗口在旁瓣抑制方面比由其系数0.54和0.46定义的原始Hamming窗口略好(参见[wikipedia](http://en.wikipedia.org/wiki/Window_function))。 - Hartmut Pfitzinger
4个回答

56

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

想象一下您想要进行傅里叶变换的信号是一个纯正弦波。在频率域中,您期望只在正弦波频率处有一个尖锐的峰。然而,如果您进行傅里叶变换,您漂亮的尖峰将被类似于下图的东西替换:

Sinc function

为什么会这样呢?真正的正弦波在两个方向上都延伸到无穷远。计算机不能使用无限数量的数据点进行计算,因此所有信号都在两端“截断”。这导致你看到峰值两侧的波动。汉明窗口减少了这种波动,给出了更准确的原始信号的频谱。

更多理论,供有兴趣的人阅读:当您在任何一端截断信号时,您都隐含地将信号乘以一个方形窗口。方形窗口的傅里叶变换是上面的图像,称为sinc函数。无论何时在计算机上进行傅里叶变换,喜欢还是不喜欢,您总是选择某个窗口。方形窗口是隐含的默认选项,但不是一个很好的选择。人们已经想出了各种窗口,具体取决于您要优化的某些特征。汉明窗是其中一个标准窗口。


47
每当你进行有限傅里叶变换时,你都会隐式地将其应用于一个无限重复的信号。因此,例如,如果你的有限采样的开始和结束不匹配,那么这将看起来像信号中的不连续性,并显示为傅里叶变换中的许多高频噪声,这并不是你真正想要的。而且,如果你的采样恰好是一个美丽的正弦波,但整数个周期 恰好不适合于有限采样,则你的傅里叶变换将在与实际频率不相近的各种位置显示出可观测的能量。你不希望有这些情况发生。
通过对数据进行窗口处理,可以确保端点匹配并同时保持一切合理平滑;这大大减少了上一段描述的“谱泄漏”。

14
这不是对问题的回答,因为汉明窗口特别之处在于其并不能使端点完全匹配(只能让端点更接近92%)。其他未在原问题中提到的窗口可以做到。但并不扣分,因为这是一种常见的解释。 - hotpaw2

11

根据我所知道的声音和快速研究,Hamming窗口似乎是为了最小化信号旁瓣(不需要的辐射),从而提高声音的质量或谐波。

我还了解到这种窗函数与DTFT相适配。

如果您准备好数学方面的内容,可以在斯坦福研究员页面维基百科以及Harris的论文中找到一些不错的技术解释。


1
更加准确,因为汉明窗口最小化了第一个(最相邻且最大的)旁瓣,比其他一些窗口更多,但也需要做出其他的权衡。 - hotpaw2

9
一个有限长度的正弦波段的傅里叶变换将窗口的傅里叶变换与正弦波的频率峰值卷积,因为FFT的一个特性是在一个域中的向量乘法在另一个域中是卷积。矩形窗口的傅里叶变换(这就是FFT中任何未经修改的有限样本所暗示的)是一个混乱的Sinc函数,它将不完全周期的任何信号在整个频谱上分散。

Hamming形状窗口的傅里叶变换在卷积后将这种"分散"集中在接近频率峰值的地方(比Sinc函数更靠近),导致一个更胖但更平滑的频率峰值,但远离频率峰值的频率上没有太多分散。这不仅会产生一个更清晰的频谱,而且还会减少来自远处频率对任何感兴趣的信号的干扰。

这种解释(与“无限重复”解释相反)使得不同形状的窗口比汉明窗口在减少“泄漏”方面能够给出更好的结果,特别是,汉明窗口将减小第一个Sinc旁瓣的大小,以换取实际上更多的离所需频率较远的“泄漏”(或卷积散射)。如果您希望进行不同的权衡,其他窗口可能更合适。哈里斯论文(pdf here)提供了这些不同窗口的几个例子。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接