先说明下,这里的代码流程是修改过的Speex流程,但与Speex代码差异不大,应该不影响阅读。
 
(1)用RemoveDCoffset函数进行去直流
(2)远端信号预加重后放入x[i+frame_size],近端信号预加重后放入input缓冲区
(3)前M-1帧的远端频域信号移位,为当前帧频域信号腾出空间
(4)用spx_fft函数进行FFT变换,变换后的系数存在X中
(5)计算当前远端信号当前帧的方差Sxx。(去直流操作后,意味着均值可以视为零
(6)当前远端时域信号移位,x[i] = x[i+frame_size],50%交叠处理
(7)先用前景滤波器进行滤波
(8)将滤器后的输出进行反变换
(9)再用近端信号(麦克风语音)减去滤波输出得到前景滤波器的语差信号
(10)再用mdf_inner_prod计算前景滤后器的时域误差总功率
(11)使用mdf_adjust_prop计算背景滤波器的P步长,结果存放在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)在时域计算两次滤波之间的误差及两次滤波之间误差的功率Dbf
(18)在时域计算背景滤波器滤波后的误差和背景滤波器滤波后误差的方差See。至此我们得到:
Sff 前景滤波后的方差
See 背景滤波后的方差
Dbf 前景滤波与背景滤波之间方差
(19)利用Sff、See、Dbf来计算是否需要更新前景滤波器(总的来说,当Dbf值比较大时需要更新前景滤波器系数)
(20)如果需要更新前景滤波器系数则把背景滤波器系数给前景滤波器,并平滑背景滤波后的时域误差(前景滤波时域语差加上背景滤波器的时域输出),得到总误差,存在e[i+frame_size],这里的总误差,就是总的远端信号回声。
(21)根据总的远端信号回声,计算回声消除后的语音信号,并进行预加重处理,存在out输出缓冲区中(这个步骤是我自己调的)
(22)误差缓冲区移动,为下一帧处理做好准备
(23)计算背景滤波器输出与误差的互相关Sey、背景滤波器的自相关Syy
(24)再把语差信号与输出信号(前面都置为0)都是变换到频域
(25)再计算变换后的E、Y、X的功率谱,对应的分别是Rf、Xf、Xf
(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
先计算递归平均系数:
alpha = beta0*Syy/See; 这里beta0为泄露估计的学习速率
alpha_1 = 1-alpha;
  再递归计算相关系数Pey和标准差Pyy
  最后得到泄露系数:leak_estimate = Pey/Pyy
(30)计算残余回声与误差的比率,并做上下限处理。
RER = (0.0001*Sxx + 3.0f*leak_estimate*Syy) / See; 
  下限:Sey*Sey/(1+See*Syy)
  上限:0.5
(31)判断收敛条件:sum_adapt > M 且leak_estimate > 0.03
如果滤波器收敛:
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值为0
adapt_rate = 0.25f*Sxx/See;
sum_adapt += adapt_rate
(32)把残余回声保存在last_y,这是为了语音增强时去掉回声的影响

Speex回声消除代码分析的更多相关文章

  1. LMS、NLMS最优步长理论分析与Speex回声消除可能的改进想法

    一.回声消除算法模型 先来分析下自适应回声消除的主要组成部分,大体上可以把回声消除模型分为两个部分 横向滤波器结构 滤波器系数自适应与步长控制 横向滤波器用脉冲响应w(n)[有的地方也称为回声路径]与 ...

  2. speex 回声消除的用法

    speex 回声消除的用法 分类: speex AEC 回声消除 2012-11-13 11:24 1336人阅读 评论(0) 收藏 举报 speex的回声消息 就是speex_echo_cancel ...

  3. Speex回声消除原理深度解析

    这里假设读者具有自适应滤波器的基础知识.Speex的AEC是以NLMS为基础,用MDF频域实现,最终推导出最优步长估计:残余回声与误差之比.最优步长等于残余回声方差与误差信号方差之比,这个结论可以记下 ...

  4. Speex Acoustic Echo Cancellation (AEC) 回声消除模块的使用

    背景:回声与啸叫的产生  http://blog.csdn.net/u011202336/article/details/9238397 参考资料:  http://www.speex.org/doc ...

  5. 基于深度学习的回声消除系统与Pytorch实现

    文章作者:凌逆战 文章代码(pytorch实现):https://github.com/LXP-Never/AEC_DeepModel 文章地址(转载请指明出处):https://www.cnblog ...

  6. speex与webrtc回声消除小结

    回声消除AEC包含:   延时估计对齐+线性自适应滤波器+NLP(双讲检测.处理)+舒适噪声CNG 一.speex aec 1.没有NLP 2.只考虑实时DSP系统,即是没有延时对齐等 3.自适应滤波 ...

  7. Flex Flash Player回声消除的最佳方法

    Adobe Flash Player 已经成为音频和视频播放的非常流行的工具.实际上,目前大多数因特网视频均使用 Flash Player观看. Flash Player 通过将许多技术进行组合可以提 ...

  8. Flex回声消除的最佳方法

    Adobe Flash Player 已经成为音频和视频播放的非常流行的工具.实际上,目前大多数因特网视频均使用 Flash Player观看. Flash Player 通过将许多技术进行组合可以提 ...

  9. 音频算法speex中的aec分析以及解析

    算法原理: Speex的AEC是以NLMS(Normalized Least Mean Square)为基础,用MDF(multidelay block frequency domain)频域实现,最 ...

随机推荐

  1. 关键词权重计算算法:TF-IDF

    TF-IDF(Term Frequency–Inverse Document Frequency)是一种用于资讯检索与文本挖掘的常用加权技术.TF-IDF是一种统计方法,用以评估一字词对于一个文件集或 ...

  2. Unity3d:使用uWebKit插件嵌入网页,网页中的flv视频无法播放

    问题描述:unity3d程序,使用uWebKit插件嵌入网页,用来播放FLV视频,有的电脑可以正常播放,有的电脑在网页中播放不了ps:网页中的播放器用的是player.swf解决方案:是由于网页中的播 ...

  3. Redis操作命令

    1)连接操作命令    quit:关闭连接(connection)    auth:简单密码认证    help cmd: 查看cmd帮助,例如:help quit        2)持久化    s ...

  4. eclipse界面语言的切换方法

    很久以前在我一个朋友的blog上看到过关于eclipse中英文语言界面切换的方法,觉得挺不错,后来自己也用过几次 现在想想,这个方法真的很不错,刚才又在自己机器上做了几次试验,发现eclipse事实上 ...

  5. IOS学习经验总结--来自知乎网友

    转自知乎:http://www.zhihu.com/question/20016551 我当时刚学iOS开发的时候一样的感觉 总想知道原理 内部怎么回事 感觉在像在雾里但是iOS开发就是这样 他是封闭 ...

  6. C# udpclient 发送数据断网后自动连接的方法

    需求 有一个winform程序, 用来调试路由器和对路由器吞吐量进行测试 需要后台不断的接收来自udp服务器端的数据,同时要发送数据到服务器端(无线路由器) 设计时候,通过一个线程,for(;;)死循 ...

  7. iOS开发——图层OC篇&Quartz 2D各种绘制实例

    Quartz 2D各种绘制实例 首先说一下,本篇文章只是介绍怎么使用Quartz 2D绘制一些常用的图像效果,关于Quartz和其他相关技术请查看笔者之前写的完整版(Quartz 2D详解) 一:画线 ...

  8. 用Python编写九九乘法表考虑print自动换行问题

    编写了一个简单的小程序九九乘法表,代码如下: for i in range(1,10): for j in range(1,i+1): print(" %d*%d=%d" % (j ...

  9. 在Ubuntu 14.04 64bit上安装numpy和matplotlib库

    原文:http://blog.csdn.net/tao_627/article/details/44004541 按照这个成功安装! 机器学习是数据挖掘的一种实现形式,在学习<机器学习实战> ...

  10. 被淡忘的c#析构函数

    析构函数在C#中已经很少使用了,以至于很多人已经把它淡忘了,虽然用处不大,研究一下也无防.(原文:http://bbs.csdn.net/topics/300178463)一. 析构函数的特征:析构函 ...