了解CV和RoboMaster视觉组(五)滤波器、观测器和预测方法:自适应滤波器的应用

--neozng1@hnu.edu.cn

应用举例

  • 降噪

    网络上能找到非常多自适应滤波器用于降噪的例子,尤其是AEC(自适应回声消除)常常被作为样例,但是却存在大量的缺解、讹误和疏漏,甚至在根本没有弄清楚原理的情况下就大肆复制粘贴添油加醋。笔者在初看也一头雾水疑惑也越发头大,经过长达三天的查证和学习,在此归纳总结。

    如下图所示, x ( n ) = y ′ ( n ) + s ( n ) x(n)=y'(n)+s(n) x(n)=y(n)+s(n)为带有噪声的输入, y ( n ) y(n) y(n)为和噪声相关的参考信号,那么我们的目的是将 y ( n ) y(n) y(n)作为自适应滤波器的输入,其输出能尽量逼近 y ′ ( n ) y'(n) y(n)。那么经过一段时间的迭代后, e ( n ) e(n) e(n)就会逼近我们想要的原信号 s ( n ) s(n) s(n).

    注意不要把这里的 x ( n ) , y ( n ) x(n),y(n) x(n),y(n)和前文的符号记法混淆。

在这里插入图片描述

然而我们发现,如果 e ( n ) e(n) e(n)不为零,那自适应滤波器在进行迭代的时候始终会得到非零的差值,这样不就相当于输出会逐渐逼近 x ( n ) x(n) x(n)了吗?这也是非常匪夷所思的事情,怎么可能用一个滤波器从噪声信号中还原出原信号呢?

其实,在利用adaptive filter进行noise canceling的时候,有三个前提条件必须得到满足:

  1. E [ s ( n ) y ′ ( n ) ] = 0 E[s(n)y'(n)]=0 E[s(n)y(n)]=0,这要求原信号和噪声信号不相关
  2. E [ y ( n ) y ′ ( n ) ] ≠ 0 E[y(n)y'(n)]\neq0 E[y(n)y(n)]=0,即要求用于参考的信号和噪声信号相关,并且相关程度越大越好
  3. E [ s ( n ) ] = 0 E[s(n)]=0 E[s(n)]=0,希望原信号是一个均值为零的信号

有了这三个条件,我们再来看前述的内容就好理解了。$ s(n) 的 期 望 为 零 而 又 不 恒 等 于 零 , 则 在 渐 进 收 敛 的 过 程 中 , 的期望为零而又不恒等于零,则在渐进收敛的过程中, e(n) 在 一 段 时 间 内 为 正 一 段 时 间 为 负 , 这 样 对 于 滤 波 器 的 参 数 在一段时间内为正一段时间为负,这样对于滤波器的参数 \omega$来说,其实是保持动态静止或者说于最优值附近轻微波动的(当几乎收敛的时候,根据参数的更新公式,当误差为正则向正方向更新一步,误差为负则向反方向更新一步,总的结果是保持不变的,但在还未收敛的时候,总有一个方向上更新的距离会超过另一个方向,这个更新步长较大的方向就是趋向解的方向)。

因此,我们避免了" ω \omega ω不断更新使得 y ( n ) y(n) y(n)经过滤波器后的输出逼近 x ( n ) x(n) x(n)”这种给谬论。比如语音信号、心电信号、还有其他许多电信号都有这样的性质,把直流值当成零参考点,其震荡信号的均值为零,这就很好地符合了第三条要求。

笔者也有看到将自适应滤波视为去相关操作的解释:若输入和参考信号有关,就能够利用相关性动态计算参数 ω \omega ω使得输出不断逼近参考信号,而对于无关信号(在这里就是 s ( n ) s(n) s(n),没有被噪声污染的原信号)则不去理会。在此例中参考输入 y ( n ) y(n) y(n)是一个和噪声 y ′ ( n ) y'(n) y(n)高度相关的信号,而原信号即需要被还原出来的信号 s ( n ) s(n) s(n)则于参考输入无关。

我们也拿典型的AEC应用进行说明,在此场景下,我们希望消除麦克风采集到扬声器中的声音所产生的回声(你应该也有这样的经历,在线上会议或免提通话时,我们的声音在对方的扬声器中播放时又被对方的麦克风采集到,随后这段信号再次由信道传播回我们的扬声器中播放出来,形成回声),那么期望的 e ( n ) e(n) e(n)应该是麦克风采集到的去除回声之后我们说话的声音

在这里插入图片描述

AEC的应用场景示意图,图源本节末的链接

我们会发现,这里其实增加了一个DTD(double talk detection)模块,他用于检测当前双方是否在说话。这又有什么用呢?前述进行noise canceling的时候必须满足三个条件,在实际情况中第二条是比较容易实现的,但是1、3满足起来就比较困难了,因此利用DTD,回声消除的模式如下:

  • 远端语音存在,近端语音不存在:滤波、自适应滤波器系数更新(对方说话我们不说话)
  • 远端语音存在,近端语音存在:滤波(两方都说话)
  • 远端语音不存在:什么都不用做(没信号过来,没必要做任何动作)

很容易就能发现,我们只有在原信号 s ( n ) s(n) s(n)(我们说话的声音)为零的时候即第一种情况,才会对滤波器的参数进行更新,这就避免了原信号和希望消除的噪声信号之间的耦合导致参数更新不准确的问题。在这种情况下,自适应滤波器的作用原理反倒和接下来要介绍的系统辨识有些相像了:其实我们在利用自适应滤波器去模拟回声路径,让输入经过自适应滤波器后的输出和输入通过环境反射交杂后产生的输出尽量接近。

关于AEC更详细的综述,可以参考这篇文章:声学回声消除原理与实现

  • 系统辨识(应用于控制等)

    对于系统辨识的应用,我们希望自适应滤波器可以模拟出待估系统的行为。这里, y ( n ) = x ( n ) y(n)=x(n) y(n)=x(n),滤波器的输出和原系统的输出作差得到误差信号,将此误差输入自适应算法,经过数次迭代 x ( n ) x(n) x(n)将会逐渐逼近参考信号 y ( n ) y(n) y(n)。也就是说,虽然系统内部结构不同,但是自适应滤波器复刻了 G ( s ) G(s) G(s)的传递函数。

    在这里插入图片描述

    在模型十分复杂的情况下,我们就可以使用adaptive filter去逼近模型的黑箱。用一个直观的低维实例来说,就是在用一条直线去逼近一个复杂的曲线。当然,你可以用更高阶数的自适应滤波器从而达到更好的效果,或是在此之后增加其他的非线性拟合部分。

  • 估计(预测)

    很多读者初看这个应用,会觉得有些无厘头,为什么能够利用过去的值得到当前值呢?请记住,自适应滤波器虽然使用限制相对维纳滤波器放宽了许多,但是仍然要求信号在短时间内能够保持一致的统计特性或不至于变化太多,如果是一个剧烈时变的信号显然我们无法通过历史数据序列来预测将来时刻的值的。

    对于已经学习过R在这里插入图片描述
    循环神经网络的同学来说,我们可以将自适应滤波器看成是单层RNN,滑窗范围就是参与计算的历史序列长度 n n n。不过两者稍有区别,自适应滤波器的参数会一直保持更新,而RNN需要先训练再使用,或者我们将前者看作是一种一直处于学习状态的RNN。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值