1. 项目背景与问题定位
杰理芯片作为国产蓝牙音频SoC的主力方案,在TWS耳机、通话设备等领域占据重要市场份额。其SDK中集成的回声消除(AEC)算法是保障语音通话质量的核心模块,但在实际开发中常遇到算法失效的问题。上周调试AC791N开发板时,我就遇到了AEC完全不起作用的状况——通话时对方能听到明显的回声,就像在空旷的会议室里对话一样。
通过示波器抓取MIC和SPK信号发现,回采通道的音频波形与原始信号完全同步,说明硬件链路正常。但查看log发现aec_encoder任务虽然创建成功,却没有进行任何数据处理。这种"静默失效"最让人头疼,因为系统不会报错,但功能就是不工作。
2. 回音算法原理与实现机制
2.1 杰理AEC的工作流程
杰理的AEC采用经典的NLMS(归一化最小均方)算法,其核心是通过自适应滤波器估计回声路径,然后从麦克风信号中减去预测的回声。具体实现涉及三个关键环节:
- 硬件回采:通过ADC通道捕获扬声器输出信号(参考信号)
- 双讲检测:区分用户语音与回声(VAD辅助判断)
- 滤波收敛:动态调整128阶FIR滤波器系数
在AC79系列中,算法以静态库形式提供(libaec.a),通过以下结构体配置参数:
c复制struct aec_s_attr {
u8 EnableBit; // 使能位
u8 output_way; // 回采方式 0-软件 1-硬件
u8 wideband; // 宽带模式
s16 hw_delay_offset;// 硬件延迟补偿
// ...其他算法参数
};
2.2 关键参数解析
-
hw_delay_offset:这个值对消回效果影响最大。它补偿的是DAC输出到ADC回采之间的物理延迟。实测发现:
- 8000Hz采样率建议值75(约9ms延迟)
- 16000Hz采样率建议值50(约3ms延迟)
-
output_way:硬件回采需要配置正确的ADC通道。在AC791N上,LINEIN_ADC_CHANNEL通常用作回采通道,需在channel_bit_map中使能对应BIT位。
