一、 AEC:回声消除(AEC - Acoustic Echo Cancellation)
AEC 的核心任务是从麦克风采集到的信号中,剔除掉由扬声器播放出来、经过空间反射再次进入麦克风的声音。
1. 工作原理
AEC 本质上是一个自适应滤波器。它获取远端参考信号(即扬声器播放的声音),模拟出声音在房间内的反射路径,生成一个“估计回声”,然后从麦克风信号中减去它。
• 线性滤波 (Adaptive Filter): 通常使用 NLMS(归一化最小均方)算法,在嵌入式中需权衡收敛速度与计算量。
• 非线性处理 (NLP): 针对线性滤波器无法消除残留回声(如外壳共振、非线性失真),进行进一步的抑制。
• 双讲检测 (DTD): 识别近端是否有人说话。如果近端和远端同时说话,AEC 必须小心处理,否则会把近端人声也误杀掉。
2. 实战难点:时间对齐
在嵌入式系统中,扬声器播放参考信号到麦克风采集回声之间存在系统延迟(Latency)。如果参考信号和麦克风信号在时间轴上没有对齐,AEC 的滤波器永远无法收敛。
• 技巧: 必须准确测量音频驱动缓冲区(Buffer)的延迟,通过环回测试(Loopback)确定对齐偏移量值。
二、 AGC:自动增益控制(AGC - Automatic Gain Control)
AGC 的目标是无论说话人距离麦克风远近,最终输出的音量都能保持在一个预设的理想水平。
1. 核心链路
• 电平估算 (Level Estimation): 计算当前帧的能量(RMS 或峰值)。
• 增益计算: * Attack Time (启动时间): 当音量突然变大,增益下降的速度。
• Release Time (释放时间): 当音量变小,增益回升的速度。
• 限幅器 (Limiter): 确保增益调整后不会产生“爆音(Clipping)”。
2. 实战建议
• 软硬结合: 如果可能,优先调节硬件模拟增益(Analog Gain),因为单纯提升数字增益会放大底层底噪(Floor Noise)。
• 防误触发: 配合噪声抑制(NS)模块使用,防止在安静环境下过度放大环境噪声(产生刺耳的“嘶嘶”声)。
三、 嵌入式实战部署建议
1. 算法执行顺序(Processing Chain)
音频处理链的顺序至关重要,错误的顺序会导致算法失效:
1. AEC (回声消除): 必须排在第一位,因为 AEC 需要最原始、无非线性变换的信号。
2. NS (降噪): 消除环境底噪。
3. AGC (自动增益): 最后进行动态范围调整。
2. 算力优化
• 定点化处理: 如果你的 MCU 没有强劲的 FPU(浮点运算单元),请务必使用 Fixed-point 算法库(如 ARM CMSIS-DSP)。
• 开源库推荐:
• WebRTC AEC/AEC3: 工业界标杆,效果极佳但吃资源,适合带 Linux 的 SoC。
• SpeexDSP: 经典、轻量,非常适合 Cortex-M 系列。
• RNNoise: 结合深度学习的轻量化降噪,对静态噪声效果拔群。
3. 常见坑点
• 采样率不匹配: 参考信号和采集信号采样率必须一致,否则频率偏移会导致 AEC 瞬间崩溃。
• 非线性失真: 如果你的小喇叭震动导致外壳共振,AEC 效果会大打折扣。这时候加一块减震胶垫比调代码更管用。

