一 概述
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吧,原理搞清楚是关键。切勿只浮在表面。
作者:虚生 出处:https://www.cnblogs.com/dylancao/ 以音频和传感器算法为核心的智能可穿戴产品解决方案提供商 ,提供可穿戴智能软硬件解决方案的设计,开发和咨询服务。 勾搭热线:邮箱:1173496664@qq.com weixin:18019245820 市场技术对接群:347609188 |