卡尔曼滤波详解:一维卡尔曼滤波实例解析(五个公式以及各个参数的意义)

本文主要是介绍卡尔曼滤波详解:一维卡尔曼滤波实例解析(五个公式以及各个参数的意义),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、引言

本文以rssi(接收信号强度)滤波为背景,结合卡尔曼的五个公式,设计 rssi 一维卡尔曼滤波器,用MATLAB语言实现一维卡尔曼滤波器,并附上代码和滤波结果图;

本文工分为以下几个部分:

1、引言

2、模型的系统方程和状态方程

3、卡尔曼滤波过程及五个基本公式

4、公式中每个参数详细注释

5、结合rssi滤波实例设计滤波器

6、MATLAB实现滤波器

 

二、模型的系统方程和状态方程

  • 系统的状态方程:

\LARGE {\color{DarkBlue} }x_k = Ax_{k-1} + Bu_{k-1} + w_{k-1}

状态方程是根据上一时刻的状态和控制变量来推测当前时刻的状态,\large w_{k-1}是服从高斯分布的噪声,是预测过程的噪声,它对应了 \large x_k 中每个分量的噪声,是期望为 0,协方差为 Q 的高斯白噪声\large w_{k-1} \sim N_{(0, Q))},Q即下文的过程激励噪声Q.

  • 系统的观测方程:

\LARGE z_k = Hx_k + v_k

观测方式是当前时刻的量测信息,\large v_k是观测的噪声,服从高斯分布,\large v_k \sim N_{(0,R)},R即下文的测量噪声R。

  • 卡尔曼滤波算法有两个基本假设:

( 1) 信息过程的足够精确的模型,是由白噪声所激发的线性( 也可以是时变的) 动态系统;

( 2) 每次的测量信号都包含着附加的白噪声分量 。当满足以上假设时,可以应用卡尔曼滤波算法。

 

三、 卡尔曼滤波过程及五个基本公式

  • 卡尔曼滤波时间更新(预测)
  • 1. 向前推算状态变量  

\LARGE \hat{x}_{k}^{-} = A\hat{x}_{k-1} + Bu_{k-1}

  • 2. 向前推算误差协方差

\LARGE P_{k}^{-} = AP_{k-1} A^{T} + Q

  • 卡尔曼滤波测量更新(校正)

  • 3. 计算卡尔曼增益

\LARGE K_k = \frac{P_{k}^{-}{H^T}}{HP_{k}^{-}H^T + R}

  • 4. 由观测变量\large z_k更新估计

\LARGE \hat{x}_k = \hat{x}_{k}^{-} + K_k(z_k - H\hat{x}_{k}^{-})

  • 5. 更新测量误差

\LARGE P_k = (I - K_kH)P_{k}^{-}

 

四、 公式中每个参数详细注释

  1. \LARGE \hat{x}_{k-1}\LARGE \hat{x}_{k}:   分别表示 \LARGE k-1时刻和 \LARGE k时刻的后验状态估计值,是滤波的结果之一,即更新后的结果,也叫最优估计(估计的状态,根据理论,我们不可能知道每时刻状态的确切结果所以叫估计)。

     

  2. \LARGE \hat{x}_{k}^{-}:   \LARGE k 时刻的先验状态估计值,是滤波的中间计算结果,即根据上一时刻(\LARGE k-1时刻)的最优估计预测的\LARGE k时刻的结果,是预测方程的结果。

     

  3. \LARGE P_{k-1} 和 \LARGE P_k:  分别表示 k - 1 时刻和 k 时刻的后验估计协方差(即\LARGE \hat{x}_{k-1} 和 \LARGE \hat{x}_k 的协方差,表示状态的不确定度),是滤波的结果之一。

     

  4. \LARGE P_{k}^{-}:  k 时刻的先验估计协方差(\LARGE \hat{x}_{k}^{-}的协方差),是滤波的中间计算结果。

     

  5. \LARGE H: 是状态变量到测量(观测)的转换矩阵,表示将状态和观测连接起来的关系,卡尔曼滤波里为线性关系,它负责将 m 维的测量值转换到 n 维,使之符合状态变量的数学形式,是滤波的前提条件之一。

     

  6. \LARGE z_k: 测量值(观测值),是滤波的输入。

     

  7. \LARGE K_k: 滤波增益矩阵,是滤波的中间计算结果,卡尔曼增益,或卡尔曼系数。

     

  8. \LARGE A: 状态转移矩阵,实际上是对目标状态转换的一种猜想模型。例如在机动目标跟踪中, 状态转移矩阵常常用来对目标的运动建模,其模型可能为匀速直线运动或者匀加速运动。当状态转移矩阵不符合目标的状态转换模型时,滤波会很快发散。

     

  9. \LARGE Q : 过程激励噪声协方差(系统过程的协方差)。该参数被用来表示状态转换矩阵与实际过程之间的误差。因为我们无法直接观测到过程信号, 所以 Q 的取值是很难确定的。是卡尔曼滤波器用于估计离散时间过程的状态变量,也叫预测模型本身带来的噪声。状态转移协方差矩阵。

     

  10. \LARGE R: 测量噪声协方差。滤波器实际实现时,测量噪声协方差 R一般可以观测得到,是滤波器的已知条件。

     

  11. \LARGE B: 是将输入转换为状态的矩阵。

     

  12. \LARGE (z_k - H\hat{x}_{k}^{-}): 实际观测和预测观测的残差,和卡尔曼增益一起修正先验(预测),得到后验。

 

五、 结合rssi滤波实例设计滤波器

  • 1、 建立模型系统方程和量测方程

由于分析对象是无线信号的一维rssi状态,所以具体空间过程不关心,只需要从发射端发射到接收端接收是没有其他控制状态的,但是在传输过程中是存在噪声的,根据公式

\LARGE {\color{DarkBlue} }x_k = Ax_{k-1} + Bu_{k-1} + w_{k-1}

可得:A 为[1],B为[0],\large w_{k-1}为高斯白噪声可不关心

  • 2、建立量测方程

由于接收设备可直接输出rssi值,根据公式

\LARGE z_k = Hx_k + v_k

可得:H为[1],\large v_k为量测噪声可不关心

  • 3、分析Q和R

假如\large w已经分析出一系列的数据,则\large Q = cov(w);

假如\large v已经分析出一些列的数据,则\large R = cov(v);

  • 4、初始值确定

给滤波过程的初始状态初始化。

  • 5、最后一步,就是对照公式根据理解,套公式,写程序。

 

六、MATLAB实现滤波器 

  • 1、 滤波器设计
function z = kalmanFilter(x)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  function z = kalmanFilter(x)
%
%>
%> @brief 一维卡尔曼滤波
%>
%> @param[out]  z             滤波后的结果
%> @param[in]   x             需要滤波的数据
%>
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 卡尔曼相关变量定义persistent xk xk_1;             % 状态量persistent zk;                  % 观测量persistent A;                   % 状态转移矩阵
%     persistent B;                   % 控制输入模型persistent H;                   % 观测矩阵persistent Pk Pk_1;             % 误差协方差矩阵persistent Q;                   % 状态噪声协方差矩阵persistent R;                   % 观测噪声协方差矩阵% 卡尔曼相关参数初始化if isempty(xk)A = 1;H = 1;Pk = 1;Pk_1 = 1;                   % 初始误差协方差为1Q = 0.01;                   % 反应两个时刻rssi方差R = 0.05;                   % 反应测量rssi的测量精度xk = 0;xk_1 = 0;zk = 0;endI = 1;if xk_1 == 0xk_1 = x;xk = x;elsezk = H*x;                   % 观测量方程% 预测X = A*xk_1;                 % 状态预测P = A*Pk_1*A' + Q;          % 误差协方差预测% 更新(校正)K = P*H'*inv(H*P*H'+R);     % 卡尔曼增益更新xk = X + K*(zk - H*X);      % 更新校正xk_1 = xk;                  % 保存校正后的值,下一次滤波使用Pk = (I - K*H)*P;           % 更新误差协方差Pk_1 = Pk;                  % 保存校正后的误差协方差,下一次滤波使用end% 滤波结果返回z = xk;
end
  • 2、仿真运行
%% 1. 导入数据
[fname, pname] = uigetfile('*', 'Sample Dialog Box');
fileID = fopen(strcat(pname, fname));
data = cell2mat(textscan(fileID,'%f%f','delimiter', ',','headerlines',0));
rssi = data(:, 1);%% 2. 卡尔曼滤波
rssi_opt = zeros(size(rssi,1), 1);
for k = 1:size(rssi,1)rssi_opt(k) = kalmanFilter(rssi(k));
end%% 3. 滤波检验
figure(1);
plot(rssi, 'Color', 'r', 'Marker', 'o'); hold on;
plot(rssi_opt, 'Color', 'b', 'LineStyle', '-', 'Marker', '+'); hold off;
legend('rssi原始波形', 'rssi经过滤波后的波形');
title('rssi滤波对比');
  • 3、运行结果

这篇关于卡尔曼滤波详解:一维卡尔曼滤波实例解析(五个公式以及各个参数的意义)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094180

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)