9.16. AEC回声消除算法

概述

提供回声消除算法的配置和使用说明

9.16.1. 使用说明

进入相应的工程 /include/app_config.h ,开启宏 CONFIG_AEC_ENC_ENABLE,在请求编码服务时 AUDIO_ENC_OPEN 增加以下代码

struct aec_s_attr aec_param = {0};

req.enc.aec_attr = &aec_param;
req.enc.aec_enable = 1;

extern void get_cfg_file_aec_config(struct aec_s_attr * aec_param);
get_cfg_file_aec_config(&aec_param);

#if 0
    aec_param.ANS_NoiseLevel =      2.2e3f; //初始噪声水平,用来加速降噪收敛,跟 mic 信号的信噪比有关。 Mic 信号信噪比高, 该值可以小一点, 反之则需要稍微大一点。default: 2.2e3f(0 ~ 32767)
#endif

if (aec_param.EnableBit == 0) {
    req.enc.aec_enable = 0;
    req.enc.aec_attr = NULL;
}

#if defined CONFIG_ALL_ADC_CHANNEL_OPEN_ENABLE && defined CONFIG_AISP_LINEIN_ADC_CHANNEL && defined CONFIG_AEC_LINEIN_CHANNEL_ENABLE
if (req.enc.aec_enable) {
    aec_param.output_way = 1;               //1:使用硬件回采 0:使用软件回采
    if (aec_param.output_way) {
        req.enc.channel_bit_map |= BIT(CONFIG_AISP_LINEIN_ADC_CHANNEL);             //配置回采硬件通道
        if (CONFIG_AISP_LINEIN_ADC_CHANNEL < CONFIG_PHONE_CALL_ADC_CHANNEL) {
            req.enc.ch_data_exchange = 1;     //如果回采通道使用的硬件channel比MIC通道使用的硬件channel靠前的话处理数据时需要交换一下顺序
        }
    }
}
#endif

if (req.enc.sample_rate == 16000) {
    aec_param.wideband = 1;
    aec_param.hw_delay_offset = 50;
} else {
    aec_param.wideband = 0;
    aec_param.hw_delay_offset = 75;
}

server_request(__this->enc_server, AUDIO_REQ_ENC, &req);

Note

  • 外部依赖库libaec.a、libdns.a、libjlsp.a,工程需要添加 apps/common/jl_math/jl_fft.c

9.16.2. 查看效果

  • 使用打断唤醒或者蓝牙通话时,想查看mic的数据回声消除效果如何时

  • 1.打断唤醒:在app_config.h中打开宏 #define WIFI_PCM_STREAN_SOCKET_ENABLE //打开打断唤醒pcm音频流局域网传输工具,设备与PC电脑处理同一局域网,打开SDK中sdk_tool目录下 局域网传送PCM流测试工具.exe 工具,输入设备ip4地址(打印中可查看)和电脑的ip4地址,有唤醒时会在sdk_tool目录下生成test.pcm文件,使用音频分析软件按4通道打开,signed 16-bit PCM 小尾端,打断唤醒采样率(SDK中默认16k)。四通道分别为两个MIC通道数据(单MIC的话一个通道数据为空),一个通道为回采DAC,一个通道为AEC回声消除后数据

  • 2.蓝牙通话:在master的WIFI_STORY_MACHINE工程代码中apps/wifi_story_machine/bt_ble/bt_decode.c,打开宏#define AEC_MIX_DATA_TO_SD 0 //将蓝牙通话mic、dac和aec的混合数据写到sd卡里,3channel(mic,dac,aec)

9.16.3. 参数调试

  • 打开编译前配置工具,AC791N_配置工具入口: cpu/wl82/tools/AC791N_config_tool/AC791N_配置工具入口(Config Tools Entry).jlxproj) ,选择“编译前配置工具”

  • 点击通话参数配置,通过点击ON/OFF按钮选择打开或关闭需要的功能模块,AGC模块暂时不支持使用

  • 点击其中某一个模块,可调整具体参数, 具体配置参数描述, 请查看 doc/stuff/JL通话调试手册.pdf

  • 参数设置完成后,点击保存成bin文件,将生成的cfg_tool.bin文件复制到 cpu\wl82\tools 目录,重新烧录即可生效

9.16.4. 常见问题

  • 回声消除算法支持哪些采样率?

    答: AEC目前只支持采样率8000或16000,且只支持单通道。

  • 回声消除打开后发现无效果?

    答: 检查AEC是否打开成功,aec_encoder任务是否有加到app_main.c的任务列表,任务是否创建成功,MIC配置是否正确。

  • 回声消除后还是有一点回声未能完全消掉,应该如何优化?

    答: 考虑到外接功放模块的特性,可采用硬件差分回采电路,效果比纯软件回采DAC输出数据更好。