EDA365电子论坛网

标题: 利用matlab实现卡尔曼滤波算法 [打印本页]

作者: uperrua    时间: 2019-8-13 09:49
标题: 利用matlab实现卡尔曼滤波算法
   卡尔曼滤波实现简单,滤波效果好 ,下面分享一个基于卡尔曼滤波的matlab算法,数据全部为一维状态,本人弥补的详细备注,供爱好者研究学习。
, s! a6 `  E! Y3 t9 f

( s8 s. ^1 }: S0 I2 a  Q* L3 ?%%%%%%%%%%%%%%%%%%
; U" ^) i5 d0 \, s5 R; u: H%功能说明:Kalman滤波用在一维温度数据测量系统中/ Q  W* s' ^3 ^9 K; o7 t# a# B2 l
function main
% @6 w6 D! u, I4 D% e5 J%%%%%%
# l7 C0 W+ W% a3 o7 H. YN = 120;                                    %一共采样的点数,时间单位是分钟,可理解为实验进行了60分钟的测量* d+ v" @8 w  v. i; X9 T
CON = 25;                                %室内温度的理论值,在这个理论值的基础上受过程噪声会有波动. a+ }8 M  t& f8 b3 u1 Y
%ones(a,b) 产生a行b列值为1的矩阵- v3 V/ z4 N8 V! ~. m
%zeros(a,b)产生a行b列值为0的矩阵
0 g5 {% n9 w( U$ b2 }" C! [& h6 jXexpect = CON*ones(1,N);     %期望的温度是恒定的25度,但实际温度不可能会这样的) l& K+ L/ H$ |* U! k
  }, `3 u( f1 X& n
X = zeros(1,N);                         %房间各时刻真实温度值: ^% Z! s8 H) N+ H+ M
Xkf = zeros(1,N);                      %Kalman滤波处理的状态,也叫估计值
/ J3 k, @- e+ Y6 l) h: t* l1 SZ = zeros(1,N);                         %温度计测量值" V+ G& @7 I" m8 T4 S5 u0 n
P = zeros(1,N);  {: j0 g2 ^. n1 x$ s+ n
%X(1)为数组的第一个元素* P% I2 P, Z! t, V5 v  G& D
X(1) = 25.1;     %假如初始值房间温度为25.1度
0 J+ P/ ?, G6 aP(1) = 0.01;     %初始值的协方差   (测量值 - 真实值)^2! _! R/ @8 l( ^% s- A" Q& C

# `- v/ I. k4 I1 p! [%产生0-1的随机数  模拟系统的随机数据
; s' o) d) r. O+ bZ = 24+rand(1,N)*10 - 5;      
+ W9 p& y5 z$ N+ R
: V# T4 B" G9 hZ(1) = 24.9;     %温度计测的第一个数据1 D) w6 ]3 K# y6 X! n' R
Xkf(1) = Z(1);  %初始测量值为24.9度,可以作为滤波器的初始估计状态噪声% e: `( K3 ]. x

/ R  w- B- N, m0 M- d9 k# L; {$ }Q = 0;        %扰动误差方差(不存在扰动误差只有测量误差). K3 R. }  [- i5 O7 S/ ~3 W5 E: }
R = 0.25;        %测量误差方差: W! j" R) |3 E$ b+ }$ a
%sqrt(Q)*randn(1,N)为产生方差为0.01的随机信号
+ e6 g7 a( q5 P% p%W为过程噪声
- G, U. ]; J  ?8 g9 u0 a% q%V为测量噪声6 |4 f/ h* d/ i3 e6 z1 Y
W = sqrt(Q)*randn(1,N); %方差决定噪声的大小
: c& b! M( X( S) u$ l+ [V = sqrt(R)*randn(1,N);%方差决定噪声的大小2 M# g! V3 ]& L5 g
%系统矩阵
/ ~; q6 O. c! ]0 q* y%解释:因为该系统的数据都是一维的,故各变换矩阵都是1,原因自己找书理解2 E* S7 V4 [7 G4 r! E) u
F = 1;     * A+ j: w/ m2 ?) w, R; z8 n8 f: H2 K
G = 1;
1 A9 k1 u" {5 A( r  GH = 1;
/ d) W, W* r- z%eye产生m×n的单位矩阵 数值应该为1
# B* B5 k8 L% k/ p1 `' xI = eye(1);  %本系统状态为一维8 _9 n4 P  R8 o. a+ t
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 g# i1 ^& @) A+ ]) r
%模拟房间温度和测量过程,并滤波
  g: y4 r1 w' W- A& z1 s/ E4 e) p. }. d! T) N
for k = 2:N, ]9 V# n9 u4 E1 \% f7 H' s
    %第一步:随时间推移,房间真实温度波动变化1 V5 T& f( @4 q9 o* H+ E  j: v
    %k时刻房间的真实温度,对于温度计来说,这个真实值是不知道的但是它的存在又是客观事实,读者要深刻领悟这个计算机模拟过程
# H9 A( n0 `7 _8 x* z  Y    X(k) = F*X(k - 1)+G*W(k - 1);%实际值为理想值叠加上扰动噪声
& B4 P5 w! d0 w3 n9 ^    %第二步:随时间推移,获取实时数据& K% V3 C4 q4 @6 N, G
    %温度计对K时刻房间温度的测量,Kalman滤波是站在温度计角度进行的,
. o2 ~( Y& L. y: \- L: M    %它不知道此刻的真实状态X(k),只能利用本次测量值Z(k)和上一次估计值Xkf(k)来做处理,其目标是最大限度地降低测量噪声R的影响
) e- t7 \. }5 e! m1 h# M: [- D    %尽可能的逼近X(k),这也是Kalman滤波目的所在; F( ]. R1 Z( Q: B" ~1 p" z; y' ]( u
3 R8 E" Q; O  R4 C. m/ k: o
    %修改本次函数
- N3 G  P0 y$ s( A+ a    %Z(k) = H*X(k)+V(k);                %测量值为实际值叠加上测量噪声* d3 _& C7 L* F
3 V* S1 n: g8 M0 L1 I- ~- y
    %第三步:Kalman滤波
- B4 \+ w  o" c    %有了k时刻的观测Z(k)和k-1时刻的状态,那么就可以进行滤波了,
! L( M8 D2 {' @! f5 P5 {    %读者可以对照(3.36)到式(3.40),理解滤波过程
# M+ b# |* b+ s1 g$ F3 ]# J# c) M    X_pre = F*Xkf(k - 1);                        %状态预测          X_pre为上一次卡尔曼滤波值
9 ?' ]. P0 V% ]. K+ N3 K% l% m    P_pre = F*P(k - 1)*F + Q;                %协方差预测    7 e4 e4 U6 C3 L4 }: {1 D
    %inv()为求一个方阵的逆矩阵。
4 Y6 L7 k6 k4 i. P& q$ O    Kg = P_pre*inv(H * P_pre*H' + R);  %计算卡尔曼增益1 g$ z+ i, o* [7 y7 j
    e = Z(k) - H*X_pre;                           %新息                 本次测量值与上次预测值之差, l: Y3 _" x* F
    Xkf(k) = X_pre + Kg*e;                     %状态更新         本次预测值
6 Y! Y" }1 J) ~( H2 _" c    P(k) = (I - Kg*H)*P_pre;                    %协方差更新& C: V- O$ X) {+ `) d! x
end: O  }) m' }4 B2 r
%计算误差
' j! B! h' P0 C$ ]! XErr_Messure = zeros(1,N);   %测量值与真实值之间的偏差
- K$ W! |1 V7 d, u3 w" [Err_Kalman = zeros(1,N);     %Kalman估计与真实值之间的偏差2 p* y. {. V6 K, A
for k = 1:N
) X  R2 h2 a5 |$ v0 Y# Z  d    Err_Messure(k) = abs(Z(k) - X(k));    %abs()为求解绝对值
1 G( l) C1 k7 g& r6 i0 c    Err_Kalman(k) = abs(Xkf(k) - X(k));* U) x* ^2 D1 n4 S
end$ R# w1 a% Q* g7 ~4 P) J
t = 1:N;
/ I, j; k9 D# l. s7 L  V, z  cfigure   %画图显示" c4 t1 [, J2 D( \1 `" n+ b( E
%依次输出理论值,叠加过程噪声(受波动影响)的真实值
2 O% D; s0 l1 T$ A%温度计测量值,Kalman估计值. j! N5 C# ~( K) _1 q2 V  f
plot(t,Xexpect,'-b',t,X,'-r',t,Z,'-ko',t,Xkf,'-g*');
; y1 D+ y2 }5 j1 H3 @; rlegend('期望值','真实值','观测值','Kalman滤波值');
4 g* K2 R" r' e6 A/ r5 f1 a' @xlabel('采样时间/s');6 n2 G; x4 X. m% U* n) p7 O
ylabel('温度值/C');- J: m0 f- j3 \3 A
%误差分析图5 w7 D. ]  d1 B( e, \, i2 H- O
figure  %画图显示2 P, R+ D5 D+ f
plot(t,Err_Messure,'-b.',t,Err_Kalman,'-k*');
. Q+ x- @+ ~2 X' ^( v, T/ Wlegend('测量偏差','Kalman滤波偏差');0 O. Q( |% ?" f+ l; B; p
xlabel('采样时间/s');6 K  D: I+ v( x, Y
ylabel('温度偏差值/C');7 H; X# [. U, [* C# |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* a9 a4 E; v6 a1 z0 t

* u& m+ v4 A6 U  m0 J
: O. L  @7 z" n  M$ S  Z
" \% d$ d9 j) n
: |( s! m8 h1 ?4 k, U, `0 X
3 g6 Z7 C8 i7 x" s1 i6 M

作者: Liberallh21    时间: 2019-8-13 17:35
谢谢分享
作者: edada    时间: 2019-8-13 19:59
谢谢分享
作者: chencol    时间: 2019-11-7 07:42
谢谢分享




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2