4、降噪算法(ANC)集成与调优:前馈/反馈/混合ANC原理、滤波器系数设计与导入、ANC自适应算法(LMS/NLMS)集成、啸叫抑制与稳定性调优

各位同学,欢迎来到第四讲。今天聊的是TWS耳机里最硬核的部分——主动降噪(ANC)。说实话,ANC做得好不好,直接决定了用户戴上去的第一感觉。我见过不少方案,参数跑得漂亮,一戴到人耳朵上就翻车。为什么?因为ANC本质上是一个实时反馈控制系统,它跟理论仿真之间,隔着一整个物理世界的误差。

4.1 前馈、反馈与混合ANC:三种架构的取舍

先理清三种基本架构。你想想看,降噪麦克风放在不同位置,效果天差地别。

  • 前馈ANC(Feedforward):麦克风在耳机外侧,拾取环境噪声,传给主控芯片生成反相声波。优点是结构简单,稳定性好。缺点是——它只能降噪,不能补偿耳机本身的频响误差。我在项目里遇到过,前馈ANC对中低频效果不错,但高频一上去就露馅,因为声波路径太短,数字处理跟不上。
  • 反馈ANC(Feedback):麦克风在耳道内侧,靠近扬声器。它监听的是耳朵实际听到的声音,然后闭环修正。好处是能补偿耳机腔体、佩戴泄漏等非线性因素。坏处是容易啸叫。嗯,这里要注意,反馈ANC的增益不能调太高,否则就是自激振荡。
  • 混合ANC(Hybrid):前馈+反馈双麦克风。前馈负责粗降,反馈负责精修。这是目前旗舰TWS的主流方案。我个人习惯用混合ANC,因为它能兼顾带宽和深度。但代价是算法复杂度翻倍,调优工作量也翻倍。

核心观点:选哪种架构,取决于你的目标降噪深度和成本。前馈适合入门级,反馈适合对佩戴一致性要求高的场景,混合ANC是性能天花板。

4.2 滤波器系数设计与导入:从理论到固件

ANC的核心是滤波器。说白了,就是设计一个数字滤波器,让它的幅频响应和相频响应,恰好抵消环境噪声到人耳的传递函数。

设计流程一般是这样的:

  1. 用仿真或实测得到噪声路径的传递函数 H(z)。
  2. 设计逆滤波器 W(z),使得 H(z) * W(z) ≈ 0(在目标频段内)。
  3. 把 W(z) 的系数量化成定点数,导入到DSP或MCU的固件里。

我建议你在设计滤波器时,留出3-5dB的余量。为什么?因为实际生产时,麦克风灵敏度、扬声器阻抗、腔体密封性都有公差。我曾经吃过这个亏——实验室调好的系数,产线上一批耳机全啸叫,最后发现是麦克风灵敏度偏差了2dB。

避坑指南:滤波器系数导入时,注意字节序和位宽。很多工程师在PC上仿真用float,导入到嵌入式平台时忘了转成Q15或Q31格式,结果降噪效果直接归零。我曾经花了两天查这个bug,最后发现是数据类型转换的问题。

4.3 ANC自适应算法(LMS/NLMS)集成

固定滤波器只能应对静态场景。但现实世界是动态的——你走路、坐车、戴耳机松紧不同,噪声路径都在变。这时候就需要自适应算法。

最经典的是LMS(最小均方)和NLMS(归一化最小均方)。

  • LMS:简单粗暴,计算量小。但收敛速度受输入信号功率影响。如果环境噪声突然变大,LMS可能来不及收敛,导致降噪效果瞬间下降。
  • NLMS:在LMS基础上加了归一化因子,把步长跟输入信号功率挂钩。收敛更稳定,但多了一次除法运算。在低算力MCU上,除法可能是个瓶颈。

代码实现上,NLMS的核心就这几行:

// NLMS 单步更新
float mu = 0.01f;  // 步长
float power = 0.0f;
for (int i = 0; i < N; i++) {
    power += x[n - i] * x[n - i];
}
float norm_factor = mu / (power + 1e-6f);  // 加小常数防除零
float error = desired - y;
for (int i = 0; i < N; i++) {
    w[i] += norm_factor * error * x[n - i];
}

嗯,这里要注意。power的计算如果放在中断里,可能会占用太多CPU时间。我建议用滑动平均或者分段计算来优化。

警告:自适应算法在启动阶段容易发散。一定要加初始化保护——先让滤波器运行几十毫秒的固定系数,等误差信号稳定了,再切换到自适应模式。否则一开机就啸叫,用户直接退货。

4.4 啸叫抑制与稳定性调优

啸叫是ANC工程师的噩梦。它本质上是正反馈——扬声器发出的反相声波,又被麦克风拾取,再放大,再发出,循环往复,直到系统饱和。

啸叫的常见原因有三个:

  • 反馈路径增益过高(反馈ANC最常见)
  • 滤波器相位误差累积(前馈ANC常见)
  • 耳机佩戴泄漏导致声学路径突变(混合ANC常见)

怎么抑制?我分享几个实战经验:

  1. 增益限幅:在算法里硬性限制最大增益。比如反馈ANC的环路增益不要超过0.8(归一化值)。
  2. 陷波滤波器:在啸叫频点插入一个窄带陷波器。我习惯在1kHz-3kHz之间预留3-5个可配置的陷波器,产线校准时动态启用。
  3. 自适应陷波:用FFT实时检测频谱峰值,一旦发现某个频点能量异常增长,立即插入陷波。这个方案计算量大,但效果最好。

稳定性调优,说白了就是找平衡点。降噪深度和稳定性是一对矛盾。你越想压噪声,增益就得越高,啸叫风险就越大。我个人习惯的做法是:先以最大稳定性为目标调出一版系数,然后逐步提升增益,每提升1dB就做一次啸叫测试,直到出现临界点,再往回退2dB作为安全余量。

总结一下:ANC调优没有银弹。前馈、反馈、混合各有适用场景。滤波器系数要留余量,自适应算法要防发散,啸叫抑制要软硬结合。我做了这么多年,最大的体会是——耳朵比仪器更敏感。实验室数据再漂亮,不如戴上耳机听30分钟。嗯,今天就到这里,下一章我们聊透传(Transparency)算法的实现与调优。