一 概述 webrtc 针对回声问题一共开源了3种回声消除算法,分别为aec,aecm,以及aec3,其中aec是最早期的版本,在后续的更新中aec3的出现代替了aec在webrtc 中的地位,而aecm主要是针对计算能力较弱的移动端或是嵌入式设备而开发的,但同时也带来了它自己的劣势;本文主要介绍AECM算法的计算逻辑。后面会逐步分析aec和aec3的源码。 二 参数解析 参数一 延时参数:delay,通过测试发现,这个参数对回声消除的效果影响很大。这个到底要怎么选取呢?是和实际环境有关系吗?通过实际测试发现,这个和实际的环境延时有关系,实际环境中,是需要根据实际的设备延时来填写这个的,太大和太小了都会有消除不干净。下图是不同delay的参数测试的结果,可以看出,太大或者太小会导致回声消除不干净。 参数二,回声消除等级 aecm->echoMode = config.echoMode; 这个参数决定回声消除的等级,同时也决定了吞音的等级,等级越高吞音越明显,同时回声消除也越好。这个参数非常重要。下面是这个参数不同的效果展示: 参数三 aecm->farEnergyVAD 这个参数这里没用到,在aec的里面,反而是用得着的。 参数四 aecm->currentVADValue 这个参数是标志是否探测到声音的。 三 函数解析 初始化函数: int32_t WebRtcAecm_Init(void *aecmInst, int32_t sampFreq) 初始化采样率和回声消除参数 获取参考信号的函数 int32_t WebRtcAecm_BufferFarend(void *aecmInst, const int16_t *farend, int16_t nrOfSamples) 该函数是获取参考信号的值的 回声消除的主函数 int32_t WebRtcAecm_Process(void *aecmInst, const int16_t *nearendNoisy, const int16_t *nearendClean, int16_t *out, int16_t nrOfSamples, int16_t msInSndCardBuf) 四 总结 aecm里面由于涉及到太多的定点转换,很难窥探到该算法的原理了。想要了解该算法的原理,还是依靠分析aec,后面再详细分析一下aec吧,原理搞清楚是关键。切勿只浮在表面。
标签:int16,回声,aec,源码,参数,AECM,解析,aecm,消除 From: https://www.cnblogs.com/dylancao/p/17732784.html