由于最近项目需要在一款新设备上存在mic和拾音器,实现真正外部对讲,而不像以前基本都是linein和mic,所以为了保证声音质量,需要加入回声消除算法,做一个学习总结,由于只是做集成和调试,暂时不涉及到算法。

 

为什么会有回声?主要包含两类:线路回声和声学回声

线路回声:通过硬件设计避免或减少

声学回声:空间声学反射导致,如下图:

ios开发 oc svga_语音通信

女士的声音 = speech1(echo) + speech2,此时男士会听到女士的声音叠加了自己的声音。

 

       对于声学消除主要的消除算法由两类:回声抑制以及回声消除(acoustic echo cancellation)

       回声抑制是一种较早的声控算法,它通过简单的比较器将准备由扬声器播放的声音和当前拾音器采集到的声音进行电平比较,如果扬声器电平高于某个阈值,则允许扬声器播放,而且拾音器被关闭,阻止拾音器采集到扬声器的声音导致回声;反之,如果拾音器电平高于某个阈值,而拾音器打开,扬声器禁止。这是一种非线性的方法,会引起扬声器播放不连续,效果不佳,现在基本没人使用。

 

        回声消除(AEC)是利用人为干预的信号波,去消除在通讯过程中产生的回声信号,但要保留通讯过程中其他正常的语音信号,从而能够进行正常的语音通信。

       总体步骤是:首先预估回声路径中的相关特征参数,接着形成一个模拟的回声路径,然后计算出模拟的回声信号,最后再从接收到的信号中去除该信息,从而实现回声消除。

       该算法包括两个输入声音源,一个是采集到的源声音信号,一个是参考声音信号,注意参考声音和源声音直接的延迟不超过1s,切参考声音比源声音早。

ios开发 oc svga_aec_02