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

Speex回声消除原理深度解析的更多相关文章

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

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

  2. speex 回声消除的用法

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

  3. java8Stream原理深度解析

    Java8 Stream原理深度解析 Author:Dorae Date:2017年11月2日19:10:39 转载请注明出处 上一篇文章中简要介绍了Java8的函数式编程,而在Java8中另外一个比 ...

  4. mysql索引原理深度解析

    mysql索引原理深度解析 一.总结 一句话总结: mysql索引是b+树,因为b+树在范围查找.节点查找等方面优化 hash索引,完全平衡二叉树,b树等 1.数据库中最常见的慢查询优化方式是什么? ...

  5. Speex回声消除代码分析

    先说明下,这里的代码流程是修改过的Speex流程,但与Speex代码差异不大,应该不影响阅读.   (1)用RemoveDCoffset函数进行去直流 (2)远端信号预加重后放入x[i+frame_s ...

  6. SQL注入原理深度解析

    本文转自:http://www.iii-soft.com/forum.php?mod=viewthread&tid=1613&extra=page%3D1 对于Web应用来说,注射式攻 ...

  7. 第1课:SQL注入原理深度解析

    对于Web应用来说,注射式攻击由来已久,攻击方式也五花八门,常见的攻击方式有SQL注射.命令注射以及新近才出现的XPath注射等等.本文将以SQL注射为例,在源码级对其攻击原理进行深入的讲解. 一.注 ...

  8. react渲染原理深度解析

    https://mp.weixin.qq.com/s/aM-SkTsQrgruuf5wy3xVmQ   原文件地址 [第1392期]React从渲染原理到性能优化(二)-- 更新渲染 黄琼 前端早读课 ...

  9. Vue双向数据绑定原理深度解析

    首先,什么是双向数据绑定?Vue是三大MVVM框架之一,数据绑定简单来说,就是当数据发生变化时,相应的视图会进行更新,当视图更新时,数据也会跟着变化. 在分析其原理和代码的时候,大家首先了解如下几个j ...

随机推荐

  1. CAD在网页中打印的图纸里面添加页眉及页脚

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  2. 关于JS中的方法是否加括号的问题

    js中的方法什么时候加括号什么时候不加括号呢,我们有时候经常就搞不清楚,记住下面这几点就好理解了. 1.函数做参数时都不要加括号. function fun(a){ alert(a); } funct ...

  3. unzip 命令巧用举例

    1.把文件解压到当前目录下 unzip master.zip 2.如果要把文件解压到指定的目录下,需要用到-d参数. unzip -d /tmp master.zip 3.解压的时候,有时候不想覆盖已 ...

  4. btrfs基础

    btrfs文件系统简介  btrfs文件系统:技术预览版(Centos7)  Btrfs(B-tree.Butter FS.Better FS),GPL授权,Orale2007提出是想用来取代Ext文 ...

  5. 2018.03.04 晚上Atcoder比赛

    C - March Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement There are N  ...

  6. Problem 42

    Problem 42 https://projecteuler.net/problem=42 The nth term of the sequence of triangle numbers is g ...

  7. debian 7 安装

    1. 从 live cd 或者 dvd 进行安装,官方文档已经够用,可以将 live cd 写进 u 盘,也可以将 dvd 放到硬盘上通过 grub 引导启动安装,文档在这里. 2.安装过程中尽量选择 ...

  8. ganlgia-rrdcached

    一.介绍 rrdcached是一个高性能的RRD缓存守护进程,在不带来大量磁盘读/写文件i/o负荷的情况下,允许gmetad实例维护多个RRD文件.rrdcached可通过命令套接字控制,并且包含在大 ...

  9. 【BestCoder Round #93 1001】MG loves gold

    [题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=6019 [题意] 每次选择一段连续的段,使得这一段里面没有重复的元素; 问你最少选多少次; [题解] ...

  10. 文件描述符 VS 文件句柄

    文件描述符 VS 文件句柄 文件描述符是标准 C 里用的,是 int 型的,比如调用 open 函数成功后会返回一个与当前文件相关联的 int 型数字. 文件句柄是 Windows 里用的,是 HAN ...