AEC 回声消除实战:从理论到手机端验证的完整记录【APP-JNI-AP-ADSP】
本文基于 某PAD 项目 003-aec 实验,记录了在手机 VOIP 场景下使用 NLMS 自适应滤波器实现回声消除的全过程。
目录
- 什么是回声消除(AEC)
- 实验总揽
- VOIP链路重构
- AEC 核心算法详解
- 系统架构:从 App 到驱动
- ERLE —— 回声消除效果的度量标尺
- 实验结果分析
- 实战中的坑与解决方案
- 总结与展望
1. 什么是回声消除(AEC)
1.1 从一个生活场景说起
你一定经历过这个场景:打电话时,对方在听你说话的同时,手机扬声器正在播放你的声音——如果这些声音被麦克风重新采集并传回去,对方就会听到"回声"。这就是声学回声(Acoustic Echo)。
AEC(Acoustic Echo Cancellation)的目标就是:从麦克风采集的信号中,精确地估计并减去扬声器播放的信号分量,只保留近端(用户真正想说的话)。
1.2 数学定义
设麦克风采集到的信号为:
d ( n ) = s ( n ) + y ( n ) d(n) = s(n) + y(n)d(n)=s(n)+y(n)
其中:
- s ( n ) s(n)s(n)—— 近端语音(我们想要的)
- y ( n ) y(n)y(n)—— 回声分量(扬声器 → 麦克风路径的回放)
回声信号可以表示为远端参考信号x ( n ) x(n)x(n)经过房间冲激响应h ( n ) h(n)h(n)的卷积:
y ( n ) = ∑ k = 0 L − 1 h ( k ) ⋅ x ( n − k ) y(n) = \sum_{k=0}^{L-1} h(k) \cdot x(n-k)y(n)=k=0∑L−1h(k)⋅x(n−k)
AEC 的核心任务就是估计h ^ ( n ) \hat{h}(n)h^(n),从而得到估计回声:
y ^ ( n ) = ∑ k = 0 L − 1 h ^ ( k ) ⋅ x ( n − k ) \hat{y}(n) = \sum_{k=0}^{L-1} \hat{h}(k) \cdot x(n-k)y^(n)=k=0∑L−1h^(k)⋅x(n−<