java speex回声消除_Speex回声消除原理深度解析
这里假设读者具有自适应滤波器的基础知识。Speex的AEC是以NLMS为基础,用MDF频域实现,最终推导出最优步长估计:残余回声与误差之比。最优步长等于残余回声方差与误差信号方差之比,这个结论可以记下,下面会用到的。
对于长度为N的NLMS滤波器,误差信号定义为期望信号与估计信号之差,表示如下:
\[e(n) = d(n) - \hat y(n) = d(n) - \sum\limits_{k = 0}^{N - 1} {{{\hat w}_k}(n)x(n - k)} \]
则,滤波器的系数更新方程为:
\[{\hat w_k}(n + 1) = {\hat w_k}(n) + \mu \frac{{e(n){x^*}(n - k)}}{{\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} }} = {\hat w_k}(n) + \mu \frac{{(d(n) - \sum\nolimits_i {{{\hat w}_i}(n)x(n - i)} ){x^*}(n - k)}}{{\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} }}\]
设滤波器的系数误差为:
\[{\delta _k}(n) = {\hat w_k}(n) - {w_k}(n)\]
且期望信号为本地(近端)语音+残余回声
\[d(n) = v(n) + \sum\nolimits_k {{w_k}(n)x(n - k)} \]
则滤波器的系数更新方程可以重写为
\[{\delta _k}(n + 1) = {\delta _k}(n) + \mu \frac{{(v(n) - \sum\nolimits_i {{\delta _i}(n)x(n - i)} ){x^*}(n - k)}}{{\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} }}\]
如果每个时刻的失调定义为:
\[\Lambda (n) = \sum\nolimits_k {\delta _k^*(n){\delta _k}(n)} \]
那么,在每一步的迭代中,滤波器的失调可表示如下:
\[\Lambda (n + 1) = \sum\limits_{k = 0}^{N - 1} {|{\delta _k}(n) + \mu \frac{{(v(n) - \sum\nolimits_i {{\delta _i}(n)x(n - i)} ){x^*}(n - k)}}{{\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} }}{|^2}} \]
假设远端信号与近端信号为白噪声,且不相关。
\[\sigma _v^2 = E\{ |v(n){|^2}\} \]
为近端语音信号的方差,则失调的更新方程为
\[E\{ \Lambda (n + 1)|\Lambda (n),x(n)\} = \Lambda (n)\left[ {1 - \frac{{2\mu }}{N} + \frac{{{\mu ^2}}}{N} + \frac{{2{\mu ^2}\sigma _v^2}}{{\Lambda (n)\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} }}} \right]\]
这里失调函数
\[E\{ \Lambda (n + 1)|\Lambda (n),x(n)\} \]
为凸函数,对它关于步长求导,并置导数为0,可得:
\[\frac{{\partial E\{ \Lambda (n + 1)\} }}{{\partial \mu }} = \frac{{ - 2}}{N} + \frac{{2\mu }}{N} + \frac{{2\mu \sigma _v^2}}{{\Lambda (n)\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} }} = 0\]
最终推出最优步长为:
\[{\mu _{opt}}(n) = \frac{1}{{1 + \frac{{\sigma _v^2}}{{\Lambda (n)/N\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} }}}}\]
大家别看最下面的那个分母
\[\Lambda (n)/N\sum\nolimits_{i = 0}^{N - 1} {|x(n - i){|^2}} \]
式子挺长,其实意义很明确,可以近似理解为残余回声的方差,于是输出信号的方差为:近端语音的方差+残余回声的方差,用式子表示如下
\[\sigma _e^2(n) = \sigma _v^2(n) + \sigma _r^2(n)\]
最终,导出最优步长:
\[{\mu _{opt}}(n) = \frac{1}{{1 + \frac{{\sigma _v^2}}{{\sigma _r^2(n)}}}} = \frac{1}{{\frac{{\sigma _r^2(n) + \sigma _v^2}}{{\sigma _r^2(n)}}}} \approx \frac{{\sigma _r^2(n)}}{{\sigma _e^2(n)}}\]
\[{\mu _{opt}}(n) = \min \left( {\frac{{\hat \sigma _r^2(n)}}{{\hat \sigma _e^2(n)}},1} \right)\]
上面的分析是在时域,基于NLMS,可以看到:最优步长等于残余回声方差与误差信号方差之比。其中误差的方差比较好求,残余回声的方差比较难求。下面我们看下上面的结论在频域中如何解决,Speex中在频域的自适应算法为:MDF(multidelay block frequency domain)自适应滤波。
在频域中,设k为频率索引,字母(ell)为帧索引,上面的结论转换到频域,结果如下:
\[{\mu _{opt}}(k,\ell ) \approx \frac{{\sigma _r^2(k,\ell )}}{{\sigma _e^2(k,\ell )}}\]
那么,在频域如何求残余回声的方差呢,我们可以定义一个泄露系数,表示回声相对于远端信号的泄露程度,这时残余回声表示为
\[\sigma _r^2(k,\ell ){\rm{ = }}\hat \eta (\ell )\hat \sigma _{\hat Y}^2(k,\ell )\]
根据泄露系数求出残余回声,就可以得到最优步长
\[{\mu _{opt}}(n) = \min \left( {\hat \eta (\ell )\frac{{|\hat Y(k,\ell ){|^2}}}{{|E(k,\ell ){|^2}}},{\mu _{\max }}} \right)\]
也就是说,根据泄露系数,可以估计出远端信号的残余回声,进而可以得到最优步长,那么,带来另一个问题,这里的泄露系数如何估计呢?确定泄露系数的过程,其实就是一元线性回归分析中确定回归系数的过程,具体可以看下回归分析的内容。
\[\hat \eta (\ell ) = \frac{{\sum\nolimits_k {{R_{EY}}(k,\ell )} }}{{\sum\nolimits_k {{R_{YY}}(k,\ell )} }}\]
\[{R_{EY}}(k,\ell ) = (1 - \beta (\ell )){R_{EY}}(k,\ell ) + \beta (\ell ){P_Y}(k){P_E}(k)\]
\[{R_{YY}}(k,\ell ) = (1 - \beta (\ell )){R_{YY}}(k,\ell ) + \beta (\ell ){P_Y}(k){({P_Y}(k))^2}\]
\[\beta (\ell ) = {\beta _0}\min (\frac{{\hat \sigma _Y^2(\ell )}}{{\hat \sigma _e^2(\ell )}},1)\]
这里, 是通过递归平均处理方法得到每个频点的自相关、输入信号与误差信号的互相关。最终得到泄露系数,具体实现可以参考speex 的代码实现,相关参数可以参考后面给出来参考论文。
Speex的回声消除原理已经分析完了,最终得出结论是:只有改与泄露系数相关部分的代码,才是对效果影响最大的地方,因为根据泄露系数,最终会估计出滤波器的最优步长。
参考论文:On Adjusting the Learning Rate in Frequency Domain Echo Cancellation With Double-Talk
java speex回声消除_Speex回声消除原理深度解析相关推荐
- 让Excel输入内容后自动加边框的方法,及其原理深度解析
今天无意之间看到一篇让Excel输入内容后自动加边框的方法文章,热度挺高,彬哥也想蹭一下热度,于是彬哥想从其原理深度解析一下,因为彬哥去百度了一下相关文章没有一篇文件讲原理,正可谓我们学东西要知其然, ...
- Java CAS操作的实现原理深度解析与应用案例
首先介绍了CAS的基本概念,然后深入至HotSpot源码级别的角度解析了CAS的底层实现,最后介绍了CAS操作存在的问题以及应用. 文章目录 1 CAS的概述 2 Java的CAS实现 3 CAS的底 ...
- IK分词原理深度解析
**鄙人的新书<elasticsearch7完全开发指南>,欢迎订阅!** ----- https://wenku.baidu.com/view/8ff2ce94591b6bd97f192 ...
- 华为P30Pro手机多摄像头变焦本质 + 拍照原理深度解析 + 单反微单Vs手机
华为P30的发布,引起了大家的强烈关注,尤其是被它的4摄,10倍变焦所震撼到,作为光学人士,决定来研究介绍一下: 先来介绍一下拍照成像的根本的原理(其实不够根本,再根本就是波动光学了,有兴趣可以留言交 ...
- java speex回声消除_speex 回声消除的用法
speex的回声消息 就是speex_echo_cancellation函数的正确用法 回声消息的原理: 对参考声音(解码的对端原始语音包)做延迟(会有多个延迟,如麦克风直接采集到音箱的声音,经墙壁反 ...
- Speex回声消除原理深度解析
这里假设读者具有自适应滤波器的基础知识.Speex的AEC是以NLMS为基础,用MDF频域实现,最终推导出最优步长估计:残余回声与误差之比.最优步长等于残余回声方差与误差信号方差之比,这个结论可以记下 ...
- [投稿] Speex回声消除原理深度解析
本文是音频处理的朋友icoolmedia(QQ:314138065)的投稿.对音频处理有兴趣的朋友可以通过下面的方式与他交流: 作者:icoolmedia QQ:314138065 音视频算法讨论 ...
- SQL注入原理深度解析
在网页数据中注入SQL语句 对于Web应用来说,注射式攻击由来已久,攻击方式也五花八门,常见的攻击方式有SQL注射.命令注射以及新近才出现的XPath注射等等.本文将以SQL注射为例,在源码级对其攻击 ...
- 10种室内定位技术原理深度解析
在高度城市化的今天,室内空间越来越庞大复杂.人类战胜了大自然,却在自己构筑的钢筋水泥中迷了路. 东晋高僧法显西行求法乘船回国时写道:大海弥漫无边,不识东西,唯望日.月.星宿而进.大意就是说,大海辽阔无 ...
- 单线激光雷达原理深度解析
单线激光雷达是指激光源发出的线束是单线的雷达,具有三角测距及TOF激光雷达之分,主要以机器人领域应用居多.其扫描速度快.分辨率强.可靠性高,与多线激光雷达相比,单线激光雷达在角频率及灵敏度上反应更快捷 ...
最新文章
- 人工智能正在引领全球企业的创新
- 解决MySql 数据库 提示:1045 access denied for user 'root'@'localhost' using password yes
- mysql tags_mysql tags table解决方法
- java ee 下载 安装配置_JavaEE下载安装及配置.doc
- ASP.NET AntiXSS的作用
- #pragma预处理指令详解
- IO流 Buffered 综合练习
- jQuery右键菜单ContextMenu使用笔记
- TeamTalk UtilPdu详解
- python kdj指标详解_Python版简单的KDJ策略
- 新手gxf学python---文件操作之登录、注册功能
- 作为泛娱乐圈专属域名,.fans岂能错过这匹年末综艺“黑马”?
- Java-栈的基本操作
- 微信小程序CMS系统开发教程开发初级
- 硬盘清理利器TreeSize Free
- 洛谷P1873 砍树(二分)
- PHp勾股定理,【中考备考】有关数学必考奥数题之勾股定理练习题 初二数学
- HTML5权威指南读书笔记03(第7,8章)--icon,base,锚点,一些七七八八的元素
- 现有关系数据库如下: 学生(学号,姓名,性别,专业) 课程(课程号,课程名,学分) 学习(学号,课程号,分数) 分别用关系代数表达式和 SQL 语句实现下列 1—5 小题(注意:每小题都要分别 写出关
- 巧用c语言风格的多行注释/**/
热门文章
- 静态路由配置《计算机网络》实验六,思科路由器静态路由配置实验案例详解
- matlab模拟方孔衍射,基于MATLAB的圆孔衍射实验模拟.pdf
- 搭建 LimeSurvey投票调查问卷系统
- 电力线通信技术的发展
- Algorithm:数学建模大赛(CUMCM/NPMCM)之05B《DVD在线租赁》
- MATLAB偏微分方程数值解视频课程
- python照片处理生成3d模型_【神器】摄影实时建模,用照片生成3D模型
- 4、配置虚拟机IP地址
- Windows Server AppFabric 简介
- 计算机ip地址和用户名和密码忘记了怎么办,192.168.1.112这是IP地址 我把密码忘了 怎么处理啊 电脑室现在还...