WebRTC回声消除(2)
WebRTC的回声抵消算法(AEC,AECM)有以下几个重要的模块:
1.回声延时估计
2.NLMS
3.NLP
4.CNG
5.双端检测(DT)
下面分别介绍:
(1)回声延时估计
回声延时长短:基于相关的时延估计算法(其中:基于语音信号自相关求基音周期):回声抵消场所,延时搜索范围较大。
webrtc的回声时延估计,它采用的是gips首席科学家Bastiaan的算法
(2)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)算法,这也是自适应滤波器的常用算法。自适应滤波的更多资料可以参考simon haykin 的《自适应滤波器原理》。
(3)NLP(非线性滤波)
webrtc采用了维纳滤波器。
设估计的语音信号的功率谱为Ps(w),噪声信号的功率谱为Pn(w),
则滤波器的传递函数为: H(w)=Ps(w)/(Ps(w)+Pn(w))。
(4)CNG(舒适噪声产生)
webrtc采用的舒适噪声生成器比较简单,首先生成在[0 ,1 ]上均匀分布的随机噪声矩阵,
再用噪声的功率谱开方后去调制噪声的幅度。
由于工作需要,最近一直在研究WebRTC里的AEC算法。根据源码里面的fullaec.m文件,总体来说,我认为该AEC算法是属于分段快频域自适应滤波算法,Partioned block frequeney domain adaPtive filter(PBFDAF)。具体可以参考Paez Borrallo J M and Otero M G
使用该AEC算法要注意两点:
1)延时要小,因为算法默认滤波器长度是分为12块,每块64点,按照8000采样率,也就是12*8ms=96ms的数据,而且超过这个长度是处理不了的。
2)延时抖动要小,因为算法是默认10块也计算一次参考数据的位置(即滤波器能量最大的那一块),所以如果抖动很大的话找参考数据时不准确的,这样回声就消除不掉了。
转自:http://www.cnblogs.com/mod109/p/5829470.html