这里假设读者具有自适应滤波器的基础知识。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

转载于:https://www.cnblogs.com/icoolmedia/p/speex_aec_analyze.html

Speex回声消除原理深度解析相关推荐

  1. [投稿] Speex回声消除原理深度解析

    本文是音频处理的朋友icoolmedia(QQ:314138065)的投稿.对音频处理有兴趣的朋友可以通过下面的方式与他交流: 作者:icoolmedia  QQ:314138065  音视频算法讨论 ...

  2. 音视频处理三剑客之 AEC:回声产生原因及回声消除原理

    在上一期课程<音视频开发者进阶 -- 音频要素>中,我们从声音三要素.音频模拟信号的数字化和音频数字信号特征等方面,重新认识了"声音"这个老朋友.今天,我们会进一步聊聊 ...

  3. 让Excel输入内容后自动加边框的方法,及其原理深度解析

    今天无意之间看到一篇让Excel输入内容后自动加边框的方法文章,热度挺高,彬哥也想蹭一下热度,于是彬哥想从其原理深度解析一下,因为彬哥去百度了一下相关文章没有一篇文件讲原理,正可谓我们学东西要知其然, ...

  4. speex回声消除功能测试

    本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 今天测试了speex中带回声消除模块,效果还可以. 测试环境:网络双工通话,16K采样16位编码,spe ...

  5. java speex回声消除_speex 回声消除的用法

    speex的回声消息 就是speex_echo_cancellation函数的正确用法 回声消息的原理: 对参考声音(解码的对端原始语音包)做延迟(会有多个延迟,如麦克风直接采集到音箱的声音,经墙壁反 ...

  6. Speex 回声消除

    为什么需要声学回声消除呢?在一般的VOIP软件或视频会议系统中,假设我们只有A和B两个人在通话,首先,A的声音传给B,B然后用喇叭放出来,而这时B的MIC呢则会采集到喇叭放出来的声音,然后传回给A,如 ...

  7. [投稿]Speex回声消除代码分析

    本文是音频处理的朋友icoolmedia(QQ:314138065)的投稿.对音频处理有兴趣的朋友可以通过下面的方式与他交流: 作者:icoolmedia  QQ:314138065  音视频算法讨论 ...

  8. 回声消除原理 此博文包含图片

    从通讯回音产生的原因看,可以分为声学回音(Acoustic Echo)和线路回音(Line Echo),相应的回声消除技术就叫声学回声消除(Acoustic Echo Cancellation,AEC ...

  9. 华为P30Pro手机多摄像头变焦本质 + 拍照原理深度解析 + 单反微单Vs手机

    华为P30的发布,引起了大家的强烈关注,尤其是被它的4摄,10倍变焦所震撼到,作为光学人士,决定来研究介绍一下: 先来介绍一下拍照成像的根本的原理(其实不够根本,再根本就是波动光学了,有兴趣可以留言交 ...

最新文章

  1. error aborting mysql,mysql错误1067,mysql1067错误aborting
  2. JavaScript类型·对象·函数
  3. 1066 Root of AVL Tree (25 分)【难 / 知识点: 平衡树 未完成】
  4. sv队列和动态数组的区别_systemverilog学习(4)动态数组
  5. 深度学习的一些经验总结和建议| To do v.s Not To Do
  6. [网络安全自学篇] 四十五.病毒详解及批处理病毒原理分析(自启动、修改密码、定时关机、蓝屏、进程关闭)
  7. 复习--SQL Server (一) -系统数据库
  8. Redis进阶之内存模型
  9. mysql 交换工资_LeetCode:627.交换工资
  10. windows phone 8.0 的网络图片异步加载方案
  11. 从头开始编写一个时间序列数据库
  12. 2021年十大 web hacking 技术汇总
  13. 【ACM ICPC 2011–2012, Northeastern European Regional Contest】Interactive Permutation Guessing【交互题】
  14. webstorm主题网址
  15. 2019年终总结-坚持的力量
  16. .lnk 文件恢复默认打开方式
  17. Android简单的布局优化
  18. 今日头条有麻烦了!App 被下架
  19. java文字版格斗游戏。
  20. python-生产者消费者模型_线程_线程互斥锁_GIL全局解释器锁

热门文章

  1. CSDN内容颜色、位置以及图片大小改变
  2. python中列表生成式strip_列表生成式|让你的代码简洁又美观
  3. 如何在Ubuntu18.04安装Tesla T4板的驱动程序
  4. oracle中col 的用法,Oracle All
  5. springboot templates读取不到_整合spring mvc + mybatis,其实很简单,spring boot实践(5)
  6. 打包跳过编译_Apache Flink v1.9-SNAPSHOT 源码编译
  7. oracle client 默认端口,[数据库]配置精简版Oracle客户端
  8. apache 编译安装php mysql_编译安装APACHE+PHP+MYSQL
  9. 【自动驾驶】5. ROS和DDS的区别总结
  10. Programming Computer Vision with Python (学习笔记二)