第四章 均衡器(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,调好了在某个音量下听着不错。但音量一变大,低频可能就轰头了。或者人声一变大,齿音就刺耳了。

动态均衡器的思路是:检测信号能量,当某个频段能量超过阈值时,自动降低增益。这有点像压缩器,但只针对特定频段。

实现上,动态均衡器 = 参数均衡器 + 侧链检测 + 增益控制。流程如下:

  1. 输入信号分两路:主路和侧链
  2. 侧链信号经过带通滤波器,提取目标频段
  3. 计算该频段的RMS或峰值能量
  4. 与阈值比较,计算增益衰减量
  5. 用这个衰减量控制主路的EQ增益

我在项目中做过一个动态均衡器,用来抑制某款音箱的低频共振。那个音箱在60Hz附近有个很强的共振峰,小音量时还好,大音量时整个箱体都在抖。用固定EQ压吧,小音量时低频又不够。最后用动态均衡器,只在共振发生时压,效果非常好。

注意:动态均衡器的参数调起来比固定EQ麻烦得多。阈值、启动时间、释放时间、压缩比,每个参数都会影响听感。我建议你先用固定EQ找到问题频段,再转成动态的,这样调试效率高。

动态均衡器的应用场景:

  • 防啸叫:检测到某个频段能量突然增大,快速衰减
  • 齿音消除:只在高频能量过大时衰减,不影响正常声音
  • 低频管理:大音量时自动压低频,保护扬声器
  • 人声增强:根据背景噪声动态调整人声频段增益

嗯,这一章的内容就这些。双二阶滤波器是EQ的基石,参数均衡器是精细调音的工具,动态均衡器则是更智能的解决方案。下一章咱们聊聊更高级的算法——动态范围控制,也就是压缩器和限幅器。那个也很有意思。