37

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

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

4 回答 4

50

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

想象一下你想要傅里叶变换的信号是一个纯正弦波。在频域中,您会期望它仅在正弦频率处具有尖锐的尖峰。但是,如果您进行傅立叶变换,您漂亮的尖峰将被以下内容取代:

正弦函数

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

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

于 2014-02-08T02:32:34.143 回答
42

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

对数据进行窗口化可以确保结果匹配,同时保持一切都相当顺利;这大大减少了上一段中描述的那种“频谱泄漏”。

于 2011-03-24T12:33:13.177 回答
11

根据我对声音和快速研究的了解,汉明窗似乎可以最大限度地减少信号旁瓣(不需要的辐射)。从而改善声音的质量或谐波。我也理解这种类型的窗口函数非常适合 DTFT。

如果您准备好学习数学,您将在斯坦福研究人员页面维基百科以及哈里斯的论文中找到一些很好的技术解释:D。

于 2011-03-24T12:36:59.777 回答
9

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

汉明形窗口的 F​​T 将这种“飞溅”集中在卷积之后更接近频率峰值(比 Sinc 函数),从而产生更宽但更平滑的频率峰值,但远离频率峰值的频率上的飞溅要少得多。这不仅可以使频谱看起来更清晰,而且可以减少来自远处频率对任何感兴趣信号的干扰。

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

于 2011-03-24T14:10:16.927 回答