4、音频均衡器(EQ):图形均衡器、参数均衡器、动态均衡器、均衡器实现技巧
均衡器这东西,说白了就是给声音做「整形手术」。我做了这么多年音频,EQ 是我打交道最多的模块之一。你想想看,一个音箱放在不同的房间里,声音完全不一样。这时候 EQ 就是你的救星。
今天咱们聊聊三种常见的 EQ:图形均衡器、参数均衡器,还有动态均衡器。最后我会分享一些实现技巧,都是我在项目里踩过的坑。
4.1 图形均衡器
图形均衡器,大家应该都见过。就是那种一排推子,从低频到高频排开。每个推子控制一个固定频段。
核心特点:
- 频段固定,通常是 10 段、15 段或 31 段
- 每个频段的中心频率和 Q 值都是预设好的
- 用户只能调节增益
- 界面直观,一看就懂
我记得有一次做车载音响项目,客户要求加一个 10 段图形 EQ。我一开始觉得很简单,结果发现每个频段之间的交叉干扰特别严重。你推高 1kHz,结果 800Hz 也跟着变了。这就是典型的「频段耦合」问题。
实现要点:
- 每个频段用双二阶滤波器实现
- Q 值通常取 1.41(倍频程带宽)或 4.32(1/3 倍频程)
- 增益范围建议 ±12dB,太大会引入失真
4.2 参数均衡器
参数均衡器就灵活多了。你可以自由调节三个参数:中心频率、增益、Q 值。专业调音师最爱用这个。
三个核心参数:
| 参数 | 说明 | 典型范围 |
|---|---|---|
| 中心频率 (f₀) | 你要处理的频率点 | 20Hz ~ 20kHz |
| 增益 (G) | 提升或衰减的量 | -12dB ~ +12dB |
| Q 值 | 带宽的宽窄,Q 越大带宽越窄 | 0.1 ~ 20 |
我个人的习惯是,做参数 EQ 时先调频率,再调增益,最后调 Q 值。为什么?因为频率决定了你要打哪个点,增益决定了打多重,Q 值决定了影响范围。这个顺序最不容易出错。
双二阶滤波器公式:
// 参数 EQ 的双二阶系数计算
// fs: 采样率, f0: 中心频率, G: 增益(dB), Q: 品质因数
double A = pow(10, G / 40); // 线性增益
double w0 = 2 * PI * f0 / fs;
double alpha = sin(w0) / (2 * Q);
// 峰值滤波系数
double b0 = 1 + alpha * A;
double b1 = -2 * cos(w0);
double b2 = 1 - alpha * A;
double a0 = 1 + alpha / A;
double a1 = -2 * cos(w0);
double a2 = 1 - alpha / A;
// 归一化
b0 /= a0; b1 /= a0; b2 /= a0;
a1 /= a0; a2 /= a0;
4.3 动态均衡器
动态均衡器,这是 EQ 里的「智能选手」。它结合了压缩器和 EQ 的特点。只有信号达到一定阈值时,EQ 才会起作用。
什么时候用动态 EQ?
- 人声的齿音处理:只在齿音出现时衰减 8kHz
- 贝斯的低频控制:只在低频过重时压缩
- 吉他扫弦的刺耳感:只在高频能量过大时衰减
我记得有一次做现场调音,歌手一唱高音,话筒就啸叫。用普通 EQ 衰减那个频率,低音部分又变得很闷。后来我用了动态 EQ,只在歌手唱高音时衰减那个频点,问题完美解决。
动态 EQ 的实现流程:
- 信号经过一个带通滤波器,提取目标频段
- 检测该频段的能量(RMS 或峰值)
- 与阈值比较,计算增益变化量
- 用这个增益去控制 EQ 的增益参数
关键参数:
- 阈值 (Threshold):-60dB ~ 0dB
- 启动时间 (Attack):1ms ~ 100ms
- 释放时间 (Release):10ms ~ 1000ms
- 压缩比 (Ratio):1:1 ~ 20:1
4.4 均衡器实现技巧
做 EQ 实现,光会算系数是不够的。这里分享几个我踩过的坑。
技巧一:滤波器拓扑选择
双二阶滤波器有三种常见拓扑:直接 I 型、直接 II 型、转置直接 II 型。我推荐用转置直接 II 型,它对定点数实现的误差累积最小。
// 转置直接 II 型实现
typedef struct {
float b0, b1, b2;
float a1, a2;
float w1, w2; // 状态变量
} Biquad;
float process_biquad(Biquad *f, float x) {
float y = f->b0 * x + f->w1;
f->w1 = f->b1 * x - f->a1 * y + f->w2;
f->w2 = f->b2 * x - f->a2 * y;
return y;
}
技巧二:系数更新时的防爆音
你在运行时突然改变 EQ 参数,系数会跳变,产生「咔哒」声。我建议做系数渐变,或者用交叉淡入淡出。
技巧三:定点数实现的注意事项
如果你在嵌入式平台上用定点数,注意系数的动态范围。双二阶滤波器的系数可能远小于 1,也可能远大于 1。我习惯用 Q1.31 格式,然后做 64 位累加,最后再截断。
技巧四:级联滤波器的顺序
多个 EQ 频段级联时,顺序会影响最终效果。我一般把低频段放在前面,高频段放在后面。这样低频的大信号不会让高频滤波器饱和。
我的调试流程:
- 先用正弦波扫频,确认每个频段的位置和增益
- 用白噪声测试,看频谱响应是否平滑
- 最后用真实音乐信号听感验证
别跳过第二步。我见过有人只用人耳听,结果某个频段有 3dB 的隆起都没发现。
技巧五:低功耗优化
嵌入式设备上,EQ 计算量不小。如果只是做简单的音色调整,可以考虑用 IIR 滤波器代替双二阶。IIR 的计算量只有双二阶的一半,但精度稍差。
嗯,关于 EQ 的内容就这些。图形 EQ 适合用户交互,参数 EQ 适合专业调音,动态 EQ 适合智能处理。实现时注意拓扑选择、防爆音、定点数精度,基本就不会出大问题。