滤波算法:经典卡尔曼滤波

这两天学习了一些卡尔曼滤波算法的相关知识。相比其它的滤波算法,卡尔曼滤波在对计算量需求非常之低,同时又能达到相当不错的滤波结果。

1. 算法原理

网上看到一篇文章http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/对卡尔曼滤波讲解的十分形象透彻,国内也有这篇文章的中文翻译版,链接:https://blog.csdn.net/u010720661/article/details/63253509,这里还是先简单的介绍一下。

卡尔曼滤波实质上就是基于观测值以及估计值二者的数据对真实值进行估计的过程。预测步骤如图1所示:

图1 卡尔曼滤波原理流程图

假设我们能够得到被测物体的位置和速度的测量值,在已知上一时刻的最优估计值以及它的协方差矩阵的条件下(初始值可以随意取,但协方差矩阵应为非0矩阵),则有,即:

                                             (1)

而此时,

                   (2)

如果我们加入额外的控制量,比如加速度,此时,则此时:

                                (3)

同时,我们认为我们对系统的估计值并非完全准确,比如运动物体会突然打滑之类的,即存在一个协方差为的噪声干扰。因此,我们需要对加上系统噪声来保证描述的完备性。综上,预测步骤的表达如下所示:

                                                        (4)

                                                       (5)

由于误差累积的作用,单纯对系统进行估计会导致估计值越来越离谱,因此我们以传感器的观测数据对我们的估计进行修正。我们可以用与预测步骤类似的方法将估计值空间映射至观测值空间,如下式所示:

                                                            (6)

                    (7)

我们假设观测值为。同时由于观测数据同样会存在噪声干扰问题,比如传感器噪声等,我们将这种噪声的分布用协方差表示。此时,观测值与估计值处于相同的状态空间,但具有不同的概率分布,如图2所示:

图2 估计值与观测值概率分布示意图

我们可以认为,这两个概率分布的重叠部分,会更加趋近系统的真实数据,即有更高的置信度,比如我们估计汽车速度是5~10km/h,传感器反馈的速度是8~12km/h,那我们有理由认为汽车的实际速度更趋近于8~10km/h这个区间。

这里将观测值与估计值两个分布的高斯分布相乘,其结果的高斯分布描述如下:

                                                            (8)

                                                        (9)

                                                                  (10)

式中:描述高斯分布的协方差,表示高斯分布的均值,矩阵称为卡尔曼增益矩阵。

那么,将估计值以及观测值代入式(8)至式(10),可以得到:

               (11)

                                              (12)

               (13)

式中,称为卡尔曼增益。

将式(11)至式(13)中约去,并化简可得:

                                                     (14)

                                                         (15)

                                                                  (16)

即为我们所得到的最优估计值,同时为其对应的协方差矩阵。在实际应用中,只需要使用式(4)、式(5)以及式(14)至式(16)这5个方程即可实现完整的卡尔曼滤波过程。

在对单一信号源滤波的场合,由于测量值与估计值具备几乎完全相同的概率分布,为了更好的实现去噪效果,在假定被测对象变化不显著的情况下,可以将之前(1~N)个时间节点的测量值随机作为当前时间节点的测量值,以实现更好的去噪效果。原则上,N取值越大滤波效果越好,但也会导致滤波结果滞后越严重。

2. 算法实现

function output = kalmanFilter(data, Q, R, N)

if ~exist(‘Q‘, ‘var‘)
    Q = 0.01;
end
if ~exist(‘R‘, ‘var‘)
    R = 1;
end
if ~exist(‘N‘, ‘var‘)
    N = 0;
end

X = 0;
P = 1;
A = 1;
H = 1;

output = zeros(size(data));

for ii = N + 1 : length(data)
   X_k = A * X;
   P_k = A * P * A‘ + Q;
   Kg = P_k * H‘ / (H * P_k * H‘ + R);
   z_k = data(ii - round(rand() * N));
   X = X_k + Kg * (z_k - H * X_k);
   P = (1 - Kg*H) * P_k;
   output(ii) = X;
end

end

  

3. 算法分析

采用经典卡尔曼滤波对虚拟信号及真实信号进行滤波,结果如下图所示:

.

图3 经典卡尔曼滤波对虚拟信号滤波结果

图4 经典卡尔曼滤波对真实信号滤波结果

从滤波结果中可以看出,经典卡尔曼对信号的滤波效果较为优秀,实时性相对较好,计算量需求极小,能够有效去除高斯噪声以及非高斯噪声,基本不受脉冲信号影响。在对被测系统的建模较为精确的条件下,其性能还能够进一步提升。其缺点主要在于需人为给定系统模型,当系统模型不精确时滤波效果会有所下降,但可以通过增加采样频率解决此问题。

建议应用场合:输入信号相对平稳或已知被测系统运动学模型,同时要求运算量极小的场合。

原文地址:https://www.cnblogs.com/wt88/p/12103757.html

时间: 2024-08-28 08:34:19

滤波算法:经典卡尔曼滤波的相关文章

81.视频图像去噪滤波算法的相关介绍

一.为什么要去噪 图像去噪是数字图像处理中的重要环节和步骤.去噪效果的好坏直接影响到后续的图像处理工作如图像分割.边缘检测等.图像信号在产生.传输过程中都可能会受到噪声的污染,一般数字图像系统中的常见噪声主要有:高斯噪声(主要由阻性元器件内部产生).椒盐噪声(主要是图像切割引起的黑图像上的白点噪声或光电转换过程中产生的泊松噪声)等:所以前端的滤波没做好的话,会给后端的图像处理带来很多的麻烦,其实它最终的反应是图像在显示器上给人的视觉效果,我们要针对不同的应用达到最大优化. 二.怎么去噪 纵观网上

经典滤波算法总结

第1种方法限幅滤波法(又称程序判断滤波法) A方法 根据经验判断,确定两次采样允许的最大偏差值(设为A) 每次检测到新值时判断: 如果本次值与上次值之差<=A,则本次值有效 如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值 B优点 能有效克服因偶然因素引起的脉冲干扰 C缺点 无法抑制那种周期性的干扰 平滑度差 /* A 值可根据实际情况调整 value 为有效值,new_value 为当前采样值 滤波程序返回有效的实际值 */ #define A 10 char val

【LeetCode-面试算法经典-Java实现】【107-Binary Tree Level Order Traversal II(二叉树层序遍历II)】

[107-Binary Tree Level Order Traversal II(二叉树层序遍历II)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). For example

【LeetCode-面试算法经典-Java实现】【064-Minimum Path Sum(最小路径和)】

[064-Minimum Path Sum(最小路径和)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either

滑动平均滤波算法(递推平均滤波法)

//滑动平均滤波算法(递推平均滤波法) //ADNum为获得的AD数 //GN为数组value_buf[]的元素个数.该函数主要被调用,利用参数的数组传值 const int GN = 12; int filterPtr = 0; bool isFirst = true; public float gSum = 0; float[] gbuf  = new float[GN]; float GlideFilterAD(float ADNum) { if (isFirst) { isFirst =

基于Vivado HLS在zedboard中的Sobel滤波算法实现

 基于Vivado HLS在zedboard中的Sobel滤波算法实现 平台:zedboard  + Webcam 工具:g++4.6  + VIVADO HLS  + XILINX EDK + XILINX SDK 系统:ubuntu12.04 总体设计思路 sobel 算法理论基础       索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值.在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量. 该

【LeetCode-面试算法经典-Java实现】【056-Merge Intervals(区间合并)】

[056-Merge Intervals(区间合并)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6],[8,10],[15,18], return [1,6],[8,10],[15,18]. 题目大意 给定一个区间集合,合并有重叠的区间. 解题思路 先对区间进行排序.按開始

【LeetCode-面试算法经典-Java实现】【066-Plus One(加一)】

[066-Plus One(加一)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a non-negative number represented as an array of digits, plus one to the number. The digits are stored such that the most significant digit is at the head of the list. 题目大意 给定一个用数组表示的一个数,

【LeetCode-面试算法经典-Java实现】【067-Add Binary(二进制加法)】

[067-Add Binary(二进制加法)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given two binary strings, return their sum (also a binary string). For example, a = "11" b = "1" Return "100" 题目大意 给定两个二进制的字符串,返回它们的和,也是二进行制字符串. 解题思路 先将对应的两个二进制字符串