webrtc aecd算法解析一(原理分析)

webrtc的回声抵消(aec、aecm)算法主要包括如下几个重要模块:web

  • 回声时延估计
  • NLMS(归一化最小均方自适应算法)
  • NLP(非线性滤波)
  • CNG(温馨噪声产生)

回声时延估计

 

这张图不少东西能够无视,咱们重点看T0,T1,T2三项。算法

  • T0表明着声音从扬声器传到麦克风的时间,这个时间能够忽略,由于通常来讲话筒和扬声器之间距离不会太远,考虑到声音340米每秒的速度,这个时间都不会超过1毫秒。
  • T1表明远处传到你这来的声音,这个声音被传递到回声消除远端接口(WebRtcAec_BufferFarend)的到播放出来的时间。通常来讲接收到的音频数据传入这个接口的时候也就是上层传入扬声器的时刻,因此能够理解成该声音防到播放队列中开始计时,到播放出来的时间。
  • T2表明一段声音被扬声器采集到,而后到被送到近端处理函数(WebRtcAec_Process)的时刻,因为声音被采集到立刻会作回声消除处理,因此这个时间能够理解成麦克风采集到声音开始计时,而后到你的代码拿到音频PCM数据所用的时间。
  • delay=T0+T1+T2,其实也就是T1+T2。

通常来讲,一个设备若是能找到合适的delay,那么这个设备再作回声消除处理就和降噪增益同样几乎没什么难度了。如iPhone的固定delay是60ms。不过这个要看代码所在位置,假如在芯片内部,时间仍是比较少的,而且容易固定,假如在系统应用层软件,整个时间就不肯定了。相对比较大了。dom

NLMS(归一化最小均方自适应算法)

  • LMS/NLMS/AP/RLS等都是经典的自适应滤波算法,此处只对webrtc中使用的NLMS算法作简略介绍。
  • 设远端信号为x(n),近段信号为d(n),W(n),则偏差信号e(n)=d(n)-w’(n)x(n) (此处‘表示转秩),NLMS对滤波器的系数更新使用变步长方法,即步长u=u0/(gamma+x’(n) * x(n))。其中u0为更新步长因子,gamma是稳定因子,则滤波器系数更新方程为 W(n+1)=W(n)+u*e(n)*x(n); NLMS比传统LMS算法复杂度略高,但收敛速度明显加快。LMS/NLMS性能差于AP和RLS算法。
  • webrtc使用了分段块频域自适应滤波(PBFDAF)算法,这也是自适应滤波器的经常使用算法。该算法的原理以下:判断远端和近端是否说话的状况,又称为双端检测,须要监测如下四种状况: 
    1. 仅远端说话, 此时有回声,要利用这种状态进行自适应滤波器的系数更新,尽快收敛 
    2. 仅近端说话, 这种时候是没有回声的,不用考虑 
    3. 双端都在说话(Double Talk),此时系数固化,不进行系数更新 
    4. 双端都没有说话,这时候能够挂电话了。。。这时候须要启用近端VAD
  • 自适应滤波的更多资料能够参考simon haykin 的《自适应滤波器原理》。

NLP(非线性滤波)

  非线性滤波器的原始数据与滤波结果是一种逻辑关系,即用逻辑运算实现,如最大值滤波器、最小值滤波器、中值滤波器等,是经过比较必定邻域内的灰度值大小来实现的,没有固定的模板,于是也就没有特定的转移函数(由于没有模板做傅里叶变换)。函数

  webrtc采用了维纳滤波器。此处只给出传递函数的表达式,设估计的语音信号的功率谱为Ps(w),噪声信号的功率谱为Pn(w),则滤波器的传递函数为H(w)=Ps(w)/(Ps(w)+Pn(w))。性能

CNG(温馨噪声产生)

  温馨噪音生成(comfort noise generator,CNG)是一个在通话过程当中出现短暂静音时用来为电话通讯产生背景噪声的程序。blog

webrtc采用的温馨噪声生成器比较简单,首先生成在[0 ,1 ]上均匀分布的随机噪声矩阵,再用噪声的功率谱开方后去调制噪声的幅度。接口

应用场景

  webrtc AEC算法是属于分段快频域自适应滤波算法,Partioned block frequeney domain adaPtive filter(PBFDAF)。具体能够参考Paez Borrallo J M and Otero M G队列

  使用该AEC算法要注意两点:generator

  • 延时要小,由于算法默认滤波器长度是分为12块,每块64点,按照8000采样率,也就是12*8ms=96ms的数据,并且超过这个长度是处理不了的。
  • 延时抖动要小,由于算法是默认10块也计算一次参考数据的位置(即滤波器能量最大的那一块),因此若是抖动很大的话找参考数据时不许确的,这样回声就消除不掉了。
相关文章
相关标签/搜索