本文是音频处理的朋友icoolmedia(QQ:314138065)的投稿。对音频处理有兴趣的朋友可以通过下面的方式与他交流:
作者:icoolmedia
QQ:314138065
音视频算法讨论QQ群:374737122
(11)使用mdf_adjust_prop计算背景滤波器各段(每个)相同频率的系数幅度,存放在prop( 这里进行了归一化处理)。
(12)用weighted_spectral_mul_conj函数计算背景滤波器频域系数需要调整多少量,(其思想为LMS:步长乘以W*E)
power_1 最优步长因子,具体可以参考Mader算法,与prop相乘得到最化步长
prop 为归一化后的背景滤波器各频率的系数幅度。与power_1相乘
X 为转换到频域后的远端信号
E 为转换到频域后的误差信号PHI 输出结果:背景滤波器频域系数需要调整的量
(13)背景滤波器频域系数调整:W[j*N+i] = W[j*N+i]+ PHI[i]
(14)防止循环卷积处理(重叠保留法变循环卷积为线性卷积,把相关块的FFT系数中的后半部分置为零)
(15)根据调整后的背景滤波器对远端信号再进行频域滤波处理
(16)滤波后的输出进行反变换,存到y
(17)在时域计算两次滤波之间的误差及两次滤波之间误差的功率DbfSff 前景滤波后的方差(19)利用Sff、See、Dbf来计算是否需要更新前景滤波器(总的来说,当Dbf值比较大时需要更新前景滤波器系数)
See 背景滤波后的方差
Dbf 前景滤波与背景滤波之间方差
(26)通过Xf平滑得到远端信号功率谱power
power[j] = (ss_1*power[j]) + 1 + (ss*Xf[j]);
(27)当(前一帧的)泄露系数小于一个阀值(0.5)时,重新估算远端信号功率谱power(28)计算ey协方差,得到e和y的相关系数 Pey,标准差 Pyy。(Pey为相关系数:ey协方差/y标准差)
(29)计算远端信号泄露系数
参考论文:On Adjusting the Learning Rate in Frequency Domain Echo Cancellation With Double-Talk先计算递归平均系数:(30)计算残余回声与误差的比率,并做上下限处理。alpha = beta0*Syy/See; 这里beta0为泄露估计的学习速率alpha_1 = 1-alpha;再递归计算相关系数Pey和标准差Pyy
最后得到泄露系数:leak_estimate = Pey/Pyy
RER = (0.0001*Sxx + 3.0f*leak_estimate*Syy) / See;(31)判断收敛条件:sum_adapt > M 且leak_estimate > 0.03
下限:Sey*Sey/(1+See*Syy)
上限:0.5
如果滤波器收敛:
r = 0.7*leak_estimate*Yf + 0.3*RER*(RF+1) // 计算残余回声的功率// 计算最优步长因子,具体可以参考Mader算法,或者到本文作者那里寻求帮助power_1[i] = r / (e*(power[i]+10));
如果没有收敛
当Sxx > N*1000时,按如下计算adapt,否则adapt_rate值为0adapt_rate = 0.25f*Sxx/See;sum_adapt += adapt_rate
(32)把残余回声保存在last_y,这是为了语音增强时去掉回声的影响
本文为原创,欢迎转发到博客上,转发时第一页的版权信息必须保留!谢谢!