4、音频均衡器(EQ):图形均衡器、参数均衡器、动态均衡器、均衡器实现技巧

均衡器这东西,说白了就是给声音做「整形手术」。我做了这么多年音频,EQ 是我打交道最多的模块之一。你想想看,一个音箱放在不同的房间里,声音完全不一样。这时候 EQ 就是你的救星。

今天咱们聊聊三种常见的 EQ:图形均衡器、参数均衡器,还有动态均衡器。最后我会分享一些实现技巧,都是我在项目里踩过的坑。

4.1 图形均衡器

图形均衡器,大家应该都见过。就是那种一排推子,从低频到高频排开。每个推子控制一个固定频段。

核心特点:

  • 频段固定,通常是 10 段、15 段或 31 段
  • 每个频段的中心频率和 Q 值都是预设好的
  • 用户只能调节增益
  • 界面直观,一看就懂

我记得有一次做车载音响项目,客户要求加一个 10 段图形 EQ。我一开始觉得很简单,结果发现每个频段之间的交叉干扰特别严重。你推高 1kHz,结果 800Hz 也跟着变了。这就是典型的「频段耦合」问题。

注意:图形 EQ 的频段设计不是随便选的。ISO 标准规定了 1/3 倍频程的中心频率:20、25、31.5、40、50、63、80、100、125、160、200、250、315、400、500、630、800、1k、1.25k、1.6k、2k、2.5k、3.15k、4k、5k、6.3k、8k、10k、12.5k、16k、20k Hz。

实现要点:

  • 每个频段用双二阶滤波器实现
  • 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;
经验之谈:Q 值小于 1 时是宽带宽,适合做整体音色调整。Q 值大于 5 时是窄带宽,适合做陷波,比如去除某个特定的共振频率。我曾经用 Q=10 的窄带滤波器,成功去掉了一个 200Hz 的嗡嗡声,而几乎不影响旁边的声音。

4.3 动态均衡器

动态均衡器,这是 EQ 里的「智能选手」。它结合了压缩器和 EQ 的特点。只有信号达到一定阈值时,EQ 才会起作用。

什么时候用动态 EQ?

  • 人声的齿音处理:只在齿音出现时衰减 8kHz
  • 贝斯的低频控制:只在低频过重时压缩
  • 吉他扫弦的刺耳感:只在高频能量过大时衰减

我记得有一次做现场调音,歌手一唱高音,话筒就啸叫。用普通 EQ 衰减那个频率,低音部分又变得很闷。后来我用了动态 EQ,只在歌手唱高音时衰减那个频点,问题完美解决。

动态 EQ 的实现流程:

  1. 信号经过一个带通滤波器,提取目标频段
  2. 检测该频段的能量(RMS 或峰值)
  3. 与阈值比较,计算增益变化量
  4. 用这个增益去控制 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 参数,系数会跳变,产生「咔哒」声。我建议做系数渐变,或者用交叉淡入淡出。

避坑指南:我曾经在某个产品里直接更新系数,结果每次切换预设都「啪」一声。后来加了一个 10ms 的线性渐变,问题就解决了。渐变时间别太长,否则会感觉反应迟钝。

技巧三:定点数实现的注意事项

如果你在嵌入式平台上用定点数,注意系数的动态范围。双二阶滤波器的系数可能远小于 1,也可能远大于 1。我习惯用 Q1.31 格式,然后做 64 位累加,最后再截断。

技巧四:级联滤波器的顺序

多个 EQ 频段级联时,顺序会影响最终效果。我一般把低频段放在前面,高频段放在后面。这样低频的大信号不会让高频滤波器饱和。

我的调试流程:

  1. 先用正弦波扫频,确认每个频段的位置和增益
  2. 用白噪声测试,看频谱响应是否平滑
  3. 最后用真实音乐信号听感验证

别跳过第二步。我见过有人只用人耳听,结果某个频段有 3dB 的隆起都没发现。

技巧五:低功耗优化

嵌入式设备上,EQ 计算量不小。如果只是做简单的音色调整,可以考虑用 IIR 滤波器代替双二阶。IIR 的计算量只有双二阶的一半,但精度稍差。

嗯,关于 EQ 的内容就这些。图形 EQ 适合用户交互,参数 EQ 适合专业调音,动态 EQ 适合智能处理。实现时注意拓扑选择、防爆音、定点数精度,基本就不会出大问题。