如需转载请注明出处!
本文将结合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系数调整步长