|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
卡尔曼
& g0 R. q+ ~5 i: Z, U& u, P: j8 _4 R6 n& \
clear clc;
7 n. d; v1 T# r: K! pN=600;%采样点的个数 2 N7 b9 Q. } {1 U
CON=25;%室内温度的理论值
$ D/ d* h1 i: i2 w+ Xx=zeros(1,N);%用来记录温度的最优化估算值
5 T5 c$ ^& D/ L7 I p* T9 Cy=randn(1,N)+CON;%温度计的观测值,其中叠加了噪声1 d/ d6 c7 A0 h) b$ U9 ]( c* [
x(1)=20;%为x(k)赋初值# u! {" C' {/ s2 z! ~0 B. x$ n
p(1)=2;%x(1)对应的协方差- s f" k) V, L3 z& d7 X- W
Q=cov(randn(1,N));%过程噪声的协方差2 ?0 y- g! J8 ^6 i" {3 E
R=cov(randn(1,N));%测量噪声的协方差5 Y4 X9 A; I* ~0 F! m: l5 [
for k=2:N%循环里面是卡尔曼滤波的具体过程
* T% }2 m9 n' N& R& j1 Z$ ~0 Ax(k)=x(k-1);
& u! @9 J2 ~# z9 bp(k)=p(k-1)+Q;
) ?8 m* t. J8 C8 g5 yKg(k)=p(k)/(p(k)+R);%Kg为Kalman Gain,卡尔曼增益
+ p+ i/ a# E2 V2 r/ s; Y; nx(k)=x(k)+Kg(k)*(y(k)-x(k)); . r3 Q; ?( W6 [1 n- }
p(k)=(1-Kg(k))*p(k);
: h! _ q" r+ W7 ?3 {end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %这个模块起到平滑滤波作用/ a% M- E3 D% {: f, P
Filter_Width=10;%滤波器带宽
9 S J7 C6 d& N% d* U! PSmooth_Result=zeros(1,N);%用来存放滤波后的各个采样点的值
6 D7 L. k: b( f; \ g1 O- Pfor i=Filter_Width+1:N ) T3 w. Y' V8 Z0 x$ _7 d/ M
Temp_Sum=0;
9 L2 j' i) J+ W9 jfor j=i-Filter_Width: (i-1)
8 j" r4 e# z. Z; V& A0 X6 }Temp_Sum=x(j)+Temp_Sum; 2 e, o" ^0 L: F$ w9 s
end $ t, W$ y' i3 P) D. {6 x% p
Smooth_Result(i)=Temp_Sum/Filter_Width;%每一个点的采样值等于这个点之前的filter_width长度的采样点的平均值. h3 A# `1 X% O }8 O$ `$ ~+ [
end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 U% v k0 C$ k" K/ [2 Et=1:N;
5 c' W( n" k9 y7 v+ `/ ufigure('Name','Kalman Filter Simulation','NumberTitle','off');
# S2 ~! d" u2 k) o! B' bexpected_Value=zeros(1,N);- h9 ^- X, d- j- M! g: U2 Y
for i=1:N
4 O+ Y- Q9 L4 jexpected_Value(i)=CON;
7 c) M9 o% T+ n) c* P: M* i, d Lend
5 a3 o i7 N* I% `plot(t,expected_Value,'-b',t,y,'-g',t,x,'-k',t,Smooth_Result,'-m');%依次输出理论值,叠加测量噪声的温度计测量值,
2 N* H: S( t) g4 b- _legend('expected','measure','estimate','smooth result'); %经过kalman滤波后的最优化估算值,平滑滤波后的输出值
( T" K' }6 W3 y, o ^xlabel('sample time');+ |( ?8 {0 u$ h2 p% `9 I: V5 n
ylabel('temperature'); title('Kalman Filter Simulation'); |
|