先说明下,这里的代码流程是修改过的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. Error opening trace file: No such file or directory (2)

    想看sharepreference保存的键值对的数据,用到单元测,运行函数总是报这种错,且看不到file explorer-->data>对应工程包的xml文件:

  2. JS 去字符串空格

    str为要去除空格的字符串:去除所有空格: str = str.replace(/\s+/g,""); 去除两头空格: str = str.replace(/^\s+|\s+$/g ...

  3. .git文件过大!删除大文件

    在我们日常使用Git的时候,一般比较小的项目,我们可能不会注意到.git 这个文件. 其实, .git文件主要用来记录每次提交的变动,当我们的项目越来越大的时候,我们发现 .git文件越来越大. 很大 ...

  4. struts2对一些属性的使用和对session封装对象类型采用jstl技术的遍历(配图解)

    在struts2中如何实现像jsp中request,session,appliaction的使用.其实有两种方法.下面通过一个案列来说明两个方法的使用. 先写一个test.java类 packagec ...

  5. C# ASP.NET Webservice调用外部exe无效的解决方法

    最近用asp.net做webservice,其中有个功能是调用执行外部的exe(类似cmd中执行),但执行Process.Start之后就没有结果,同样代码在winform下正常,折腾两天终于找到解决 ...

  6. Codeforces Gym 100015F Fighting for Triangles 状压DP

    Fighting for Triangles 题目连接: http://codeforces.com/gym/100015/attachments Description Andy and Ralph ...

  7. Theatre Square

    http://codeforces.com/problemset/problem/1/A Theatre Square time limit per test 2 seconds memory lim ...

  8. Linux中搭建SVNserver

    一 下载工具 1. subversion-1.6.17.tar.gz 2. subversion-deps-1.6.17.tar.gz 二 解压两个包: 1.在此之前,我已经创建了一个用户svnroo ...

  9. [Angular 2] Angular 2 Smart Components vs Presentation Components

    Both Smart Components and Presentation Components receive data from Services in entirely different w ...

  10. 用SecureCRT来上传和下载数据

    借助securtCRT,使用linux命令sz可以很方便的将服务器上的文件下载到本地,使用rz命令则是把本地文件上传到服务器. 其中,对于sz和rz的理解与记忆我用了如下的方法(很多时候容易搞混): ...