本文给出了一个MATLAB代码,实现一维自适应扩展卡尔曼滤波(AEKF)和常规扩展卡尔曼滤波(EKF)的对比,用于处理带有噪声的动态系统状态估计。给出源代码下载方式
文章目录
运行结果
状态估计值绘制的曲线如下:
误差曲线如下:
误差的统计特性输出如下(命令行截图):
运行界面的截图如下,标注的部分为动态误差的设计方案:
代码详解
以下是对代码代码的详细介绍:
代码功能概述
-
初始化:
- 清空工作区、命令行和图形窗口,设置随机数种子以确保结果可重复。
- 定义采样率和时间序列,生成系统噪声和观测噪声,并对噪声进行变动处理。
-
生成真实状态和观测数据:
- 在循环中,通过迭代生成真实状态值和未滤波的状态值,同时生成观测值,观测值受观测噪声影响。
-
常规EKF:
- 通过预测和更新步骤实现常规EKF。预测下一时刻的状态和观测,计算状态转移矩阵和观测矩阵,更新状态协方差和状态估计。
-
自适应EKF (AEKF):
- 在AEKF中,采用一种自适应机制,根据残差动态调整过程噪声和观测噪声的协方差,以提高滤波性能。
-
结果展示:
- 绘制理论值、EKF滤波结果和AEKF滤波结果的对比图。
- 计算并绘制滤波前后的状态估计误差,包括最大误差、平均误差和标准差。
- 绘制累计概率密度函数(CDF)图,直观展示不同滤波方法的误差分布。
代码的应用
这段代码主要用于状态估计问题,适合于需要动态系统状态跟踪的应用,如无人驾驶、机器人导航和信号处理等领域。通过比较EKF与AEKF的效果,可以评估自适应滤波在处理动态噪声变化时的优势。
源代码
部分源代码如下:
% 自适应滤波,一维EKF
% 2024-12-08/Ver1
clc;clear;close all;
rng(0);
clear; %清空工作区变量
clc; %清空命令行内容
close all; %关闭所有窗口(主窗口除外)
rng(0); % 设置固定的随机数种子
%% initial
T = 1; %设置采样率
t = T:T:100; %构建时间序列,最后的10是序列总长度
Q0 = 1;w=sqrt(Q0)*randn(size(Q0,1),length(t)); %系统噪声
R0 = 1;v=sqrt(R0)*randn(size(R0,1),length(t)); %观测噪声
% 构造变化的噪声
v(20:50) = 5*v(20:50);
w(40:80) = 0.5*w(40:80);
P0 = 1; %状态协方差
P_num = zeros(length(t),size(P0,1),size(P0,2)); %存放每次迭代的P
P_num(1,:,:) = P0; %记录协方差
X=zeros(1,length(t)); %给状态真实值X分配空间
X_ekf=zeros(1,length(t)); %准备储存滤波后的值
X_aekf=zeros(1,length(t)); %准备储存滤波后的值
X(1) = 3; %给状态值初值赋值
X_(1) = X(1) + w(1); %X_是未滤波的状态,由真实值加上误差生成,这里生成其初值
完整代码下载链接见:
https://gf.bilibili.com/item/detail/1106790012
总结
该代码提供了一种有效的方式来实现和比较扩展卡尔曼滤波和自适应扩展卡尔曼滤波的性能,帮助理解不同滤波方法在动态系统中的应用及其效果。通过可视化和统计分析,用户可以直观地看到不同方法对状态估计精度的影响。
标签:状态,滤波,卡尔曼滤波,扩展,噪声,EKF,源代码,代码 From: https://blog.csdn.net/2401_86544394/article/details/144321341