本文主要是介绍卡尔曼滤波详解:一维卡尔曼滤波实例解析(五个公式以及各个参数的意义),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、引言
本文以rssi(接收信号强度)滤波为背景,结合卡尔曼的五个公式,设计 rssi 一维卡尔曼滤波器,用MATLAB语言实现一维卡尔曼滤波器,并附上代码和滤波结果图;
本文工分为以下几个部分:
1、引言
2、模型的系统方程和状态方程
3、卡尔曼滤波过程及五个基本公式
4、公式中每个参数详细注释
5、结合rssi滤波实例设计滤波器
6、MATLAB实现滤波器
二、模型的系统方程和状态方程
- 系统的状态方程:
状态方程是根据上一时刻的状态和控制变量来推测当前时刻的状态,是服从高斯分布的噪声,是预测过程的噪声,它对应了 中每个分量的噪声,是期望为 0,协方差为 Q 的高斯白噪声,Q即下文的过程激励噪声Q.
- 系统的观测方程:
观测方式是当前时刻的量测信息,是观测的噪声,服从高斯分布,,R即下文的测量噪声R。
- 卡尔曼滤波算法有两个基本假设:
( 1) 信息过程的足够精确的模型,是由白噪声所激发的线性( 也可以是时变的) 动态系统;
( 2) 每次的测量信号都包含着附加的白噪声分量 。当满足以上假设时,可以应用卡尔曼滤波算法。
三、 卡尔曼滤波过程及五个基本公式
- 卡尔曼滤波时间更新(预测)
- 1. 向前推算状态变量
- 2. 向前推算误差协方差
-
卡尔曼滤波测量更新(校正)
- 3. 计算卡尔曼增益
- 4. 由观测变量更新估计
- 5. 更新测量误差
四、 公式中每个参数详细注释
- 和: 分别表示 时刻和 时刻的后验状态估计值,是滤波的结果之一,即更新后的结果,也叫最优估计(估计的状态,根据理论,我们不可能知道每时刻状态的确切结果所以叫估计)。
- : 时刻的先验状态估计值,是滤波的中间计算结果,即根据上一时刻(时刻)的最优估计预测的时刻的结果,是预测方程的结果。
- 和 : 分别表示 k - 1 时刻和 k 时刻的后验估计协方差(即 和 的协方差,表示状态的不确定度),是滤波的结果之一。
- : k 时刻的先验估计协方差(的协方差),是滤波的中间计算结果。
- : 是状态变量到测量(观测)的转换矩阵,表示将状态和观测连接起来的关系,卡尔曼滤波里为线性关系,它负责将 m 维的测量值转换到 n 维,使之符合状态变量的数学形式,是滤波的前提条件之一。
- : 测量值(观测值),是滤波的输入。
- : 滤波增益矩阵,是滤波的中间计算结果,卡尔曼增益,或卡尔曼系数。
- : 状态转移矩阵,实际上是对目标状态转换的一种猜想模型。例如在机动目标跟踪中, 状态转移矩阵常常用来对目标的运动建模,其模型可能为匀速直线运动或者匀加速运动。当状态转移矩阵不符合目标的状态转换模型时,滤波会很快发散。
- : 过程激励噪声协方差(系统过程的协方差)。该参数被用来表示状态转换矩阵与实际过程之间的误差。因为我们无法直接观测到过程信号, 所以 Q 的取值是很难确定的。是卡尔曼滤波器用于估计离散时间过程的状态变量,也叫预测模型本身带来的噪声。状态转移协方差矩阵。
- : 测量噪声协方差。滤波器实际实现时,测量噪声协方差 R一般可以观测得到,是滤波器的已知条件。
- : 是将输入转换为状态的矩阵。
- : 实际观测和预测观测的残差,和卡尔曼增益一起修正先验(预测),得到后验。
五、 结合rssi滤波实例设计滤波器
- 1、 建立模型系统方程和量测方程
由于分析对象是无线信号的一维rssi状态,所以具体空间过程不关心,只需要从发射端发射到接收端接收是没有其他控制状态的,但是在传输过程中是存在噪声的,根据公式
可得:A 为[1],B为[0],为高斯白噪声可不关心
- 2、建立量测方程
由于接收设备可直接输出rssi值,根据公式
可得:H为[1],为量测噪声可不关心
- 3、分析Q和R
假如已经分析出一系列的数据,则;
假如已经分析出一些列的数据,则;
- 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、运行结果
这篇关于卡尔曼滤波详解:一维卡尔曼滤波实例解析(五个公式以及各个参数的意义)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!