什么是卡尔曼滤波,卡尔曼增益怎么来的--通俗易懂

参考:详解卡尔曼滤波原理

Kalman滤波再学习-Taylor

使用卡尔曼滤波器进行回声消除

核心思想:将基于预测(先验)和基于测量(后验)的两个高斯分布融合,得到最终的预测值。

什么是卡尔曼滤波:

卡尔曼滤波(Kalman filtering)是一种用于估计系统状态的递归滤波器。它是基于线性动态系统和高斯噪声假设,通过结合系统模型和测量信息,提供最优估计值和最小均方误差的状态估计方法。

卡尔曼滤波器的核心思想是将先验信息(系统模型)和后验信息(测量信息)进行融合,从而获得对系统状态的最优估计。它通过两个主要步骤来实现这一目标:预测和更新

在预测步骤中,卡尔曼滤波器使用系统的状态转移模型来预测当前时刻的状态。这个预测基于先前的状态估计和系统的动态方程。预测步骤输出两个重要的结果:预测状态和预测协方差。

在更新步骤中,卡尔曼滤波器使用测量模型来结合实际的测量值和预测状态,从而修正预测并获得更准确的状态估计。更新步骤输出的结果是更新后的状态估计和更新后的协方差。

卡尔曼滤波器的关键特点是它能够同时处理系统模型的不确定性和测量的不确定性,并通过递归的方式进行状态估计。它通过动态地调整权衡先验和后验信息的权重,以最优的方式利用可用的信息来估计系统的状态。

从卡尔曼滤波名字就可以看出来,其更倾向于滤波。即对系统噪声和测量噪声进行过滤优化,得出更优的结果。如果系统噪声比较强,那么最终结果就会倾向于测量结果,而当测量噪声强时,最终结果就倾向于系统状态方程描述的结果

卡尔曼滤波是个迭代计算过程,不断重复这两步,预测和校正(更新)。校正就是用测量结果和状态方程结果不断计算卡尔曼增益K。K越大越相信测量结果,K越小越相信状态方程描述的结果

总体流程

在这里插入图片描述

步骤(1)预测当前状态x_k和协方差矩阵P_k,得到基于预测的高斯分布
步骤(2) 获取测量值,得到基于测量值的高斯分布
步骤(3)融合两个高斯分布,期间可以得到卡尔曼增益,并得到最终的预测状态和协方差矩阵

1. 预测当前时刻状态

状态转移矩阵 F_k 来表示这个预测过程。
在这里插入图片描述在这里插入图片描述

预测的状态x_k和协方差P_k:
在这里插入图片描述
引入外部控制量和外部干扰:
在这里插入图片描述

2. 用测量值来修正估计值

传感器读取的数据的单位和尺度有可能与我们要跟踪的状态的单位和尺度不一样,我们用测量矩阵 H_k 来表示传感器的数据。
在这里插入图片描述
从测量到的传感器数据中,我们大致能猜到系统当前处于什么状态。但是由于存在不确定性,某些状态可能比我们得到的读数更接近真实状态。我们将这种不确定性(例如:传感器噪声)用协方差R_k,该分布的均值就是我们读取到的传感器数据,称之为z_k描述。
现在我们有了两个高斯分布,一个是在预测值附近,一个是在传感器读数附近。
在这里插入图片描述
剩下的就是重叠部分了,这个重叠部分的均值就是两个估计最可能的值,也就是给定的所有信息中的最优估计

3. 融合高斯分布(卡尔曼增益怎么来的)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上所有公式中,你只需要用到式(7)、(18)、(19)。(如果忘了的话,你可以根据式(4)和(15)重新推导一下)
我们可以用这些公式对任何线性系统建立精确的模型,对于非线性系统来说,我们使用扩展卡尔曼滤波,区别在于EKF多了一个把预测和测量部分进行线性化的过程。

具体AEC任务

在这里插入图片描述
在这里插入图片描述

bilibili - 回声消除 - 卡尔曼滤波

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卡尔曼滤波是一种用于估计系统状态变量的方法,它结合了系统模型和测量数据,通过递归的方式,根据上一时刻的状态估计值和当前时刻的测量值,得到当前时刻的状态估计值。在Simulink中,我们可以使用S-function来实现卡尔曼滤波估计。 S-function是Simulink中的一种自定义模块类型,可以用于实现用户所需的特定功能。下面是一个简单的卡尔曼滤波估计模型的S-function代码示例: ```matlab function [sys,x0,str,ts] = kalman_filter_sfun(t,x,u,flag) switch flag case 0 [sys,x0,str,ts] = init(); case 1 sys = state_update(u); case 3 sys = measurement_update(u); case {2, 4, 9} sys = []; otherwise error(['Unhandled flag = ',num2str(flag)]); end function [sys,x0,str,ts] = init() sizes = simsizes; sizes.NumContStates = 0; sizes.NumDiscStates = 0; sizes.NumOutputs = 1; sizes.NumInputs = 2; sizes.DirFeedthrough = 1; sizes.NumSampleTimes = 1; sys = simsizes(sizes); x0 = []; str = []; ts = [0 0]; function sys = state_update(u) % 获取上一时刻的状态估计值 x_k_1 = x; % 获取当前时刻的输入 u_k = u(1); % 根据系统模型进行状态预测 x_k = A * x_k_1 + B * u_k; % 将当前时刻的状态估计值输出 sys = x_k; function sys = measurement_update(u) % 获取当前时刻的测量值 y_k = u(2); % 计算卡尔曼增益 K = P_k_1 * H' / (H * P_k_1 * H' + R); % 更新状态估计值 x_k = x_k_1 + K * (y_k - H * x_k_1); % 更新状态协方差矩阵 P_k = (I - K * H) * P_k_1; % 将当前时刻的状态估计值输出 sys = x_k; ``` 上述代码实现了一个简单的一维卡尔曼滤波估计模型。其中,state_update函数用于进行状态预测,measurement_update函数用于进行状态更新。具体实现过程中,需要设置系统模型参数(如矩阵A、B、H)、初始状态估计值(如x0)、过程噪声协方差矩阵(如Q)和测量噪声方差(如R),以及相应的状态协方差矩阵P。有关卡尔曼滤波的详细理论和参数设置方法,请参考相关文献和教材。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值