如需轉載請注明出處!
本文将結合speex AEC MDF與learning rate adjust進行總結。
1. 近端信号經過陷波器(notchfilter)處理去除直流分量存入input[]中,陷波器仿真如圖所示
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zNxUzMxIDN4EzNyQDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
2. 對input[]信号進行預加重處理
3. 遠端信号經過預加重處理存入x[]後半部分中,x[]前半部分存儲的上一幀信号
4. 将X[]中M幀的頻域信号向後平移,x[]信号頻域結果存至X[]頭部位置
5. 計算新輸入的遠端信号的時域能量,儲存為Sxx
6. 計算X[]頭部頻域一幀的功率譜,存至Xf[]中
7. X[]前M幀經前景濾波(foreground)濾波,結果存至Y[]中
8. Y[]進行IFFT變換,結果存至e[]中
9. 更新e[]前半部分為近端信号與前景濾波的內插補點,後半部分為前景濾波結果。
10. 計算近端信号與前景濾波的差的能量,存至Sff中
11. 判斷是否調整prop[], prop[]實體意義上為M幀的步長調整尺度因子。prop[j](j:0~M-1)與power_1[]的點乘即為第j幀的步長,一定意義上實作了回聲的稀疏性考慮。
12. 根據X[]中之前時刻M幀的頻域信号與之前時刻産生的誤差前半部分補0再FFT變換得到的頻域信号E[],根據MDF算法來更新W系數
13. 對X[]應用W[]進行MDF後向濾波,結果存至Y[]中。Y[]的IFFT結果存至y[]中
14. 更新e[]前半部分為前景濾波與後景濾波的差,e[]的後半部分為前景濾波結果
15. 計算前景濾波與後景濾波差的能量,存至Dbf
16. 更新e[]前半部分為近端信号與後景濾波的差,e[]的後半部分為前景濾波結果
17. 計算近端信号與後景濾波差的能量,存至See
18. 判斷是否需要更新前景濾波器foreground或重置後景濾波器W[]. 判斷的準則可以基本總結為:當經前景濾波消除回聲力度一定程度上弱于後景濾波時(Sff大于一定程度),則更新前景濾波器;當經後景濾波消除回聲力度一定程度上弱于前景濾波時(See大于一定程度),則重置後景濾波器
19. 近端信号與估計回聲的差,經過去加重後存至輸出buffer中
20. 更新e[]前半部分置0,後半部分為近端信号與估計回聲的差
21. 計算e[]後半部分與估計回聲y[]後半部分的内積,存至Sey;y[]後半部分自身内積,存至Syy;近端信号自身内積,存至Sdd
22. 計算e[]的FFT存至E[];y[]前半部分置0後的FFT結果存至Y[]
23. 計算E[]的功率譜存至Rf[];Y[]的功率譜存至Yf[]
24. 計算X[]中目前幀部分的功率譜,存至Xf[]中
25. 平滑Xf[]存至power[]
後續部分,結合On Adjusting the Learning Rate in Frequency Domain Echo CancellationWith Double-Talk來做最優步長的計算
26. 根據Rf[]和Yf[]在時間次元上去直流分量的結果,計算自相關Pyy和互相關Pey
27. 更新:
st->Pey=(1-alpha)*st->Pey+alpha*Pey
st->Pyy=(1-alpha)*st->Pyy+alpha*Pyy
28. 計算洩露因子:st->leak_estimate=st->Pey/ st->Pyy
29. 計算RER = (.0001*Sxx +3.*st->leak_estimate*Syy) / See
30. AEC工作初始階段,不按照On Adjust..文章方法更新步長,而是按照如下:
adapt_rate = 0.25*Sxx /See;
st->power_1[i] =adapt_rate / power[i];
當工作一段時間後,On Adjust..開始介入,更新如下:
r =st->leak_estimate*st->Yf[i]; // st->leak_estimate表示回聲洩露因子; st->Yf[i] 表示估計回聲的頻域功率
e = st->Rf[i]+1; // st->Rf[i] 表示誤差信号(即消除回聲後的信号)的頻域功率
r = 0.7*r + 0.3*BER*e; // RER = (.0001*Sxx + 3.*st->leak_estimate*Syy) / See;
st->power_1[i] =r/(e*(st->power[i]+10)); // st->power[i]表示遠端信号頻域功率的平滑值
power_1[]與prop[j] (j:0~M-1)的乘積表示第j個窗的W系數調整步長