语音信号处理实战:为什么汉宁窗(Hanning)比矩形窗更适合STFT?
如果你曾经用Python的librosa或者scipy.signal做过语音信号的短时傅里叶变换(STFT),大概率会接触到“窗函数”这个概念。默认情况下,很多库会使用汉宁窗(Hanning Window),而你可能也试过换成矩形窗(Rectangular Window),结果发现频谱图看起来“不对劲”——要么是频率成分糊成一团,要么是出现了很多原本不存在的虚假频率。这背后的原因,正是窗函数在时频分析中扮演的关键角色。
对于语音识别、音频处理或音乐信息检索的开发者来说,理解窗函数的选择不是纸上谈兵的数学游戏,而是直接影响模型特征质量、算法鲁棒性的工程决策。一个简单的窗函数切换,可能让你的梅尔频谱特征更清晰,也可能让后续的端点检测或音高追踪算法误判连连。今天,我们就抛开复杂的公式推导,直接从工程实践的角度,深入探讨为什么在绝大多数STFT应用中,平滑渐变的汉宁窗会完胜简单粗暴的矩形窗。我们会用实际的Python代码对比两者的频谱,并分享一些在真实项目中关于窗长、帧移选择的“踩坑”经验。
1. 窗函数:STFT中不可忽视的“裁剪”艺术
在深入对比之前,我们得先统一认识:短时傅里叶变换的本质是什么? 语音信号是非平稳的,它的统计特性随时间变化。但幸运的是,在10~30毫秒这样的短时范围内,我们可以近似认为信号是平稳的。STFT就是基于这个假设,用一个滑动窗口截取一小段信号,对每一段分别做傅里叶变换,从而得到信号频率成分随时间变化的图谱。
这里的关键在于“截取”。当你用一个窗口去截取无限长的连续信号时,你实际上是在做两件事:
- 时域相乘:信号乘以一个有限长的窗函数。
- 频域卷积:根据卷积定理,时域相乘等价于频域中信号的真实频谱与窗函数频谱的卷积。
这个卷积操作,就是一切差异的根源。窗函数的频谱特性,直接决定了我们最终看到的频谱图的“清晰度”和“保真度”。
提示:你可以把STFT中的加窗,想象成透过一扇形状特定的窗户观察外面的风景。矩形窗就像一扇方方正正、边缘锐利的窗户,而汉宁窗则像一扇边缘柔和、逐渐变暗的窗户。前者能让你看到更清晰的中心视野(高频分辨率),但窗户边缘的锐利框线(频谱泄漏)会严重干扰你对窗外景物边缘的判断。
1.1 矩形窗:一把锋利的双刃剑
矩形窗是最简单的窗函数,它在窗口长度内权重为1,窗口外瞬间跳变为0。它的定义简单到无需公式:
import numpy as np
def rectangular_window(window_len):
return np.ones(window_len)
矩形窗的核心优势在于其频域主瓣最窄。 这意味着在频谱分析中,它理论上能提供最高的频率分辨率,能够更好地区分两个频率非常接近的信号成分。在雷达信号处理(如SAR)等对分辨率要求极高的领域,矩形窗或其变体有时会被谨慎使用。
然而,它的致命缺陷在于旁瓣衰减太慢,且旁瓣电平很高。下表对比了矩形窗和几种常见窗函数的典型性能指标:
| 窗函数类型 | 主瓣宽度 (相对值) | 最高旁瓣电平 (dB) | 旁瓣衰减速率 (dB/octave) | 适用场景 |
|---|---|---|---|---|
| 矩形窗 | 1.0 (最窄) | -13 | -6 | 理论分析,对分辨率要求极高且可容忍泄漏的场景 |
| 汉宁窗 | 1.5 |
8223



被折叠的 条评论
为什么被折叠?



