信号加窗:从‘频谱拖尾’到‘清晰频谱’,一个音频工程师的调试笔记
1. 当音符在频谱中“打架”:音频工程师的真实困境
凌晨三点的录音棚里,我盯着屏幕上那团模糊的频谱图发呆。这是一段钢琴与小提琴的二重奏录音,理论上应该能清晰分离出C4(261.63Hz)和E4(329.63Hz)两个基频。但实际FFT结果却像一杯被搅拌过的鸡尾酒——频率成分相互渗透,在268Hz附近形成诡异的能量堆积。
这种场景对音频处理工程师来说再熟悉不过。我们常用**短时傅里叶变换(STFT)**分析非稳态信号,但原始FFT就像用矩形框粗暴截取声波片段,相当于在时域乘以一个"矩形窗"。这会导致两个典型问题:
频谱泄漏:能量扩散到相邻频段,就像拍照时手抖产生的重影
频率分辨率不足:相邻音符的频谱峰相互重叠,形成"驼峰效应"
专业录音棚的调试日志显示,未加窗处理的和弦分析误差率高达37%,而合理加窗后可降至8%以下
下表对比了三种常见乐器在矩形窗下的频谱表现:
乐器
理论基频(Hz)
实测峰值频率(Hz)
频率偏移量(Hz)
钢琴C4
261.63
263.21
+1.58
小提琴E4
329.63
326.74
-2.89
吉他G3
196.00
198.33
+2.33
2. 窗函数:给声波戴上合适的“眼镜”
选择窗函数就像配眼镜——不同度数适合不同场景。在音频工程中,我们主要考量三个核心参数:
主瓣宽度:决定频率分辨率,越窄越能区分相邻音符
旁瓣衰减:抑制频谱泄漏的能力,衰减越快越好
滚降率:从主瓣到旁瓣的过渡陡峭程度
**汉宁窗(Hanning)**是音乐分析中的"万金油"。它的时域表达式为:
PYTHON
复制
1
def hanning_window(N):
2
n = np.arange(N)
3
return 0.5 * (1 -