卡尔曼滤波和维纳滤波

本文深入探讨了维纳滤波与卡尔曼滤波的基本原理及其应用场景,包括滤波器的设计步骤、数学表达及实际应用案例。通过对比两种滤波方式的特点,帮助读者更好地理解它们的工作机制。
--总觉得网上其他博客上写的都不太适合自己理解,百般翻阅书籍理解了一下,供自己日后复习之用。
本文的程序整理可到此处下载:http://download.youkuaiyun.com/download/sillykog/10123483
  • 用过去的观测值来估计当前或者将来的信号称为预测
  • 用当前和过去的观测值来估计当前信号称为滤波
  • 用过去的观测值估计过去的信号成为平滑或内插

维纳滤波

1.要求

  • 输入过程广义平稳
  • 输入过程的统计特性已知

2.效果

  • 当信号和干扰以及随机噪声同时输入该滤波器时,在输出端将信号尽可能精确表现出来
  • 维纳滤波根据全部过去观测值和当前观测值来估计信号的当前值,解形式是传递函数或单位脉冲响应,说白了就是一个IIR无限单位脉冲滤波器

3.原理

  • 定义误差为观测值减去估计值
    e(n)=s(n)s^(n)

  • 目标函数为最小均方误差
    min E[e2(n)]=min E[(s(n)s^(n))2]

  • 估计值计算如下
    s^(n)=x(n)h(n)=m=+h(m)x(nm)

  • 最小均方误差可表示为
    E[e2(n)]=E[(s(n)s^(n))2]=E[(s(n)m=0+h(m)x(nm))2]

  • 对最小均方误差求对冲击响应的偏导并使其为零得到维纳霍夫方程
    E[e2(n)h(m)=2E[(s(n)m=0+h(m)x(nm))x(nj)],j=0,1,2,...

  • 此时求得的 h(m) hopt(m) ,并有
    Rxs(j)=E[x(nj)s(n)]
    Rxx(jm)=E[x(nm)x(nj)]

  • 维纳霍夫方程方程可化简为
    Rxs(j)=m=0+hopt(m)Rxx(jm),j=0,1,2,...

  • 将方程展开我们可以得到更直观的方程组如下
    j=0Rxs(0)=h(0)Rxx(0)+h(1)Rxx(1)+...+h(N1)Rxx(1N)
    j=1Rxs(1)=h(0)Rxx(1)+h(1)Rxx(0)+...+h(N1)Rxx(2N)
    ........................................................................
    j=N1Rxs(N1)=h(0)Rxx(N1)+h(1)Rxx(N2)+...+h(N1)Rxx(0)

  • 此处假设信号与噪声不相关
    Rxs(m)=E[x(n)s(n+m)]=E[s(n)s(n+m)+w(n)s(n+m)]=E[s(n)s(n+m)]=Rss(m)
    Rxx(m)=E[x(n)x(n+m)]=E[(s(n)+w(n))(s(n+m)w(n+m))]=Rss(m)+Rww(m)
  • 则维纳霍夫方程可化简为
    Rss(j)=m=0+hopt(m)Rss(jm)Rww(jm),j=0,1,2,...

4.应用



Figure 1. 原始音频序列 Figure 2. 添加噪声序列



Figure 3. 含噪音频序列 Figure 4. 维纳滤波序列

  • 滤波之后得到的结果是基于最小均方误差的,所以也没有办法完全恢复原始序列,但总比含噪的序列效果好一些。该例程程序见文章开头下载连接,本例是直接在时域上进行求解,但时域求解毕竟还是针对较短的序列,数据量一大就无法计算了。

  • 这里要强调的一点是许多网上流传的维纳滤波的程序均是转换到频域上求解,但由于维纳滤波方程t>0的因果性约束,是无法直接频谱相除求解的,必须要用频谱分解法或者伯德-香农的白化法。但以上两种频域解法都是针对特定功率谱函数的,所以需要对系统进行建模,应用起来其实也不方便的,具体内容还是请大家查阅相关资料会清楚一些。



  • 由左边序列训练得到维纳滤波的最佳冲击脉冲序列,并对右边序列进行滤波我们可以看到维纳滤波的效果,维纳滤波其实就是一个去相关的过程,对与期望信号不相关的噪声进行最大抑制其实就是维纳滤波器的实际作用,但麻烦就麻烦在维纳滤波器需要一组预训练的期望信号,这在实际当中基本上是做不到的,所以维纳滤波始终不能被广泛应用。



  • 另一个方面的话,为什么维纳滤波要求考虑之前所有的观测值呢,这是由于维纳滤波器的一个时效性的问题,由1~N时刻的观测数据计算得到的滤波器直接应用在N+1~2N时刻上,我们发现效果是极差的,因此还是要根据之前所有的观测数值来考虑维纳滤波器的冲击序列h(n)




卡尔曼滤波

1.要求

  • 能用卡尔曼滤波的前提是这个系统是可观测的。
  • 相比于维纳滤波,卡尔曼滤波可以适用于非平稳随机过程,而且可以递推实现

2.效果

  • 卡尔曼滤波是在已知系统和量测的数学模型、量测噪声统计特性及系统状态初值的情况下,利用输出信号的量测数据和系统模型方程,实时获得系统状态变量和输入信号的最优估计值。它是一种线性、无偏、且误差方差最小的随机系统最优估计算法。

3.原理

  • 假设线性离散系统模型如下
    状态方程 xk=Φk,k1xk1+Γk,k1ωk1
    测量方程 zk=Hkxk+νk

  • 一般情况下我们假定
    E[ωk1]=0,Rωω(k,j)=Qkδkj
    E[νk]=0,R(k,j)=Qννδkj

(设 x^k|k1 为k时刻的估计值, x^k|k 为k时刻的最优估计值(修正值))

  • k时刻估计值为
    x^k|k1=Φk,k1x^k1|k1
  • k时刻观测值
    z^k|k1=Hkx^k|k1

  • 由预测偏差修正状态估计量
    x^k|k=x^k|k1+Kk[zkz^k|k1]=x^k|k1+Kk[zkHkx^k|k1]

  • 目标函数为最小误差方差
    min E[(xkx^k|k)(xkx^k|k)T]

  • 由下式
    xkx^k|k=xkx^k|k1Kk[zkHkx^k|k1]=xkx^k|k1Kk[Hkxk+νkHkx^k|k1]=[IKkHk](xk1x^k1|k1)Kkνk

  • 误差方差可等价于
    Pk|k=E[(xkx^k|k)(xkx^k|k)T]=[IKkHk]Pk|k1[IKkHk]T+KkRkKTk

  • K_k的选择是使得 tr(Pk|k) 最小,求 tr(Pk|k)Kk=0 得到
    Kk=Pk|k1HTk(HkPkk1HTk+Rk)1
    Pk|k=[IKkHk]Pk|k1
    Pk|k1=Φk,k1Pk1|k1ΦTk,k1+Γk,k1Qk1ΓTk,k1

4.应用

  • 能用卡尔曼滤波的前提是这个系统是可观测的
  • 卡尔曼滤波也可以处理观测方程带乘性噪声的系统,不过公式要复杂得多
  • 如果系统的噪声统计特性不变(高斯白噪声,均值和方差不变),而且是线性系统,是不用一直迭代着算卡尔曼增益的,直接求卡尔曼增益的稳态值即可
  • 应用中大多数情况下大家其实并不知道建模噪声和观测噪声的统计特性,一般是假定为零均值,方差会去试

  • 使用卡尔曼滤波对信号进行跟踪,测量误差为高斯噪声。


跟随信号为一次函数时,左图是观测量与噪声数值相近,因此估计值的效果较差,右图是观测量远大于噪声,因此得到了较好的跟踪效果。

  • 关于卡尔曼滤波的过程有必要再提一点的是关于卡尔曼增益阵K
  • 卡尔曼滤波的修正方程为
    xk|k=xk|k1+Kk[zkHkxk|k1]
  • 可知是由卡尔曼增益阵K来对观测量和估计量进行折中的。
    K=Pk|k1HTk[HkPk|k1HTk+Rk]1
  • 特别的当H为单位阵时
    K=Pk|k1[Pk|k1+Rk]1

我们可以知道,当P变大时,即上一次的修正值不准确,则R不变情况下,K也随着变大,因此下一次的修正值会增加对观测值的权重。当P变小,即上一次修正值较准确,则R不变情况下,K变小,下一次的修正值会增加对估计值的权重。特别的当误差R变大时,其K变小,也即系统测量噪声太大,修正值会更侧重于估计值。从实际上看,我们发现卡尔曼滤波的思想是既不相信观测值,又不相信估计值,但误差较大的时候,才会相信观测值。

上面的图片是期望信号和滤波信号,下面的图片是观测信号,可以看到由于状态转移方程不能真实对正弦函数进行线性关系建模,因此导致误差非常大,结果滤波信号完全取决于观测值了

总结

  • 作为现代控制理论一部分的维纳滤波和卡尔曼滤波一定程度上解决了对含噪信号的最优估计,但维纳滤波在实际适用中受限,即便当其为因果滤波器,要得到半无限时间区间内的全部观测数据也很难满足,同时也不能用于噪声为非平稳的随机过程,对于向量情况应用不方便。基本上还是适用于一维平稳序列的最小均方误差估计。卡尔曼滤波在信号估计上有十分强大的实用性,但页由于状态估计方程的限制,卡尔曼的理论基本局限于线形系统。
### 卡尔曼滤波维纳滤波的区别 卡尔曼滤波维纳滤波是两种重要的状态估计信号处理技术,它们在原理、适用场景计算方式上存在显著差异。 #### 原理上的区别 维纳滤波是一种经典的线性滤波方法,其核心思想是通过最小化均方误差来设计一个最优滤波器,从而从噪声中提取有用信号。它假设输入信号是平稳随机过程,并且已知信号噪声的统计特性(如功率谱密度)。维纳滤波器的设计基于频域分析,在稳态条件下提供最优估计,但它不适用于动态系统状态随时间变化的情况。 相比之下,卡尔曼滤波是一种递归滤波方法,专门用于动态系统的状态估计。它结合了系统的数学模型观测数据,通过预测-更新的机制逐步修正状态估计。卡尔曼滤波假设系统是线性的,并且噪声服从高斯分布。它能够在时域中实时处理非平稳信号,并且在每一步都提供最优估计,这使得它在动态系统中表现优异。 #### 应用场景的区别 维纳滤波主要应用于信号处理领域,例如语音增强、图像去噪、通信系统中的信号恢复等。由于维纳滤波依赖于信号的平稳性假设,它更适合于处理静态或缓慢变化的信号[^5]。 卡尔曼滤波则广泛应用于动态系统状态估计,如机器人定位、自动驾驶车辆的传感器融合、航空航天中的导航系统等。它特别适合处理具有时间演化特性的系统,能够实时更新状态估计并适应系统的变化[^4]。此外,卡尔曼滤波的扩展形式(如扩展卡尔曼滤波EKF无迹卡尔曼滤波UKF)可以处理非线性系统,进一步拓展了其应用范围[^2]。 #### 计算复杂度与实现方式 维纳滤波通常需要在频域中进行设计实现,计算过程较为复杂,且不适合实时更新。它的设计依赖于信号的统计特性,一旦系统动态发生变化,滤波器需要重新设计。 卡尔曼滤波则采用递归算法,能够在时域中逐步更新状态估计,适合实时计算。它不仅利用了系统的动态模型,还结合了观测数据,使得估计过程更加精确高效。这种特性使其在嵌入式系统高速控制系统中具有广泛应用[^5]。 #### 适用性与扩展性 维纳滤波的适用性受限于信号的平稳性线性假设,难以处理复杂的非线性系统。而卡尔曼滤波通过其扩展形式(如EKF、UKF)可以有效应对非线性系统,并且能够处理多传感器融合、分布式系统等复杂场景[^2]。 ### 示例代码:卡尔曼滤波的基本实现 以下是一个简单的卡尔曼滤波器实现示例,用于估计一维系统的状态: ```python class KalmanFilter: def __init__(self, initial_state, initial_error, process_noise, measurement_noise): self.state = initial_state self.error = initial_error self.process_noise = process_noise self.measurement_noise = measurement_noise def update(self, measurement): # 计算卡尔曼增益 kalman_gain = self.error / (self.error + self.measurement_noise) # 更新状态估计 self.state += kalman_gain * (measurement - self.state) # 更新估计误差 self.error = (1 - kalman_gain) * self.error def predict(self): # 预测下一状态(假设系统模型为恒等变换) self.state = self.state # 更新预测误差 self.error += self.process_noise # 示例使用 kf = KalmanFilter(initial_state=0.0, initial_error=1.0, process_noise=0.01, measurement_noise=0.1) measurements = [0.1, 0.2, 0.3, 0.4, 0.5] for z in measurements: kf.update(z) kf.predict() print(f"Estimated state: {kf.state}") ``` ### 总结 卡尔曼滤波维纳滤波在原理、应用场景计算方式上各有特点。维纳滤波适用于静态或平稳信号处理,而卡尔曼滤波则更适合动态系统的状态估计,尤其是在需要实时性递归更新的场合。随着技术的发展,卡尔曼滤波的扩展形式在非线性系统中的应用也日益广泛。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值