天天看點

MDF結合Learning rate adjust應用

如需轉載請注明出處!

本文将結合speex AEC MDF與learning rate adjust進行總結。

1. 近端信号經過陷波器(notchfilter)處理去除直流分量存入input[]中,陷波器仿真如圖所示

MDF結合Learning rate adjust應用

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來做最優步長的計算

MDF結合Learning rate adjust應用
MDF結合Learning rate adjust應用
MDF結合Learning rate adjust應用

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系數調整步長

繼續閱讀