基于Matlab实现卡尔曼滤波、卡尔曼平滑器和缺失数据插值

简介: 基于Matlab实现卡尔曼滤波、卡尔曼平滑器和缺失数据插值

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信      无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机

⛄ 内容介绍

针对传统的维纳滤波器实现过程中存在的运算量过于复杂且只能处理平稳和一维信号的缺点,结合卡尔曼滤波相关理论,使用MATLAB软件,设计算法,实现了可以用来处理多维和非平稳的随机信号的卡尔曼滤波器.测试结果表明,卡尔曼滤波器在语音去噪,目标追踪中效果更为显著,功能更加强大.该研究为信号处理技术的进一步发展提供了价值.

⛄ 部分代码

clear;

clf;

close all;

rng(3);


n = 50;

a = .7;

tau = 20; %missing entries tau1 to tau2

tau1 = 20;

tau2 = 29;

yplot = [0:51];

%generate errors in X

v = randn(n,1);

Q = 1; %error variance. NOTE: need to modify above function if changed


vecX(:,1) = v(1);

for i = 2:n

   vecX(:,i) = a * vecX(:,i - 1) + v(i);

end


for i = 1:n

   H(:, i) = 1;

end

for i = tau1:tau2

   H(:, i) = 0;

end

H = permute(H, [2 1]);


for i = 1:n

   vecY(i) = H(i, 1)' * vecX(:, i);

end


% Xhat(:,:,1) = 0';

% P(:,:,1) = 1; %note: error variance = 1 here


% for i = 2:n + 1

%     if i ~= tau + 1

%         partK = P(:, :, i - 1)*H(:,:,i - 1)*inv( H(:,:,i - 1)' * P(:, :, i - 1) *H(:,:,i - 1));

%         Xhatt(:,:,i - 1) = Xhat(:, :, i - 1) + F(:, :, i - 1)* partK * (vecY(i - 1) - H(:, :, i - 1)' * Xhat(:,:, i - 1));

%         Xhat(:, :,i) = F(:, :, i - 1)*Xhatt(:, :, i - 1);

%         Pt(:,:,i - 1) = P(:,:,i - 1) - partK * H(:,:,i - 1)' *P(:,:,i - 1);

%         P(:,:,i) = F(:,:,i - 1)* Pt(:,:,i - 1) * F(:, :, i - 1)' + [1 0; 0 0];          

%     else

%         Xhatt(:,:,i - 1) = Xhat(:, :, i - 1);

%         Xhat(:, :,i) = F(:, :, i - 1)*Xhat(:, :, i - 1);

%         Pt(:,:, i - 1) = P(:, :, i - 1);

%         P(:,:,i) = F(:,:,i - 1)*  P(:,:,i - 1) * F(:,:, i - 1)' + [1 0; 0 0];

%     end

% end

Xhat = vecY;

for i = tau1:tau2

   Xhat(i) = a * Xhat(i - 1);

end



%plot(Xhat, 'color','black');

figure('Name','Blue: state. Red: missing data. Green: filter. Black: smoother.')

hold on

plot(vecX(1:tau1 - 1),'color','blue')

plot(yplot(tau2 + 2:n + 1),vecX(tau2 + 1:n),'color','blue')

plot(yplot(tau1 + 1:tau2 + 1),vecX(1,tau1:tau2),'color','red');

plot(yplot(tau1 + 1:tau2 + 1),Xhat(1, tau1:tau2),'color','green')


for i = 1:tau1 - 1

   P(i) = Q;

   Pt(i) = 0;

end

for i = tau1:tau2

   P(i) = a^2 * Pt(i - 1) + Q;

   Pt(i) = P(i);

end

for i = tau2 + 1:n    

   P(i) = Q;

   Pt(i) = 0;

end

P(tau2 + 1) = a^2 * Pt(tau2) + Q; %note: above loop just fills a 0 for P(tau2 + 1). This is correct value.


for i = 1:n

   J(i) = 0;

end

for i = tau1:tau2

   J(i) = a*Pt(i)*(1/P(i + 1));

end


Xhat2 = Xhat;

Xhat2(tau2 + 1) = a*Xhat(tau2); %prediction of next available point from last missing point


Xs = Xhat;

for i = tau2:-1:tau1

   Xs(i) = Xhat2(i) + J(i)*(Xs(i + 1) - Xhat2(i + 1));

end


plot(yplot(tau1 + 1:tau2 + 1),Xs(tau1:tau2),'color','black');


% for i = tau:n

%     J(:,:,i) = Pt(:,:,i) *F(:,:,i)' * inv(P(:,:,i + 1));

% end

%

% S(:,:,n + 1) = Xhat(:,:,n + 1);

% for i = 1:n

%     S(:,:,n + 1 - i) = Xhatt(:,:,n + 1 - i) + J(:,:,n + 1 - i) * (S(:,:,n + 2 - i) - Xhat(:,:,n + 2 - i));

% end

%

% %plot(S(1,:));

%

%

% r(:,n + 1) = [0 0]';

% for i = n:-1:tau + 1

%     r(:,i) = H(:,:,i)*inv(H(:,:,i)' * P(:,:,i + 1) * H(:,:,i)) ...

%           + (F(:,:,i) - F(:,:,i)*P(:,:,i + 1)*H(:,:,i)*inv(H(:,:,i)' * P(:,:,i + 1) * H(:,:,i))*H(:,:,i)')*r(:,i + 1);

% end

% r(:,tau) = F(:,:,tau) * r(:,tau + 1);

% for i = tau - 1:-1:1

%     r(:,i) = H(:,:,i)*inv(H(:,:,i)' * P(:,:,i + 1) * H(:,:,i)) ...

%           + (F(:,:,i) - F(:,:,i)*P(:,:,i + 1)*H(:,:,i)*inv(H(:,:,i)' * P(:,:,i + 1) * H(:,:,i))*H(:,:,i)')*r(:,i + 1);

% end

% for i = 2:n + 1

%     S2(:,i) = Xhat(i) + P(:,:,i)*r(:,i - 1);

% end

%

% %plot(S2(1,:));

% %vecY = [0 vecY'];

% %plot(vecY);




%%%%%%%%%%%%%%%%OLD CODE%%%%%%%%%%%%%%%%%


%set F to vary correctly with time

% for i = 1:tau1 - 1

%     F(:, :, i) = [a 0; 0 1];

% end

% for i = tau1:tau2

%     F(:, :, i) = [a 0; 1 0];

% end

% for i = tau2+1:n

%     F(:, :, i) = [a 0; 0 1];

% end

%

% for i = 1:n

%     vecv(:,:,i) = [v(i) 0];

% end

% vecv = permute(vecv, [2 1 3]);

%

% vecX(:,:,1) = [0 0]';

% for i = 1:n

%     vecX(:,:,i + 1) = F(:,:,i) * vecX(:, :, i) + vecv(:, :, i);

% end

%

% for i = 1:n

%     H(:, :, i) = [1 0];

% end

% H(:, :, tau) = [0 0];

% H = permute(H, [2 1 3]);

%

% for i = 1:n

%     vecY(i) = H(:, :, i)' * vecX(:, :, i + 1);

% end

% vecY = vecY';

%

% Xhat(:,:,1) = [0 0]';

% P(:,:,1) = [1 0; 0 0]; %note: error variance = 1 here

%

% for i = 2:n + 1

%     if i ~= tau + 1

%         partK = P(:, :, i - 1)*H(:,:,i - 1)*inv( H(:,:,i - 1)' * P(:, :, i - 1) *H(:,:,i - 1));

%         Xhatt(:,:,i - 1) = Xhat(:, :, i - 1) + F(:, :, i - 1)* partK * (vecY(i - 1) - H(:, :, i - 1)' * Xhat(:,:, i - 1));

%         Xhat(:, :,i) = F(:, :, i - 1)*Xhatt(:, :, i - 1);

%         Pt(:,:,i - 1) = P(:,:,i - 1) - partK * H(:,:,i - 1)' *P(:,:,i - 1);

%         P(:,:,i) = F(:,:,i - 1)* Pt(:,:,i - 1) * F(:, :, i - 1)' + [1 0; 0 0];          

%     else

%         Xhatt(:,:,i - 1) = Xhat(:, :, i - 1);

%         Xhat(:, :,i) = F(:, :, i - 1)*Xhat(:, :, i - 1);

%         Pt(:,:, i - 1) = P(:, :, i - 1);

%         P(:,:,i) = F(:,:,i - 1)*  P(:,:,i - 1) * F(:,:, i - 1)' + [1 0; 0 0];

%     end

% end

%

% plot(vecX(1,:),'color','blue')

% hold on

% plot(yplot(tau1 + 2:tau2 + 2),vecX(1,tau1 + 1:tau2 + 1),'color','red');

% %plot (Xhat(1, :))

%

% for i = tau:n

%     J(:,:,i) = Pt(:,:,i) *F(:,:,i)' * inv(P(:,:,i + 1));

% end

%

% S(:,:,n + 1) = Xhat(:,:,n + 1);

% for i = 1:n

%     S(:,:,n + 1 - i) = Xhatt(:,:,n + 1 - i) + J(:,:,n + 1 - i) * (S(:,:,n + 2 - i) - Xhat(:,:,n + 2 - i));

% end

%

% %plot(S(1,:));

%

%

% r(:,n + 1) = [0 0]';

% for i = n:-1:tau + 1

%     r(:,i) = H(:,:,i)*inv(H(:,:,i)' * P(:,:,i + 1) * H(:,:,i)) ...

%           + (F(:,:,i) - F(:,:,i)*P(:,:,i + 1)*H(:,:,i)*inv(H(:,:,i)' * P(:,:,i + 1) * H(:,:,i))*H(:,:,i)')*r(:,i + 1);

% end

% r(:,tau) = F(:,:,tau) * r(:,tau + 1);

% for i = tau - 1:-1:1

%     r(:,i) = H(:,:,i)*inv(H(:,:,i)' * P(:,:,i + 1) * H(:,:,i)) ...

%           + (F(:,:,i) - F(:,:,i)*P(:,:,i + 1)*H(:,:,i)*inv(H(:,:,i)' * P(:,:,i + 1) * H(:,:,i))*H(:,:,i)')*r(:,i + 1);

% end

% for i = 2:n + 1

%     S2(:,i) = Xhat(i) + P(:,:,i)*r(:,i - 1);

% end

%

% %plot(S2(1,:));

% %vecY = [0 vecY'];

% %plot(vecY);

⛄ 运行结果

⛄ 参考文献

[1] 王新, 张绍良. 基于MATLAB的卡尔曼滤波在变形监测数据处理中的应用[J].  2011.

[2] 谭菊华, 王涛. 基于MATLAB实现卡尔曼滤波器的设计[J]. 计算机光盘软件与应用, 2011(7):1.

[3] 毛静. 基于MATLAB的卡尔曼滤波器设计[J]. 软件工程师, 2015(10):2.

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料


相关文章
|
3月前
|
传感器 机器学习/深度学习 算法
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
241 1
|
3月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
349 0
|
3月前
|
机器学习/深度学习 算法 安全
【图像处理】使用四树分割和直方图移动的可逆图像数据隐藏(Matlab代码实现)
【图像处理】使用四树分割和直方图移动的可逆图像数据隐藏(Matlab代码实现)
168 2
|
2月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
126 0
|
3月前
|
传感器 资源调度 算法
基于无迹卡尔曼滤波(UKF)与模型预测控制(MPC)的多无人机避撞研究(Matlab代码实现)
基于无迹卡尔曼滤波(UKF)与模型预测控制(MPC)的多无人机避撞研究(Matlab代码实现)
171 1
|
3月前
|
机器学习/深度学习 传感器 算法
基于不变扩展卡尔曼滤波器RI-EKF的同时定位与地图构建SLAM算法的收敛性和一致性特性研究(Matlab代码实现)
基于不变扩展卡尔曼滤波器RI-EKF的同时定位与地图构建SLAM算法的收敛性和一致性特性研究(Matlab代码实现)
112 2
|
2月前
|
存储 监控 并行计算
目标跟踪中常用点迹航迹数据关联算法的MATLAB实现
通过计算测量点与预测点之间的欧氏距离,选择最近邻点进行关联,适用于单目标跟踪场景。
|
3月前
|
传感器 算法 Shell
【使用卡尔曼滤波器将陀螺仪和加速度计的读数融合,以获取IMU的姿态(四元数)】实现了所谓的“零速度更新”算法,用于行人跟踪(步态跟踪)(Matlab代码实现)
【使用卡尔曼滤波器将陀螺仪和加速度计的读数融合,以获取IMU的姿态(四元数)】实现了所谓的“零速度更新”算法,用于行人跟踪(步态跟踪)(Matlab代码实现)
157 8
|
3月前
|
传感器 机器学习/深度学习 算法
【室内导航通过视觉惯性数据融合】将用户携带的智能手机收集的惯性数据与手机相机获取的视觉信息进行融合研究(Matlab代码实现)
【室内导航通过视觉惯性数据融合】将用户携带的智能手机收集的惯性数据与手机相机获取的视觉信息进行融合研究(Matlab代码实现)
162 2
|
3月前
|
传感器 资源调度 算法
【数据融合】【状态估计】基于KF、UKF、EKF、PF、FKF、DKF卡尔曼滤波KF、无迹卡尔曼滤波UKF、拓展卡尔曼滤波数据融合研究(Matlab代码实现)
【数据融合】【状态估计】基于KF、UKF、EKF、PF、FKF、DKF卡尔曼滤波KF、无迹卡尔曼滤波UKF、拓展卡尔曼滤波数据融合研究(Matlab代码实现)
318 0

热门文章

最新文章