天天看点

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系数调整步长

继续阅读