第四章 均衡器(EQ)算法:图形均衡器与参数均衡器、双二阶滤波器实现、动态均衡器
均衡器,说白了就是给声音做「整形手术」的工具。我入行那会儿,第一个独立负责的模块就是EQ。当时觉得不就是调几个旋钮嘛,后来才发现,这里面的门道深着呢。
这一章,咱们聊聊EQ的几种常见形态。图形均衡器、参数均衡器,还有动态均衡器。嗯,双二阶滤波器是它们的共同基础,这个必须吃透。
4.1 图形均衡器 vs 参数均衡器
先说说图形均衡器。你想想看,那种一排推子排开的设备,就是它。每个推子控制一个固定频段的增益。比如31段EQ,从20Hz到20kHz,每个频段中心频率是固定的。
图形均衡器的好处是直观。一眼就能看出当前频响曲线的形状。我在项目中遇到过,现场调音师特别喜欢用这种,因为操作快,推上去拉下来,效果立竿见影。
但它的缺点也很明显:
- 频段固定:你没法精确控制某个特定频率点
- 相邻频段互相影响:推高一个频段,旁边的也会跟着动
- 相位失真较大:尤其是相邻频段增益差异大的时候
参数均衡器就不一样了。它给你三个自由度:
- 中心频率:想调哪里调哪里
- 增益:提升或衰减多少dB
- Q值:影响带宽,也就是这个频点周围多宽的范围会被影响
我个人习惯,做产品开发时首选参数均衡器。因为灵活,而且可以精确补偿扬声器的某个谐振峰。比如某款耳机在8kHz有个5dB的峰,我直接设一个中心频率8kHz、增益-5dB、Q值2.0的陷波器,干净利落。
核心区别一句话总结:图形均衡器是「固定频段、固定Q值」,参数均衡器是「全参数可调」。前者适合快速调整,后者适合精细处理。
4.2 双二阶滤波器实现
不管是图形均衡器还是参数均衡器,底层都是双二阶滤波器。这个结构太重要了,几乎所有音频DSP算法都离不开它。
双二阶滤波器的传递函数长这样:
H(z) = (b0 + b1*z^-1 + b2*z^-2) / (1 + a1*z^-1 + a2*z^-2)
嗯,就是5个系数。b0、b1、b2是前向系数,a1、a2是反馈系数。不同的EQ类型,就是这5个系数不同。
我建议你记住这个直接II型结构,它是工程中最常用的:
// 直接II型双二阶滤波器
float process_biquad(float x) {
float y = b0 * x + b1 * w1 + b2 * w2;
w0 = y - a1 * w1 - a2 * w2;
w2 = w1;
w1 = w0;
return y;
}
这里w1、w2是状态变量。为什么用直接II型?因为它占用的内存少,只需要两个状态变量。我在嵌入式平台上做EQ时,经常要同时跑几十个双二阶,内存省一点是一点。
那怎么计算系数呢?以参数均衡器中的峰值滤波器为例:
// 峰值滤波器系数计算
// fc: 中心频率, fs: 采样率, gain_dB: 增益, Q: 品质因数
float A = pow(10.0, gain_dB / 40.0);
float w0 = 2 * PI * fc / fs;
float alpha = sin(w0) / (2 * Q);
b0 = 1 + alpha * A;
b1 = -2 * cos(w0);
b2 = 1 - alpha * A;
a0 = 1 + alpha / A;
a1 = -2 * cos(w0);
a2 = 1 - alpha / A;
// 归一化
b0 /= a0; b1 /= a0; b2 /= a0;
a1 /= a0; a2 /= a0;
避坑指南:我曾经在计算系数时忘了归一化,结果滤波器输出直接爆了。记住,a0归一化这步不能省。另外,Q值不要设得太高,超过10容易产生数值不稳定。
常见的双二阶EQ类型有:
| 类型 | 用途 | 特点 |
|---|---|---|
| 低通滤波器 | 切除高频噪声 | 让低频通过,高频衰减 |
| 高通滤波器 | 切除低频噪声 | 让高频通过,低频衰减 |
| 带通滤波器 | 提取某个频段 | 只保留中心频率附近 |
| 峰值滤波器 | 提升或衰减某个频点 | 参数均衡器的主力 |
| 陷波滤波器 | 消除特定频率 | 比如消除50Hz工频干扰 |
| 低架/高架滤波器 | 整体调整低频/高频 | 图形均衡器常用 |
4.3 动态均衡器
动态均衡器,说白了就是「会自己变」的EQ。它不是固定增益,而是根据输入信号的强弱自动调整。
为什么需要动态均衡器?你想想看,一个固定EQ,调好了在某个音量下听着不错。但音量一变大,低频可能就轰头了。或者人声一变大,齿音就刺耳了。
动态均衡器的思路是:检测信号能量,当某个频段能量超过阈值时,自动降低增益。这有点像压缩器,但只针对特定频段。
实现上,动态均衡器 = 参数均衡器 + 侧链检测 + 增益控制。流程如下:
- 输入信号分两路:主路和侧链
- 侧链信号经过带通滤波器,提取目标频段
- 计算该频段的RMS或峰值能量
- 与阈值比较,计算增益衰减量
- 用这个衰减量控制主路的EQ增益
我在项目中做过一个动态均衡器,用来抑制某款音箱的低频共振。那个音箱在60Hz附近有个很强的共振峰,小音量时还好,大音量时整个箱体都在抖。用固定EQ压吧,小音量时低频又不够。最后用动态均衡器,只在共振发生时压,效果非常好。
注意:动态均衡器的参数调起来比固定EQ麻烦得多。阈值、启动时间、释放时间、压缩比,每个参数都会影响听感。我建议你先用固定EQ找到问题频段,再转成动态的,这样调试效率高。
动态均衡器的应用场景:
- 防啸叫:检测到某个频段能量突然增大,快速衰减
- 齿音消除:只在高频能量过大时衰减,不影响正常声音
- 低频管理:大音量时自动压低频,保护扬声器
- 人声增强:根据背景噪声动态调整人声频段增益
嗯,这一章的内容就这些。双二阶滤波器是EQ的基石,参数均衡器是精细调音的工具,动态均衡器则是更智能的解决方案。下一章咱们聊聊更高级的算法——动态范围控制,也就是压缩器和限幅器。那个也很有意思。