75卡尔曼滤波器.docx

上传人:b****1 文档编号:11012950 上传时间:2023-05-28 格式:DOCX 页数:11 大小:36.86KB
下载 相关 举报
75卡尔曼滤波器.docx_第1页
第1页 / 共11页
75卡尔曼滤波器.docx_第2页
第2页 / 共11页
75卡尔曼滤波器.docx_第3页
第3页 / 共11页
75卡尔曼滤波器.docx_第4页
第4页 / 共11页
75卡尔曼滤波器.docx_第5页
第5页 / 共11页
75卡尔曼滤波器.docx_第6页
第6页 / 共11页
75卡尔曼滤波器.docx_第7页
第7页 / 共11页
75卡尔曼滤波器.docx_第8页
第8页 / 共11页
75卡尔曼滤波器.docx_第9页
第9页 / 共11页
75卡尔曼滤波器.docx_第10页
第10页 / 共11页
75卡尔曼滤波器.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

75卡尔曼滤波器.docx

《75卡尔曼滤波器.docx》由会员分享,可在线阅读,更多相关《75卡尔曼滤波器.docx(11页珍藏版)》请在冰点文库上搜索。

75卡尔曼滤波器.docx

75卡尔曼滤波器

7.5 卡尔曼滤波器

由于维纳滤波器难以用于实时处理,满足不了20世纪50年代航天航空技术发展的要求,于是人们开始探索新的理论和技术途径。

20世纪60年代新出现的卡尔曼滤波理论,用信号与噪声的状态空间模型取代了相关函数,用时域的微分方程来表示滤波问题,得到了递推估计算法,适用于计算机实时处理,它突破了维纳滤波的平稳过程的限制,也没有无限时间的要求,这一对维纳滤波理论的重大突破很快地被用于空间技术、自动控制和信号处理等领域。

卡尔曼滤波由滤波方程和预测方程两部分组成。

7.5.1 滤波基本方程

设信号状态方程和量测方程分别为       

      

(7-133)

      

(7-134)

式中,

为信号的状态向量,

为量测向量,

分别为状态噪声和量测噪声,且为互不相关的高斯白噪声向量序列,其协方差分别为

分别为状态转移矩阵、输入矩阵和观测矩阵。

卡尔曼滤波基本方程为

      

(7-135)

      

(7-136)

      

(7-137)

      

(7-138)

      

(7-139)

其中,残差(新息)定义为

      

(7-140)

协方差矩阵为        

      

(7-141)

7.5.2 一步预测基本方程

卡尔曼一步预测基本方程为

      

(7-142)

      

(7-143)

      

(7-144)

式中,

为一步预测增益阵。

【例7-16】利用卡尔曼滤波器跟踪机动目标。

例程7-14 基于卡尔曼滤波器的机动目标跟踪

%Makeapointmoveinthe2Dplane

%State=(xyxdotydot).Weonlyobserve(xy).

%X(t+1)=Φ(t)X(t)+noise(Q)

%Y(t)=HX(t)+noise(R)

ss=4;%statesize

os=2;%observationsize

F=[1010;0101;0010;0001];

H=[1000;0100];

Q=0.1*eye(ss);

R=1*eye(os);

initx=[101010]';  %targetinitialparameters

initV=10*eye(ss);

seed=9;

rand('state',seed);

randn('state',seed);

T=15;

[x,y]=sample_lds(F,H,Q,R,initx,T); %generatetargetdata

%kalmanfilter

[xfilt,Vfilt,VVfilt,loglik]=kalman_filter(y,F,H,Q,R,initx,initV);                                 

%onesteppredict

[xsmooth,Vsmooth]=kalman_smoother(y,F,H,Q,R,initx,initV);

%calculatetheerrorbetweenthefiltereddataandtherealdata

dfilt=x([12],:

)-xfilt([12],:

);

mse_filt=sqrt(sum(sum(dfilt.^2)));  

dsmooth=x([12],:

)-xsmooth([12],:

);

mse_smooth=sqrt(sum(sum(dsmooth.^2)))

figure

(1)

clf

%subplot(2,1,1)

holdon

plot(x(1,:

),x(2,:

),'ks-');

plot(y(1,:

),y(2,:

),'g*');

plot(xfilt(1,:

),xfilt(2,:

),'rx:

');

fort=1:

T,plotgauss2d(xfilt(1:

2,t),Vfilt(1:

2,1:

2,t));end

holdoff

legend('true','observed','filtered',3)

xlabel('x')

ylabel('y')

%3x3inches

set(gcf,'units','inches');

set(gcf,'PaperPosition',[0033]) 

%print(gcf,'-depsc','/home/eecs/murphyk/public_html/Bayes/Figures/aima_filtered.eps');

%print(gcf,'-djpeg','-r100','/home/eecs/murphyk/public_html/Bayes/Figures/aima_filtered.jpg');

 figure

(2)

%subplot(2,1,2)

holdon

plot(x(1,:

),x(2,:

),'ks-');

plot(y(1,:

),y(2,:

),'g*');

plot(xsmooth(1,:

),xsmooth(2,:

),'rx:

');

fort=1:

T,plotgauss2d(xsmooth(1:

2,t),Vsmooth(1:

2,1:

2,t));end

holdoff

legend('true','observed','smoothed',3)

xlabel('x')

ylabel('y')

 %3x3inches

set(gcf,'units','inches');

set(gcf,'PaperPosition',[0033]) 

%print(gcf,'-djpeg','-r100','/home/eecs/murphyk/public_html/Bayes/Figures/aima_smoothed.jpg');

%print(gcf,'-depsc','/home/eecs/murphyk/public_html/Bayes/Figures/aima_smoothed.eps');

图7-27 卡尔曼滤波器跟踪机动目标仿真

图7-27中“□”表示机动目标的真实轨迹,“*”表示目标观测轨迹,“…”表示经卡尔曼滤波后的目标轨迹,圆表示跟踪波门。

可以看出,卡尔曼滤波器能较为准确地跟踪机动目标。

函数kalman_filter和kalman_update分别是实现卡尔曼滤波方程滤波和状态更新的代码。

function[x,V,VV,loglik]=kalman_filter(y,A,C,Q,R,init_x,init_V,varargin)

%Kalmanfilter.

%[x,V,VV,loglik]=kalman_filter(y,A,C,Q,R,init_x,init_V,...)

%

%INPUTS:

%y(:

t)-theobservationattimet

%A-thesystemmatrix

%C-theobservationmatrix

%Q-thesystemcovariance

%R-theobservationcovariance

%init_x-theinitialstate(column)vector

%init_V-theinitialstatecovariance

%

%OPTIONALINPUTS(string/valuepairs[defaultinbrackets])

%'model'-model(t)=mmeansuseparamsfrommodelmattimet[ones(1,T)]

%Inthiscase,alltheabovematricestakeanadditionalfinaldimension,

%i.e.,A(:

:

m),C(:

:

m),Q(:

:

m),R(:

:

m).

%However,init_xandinit_Vareindependentofmodel

(1).

%'u'-u(:

t)thecontrolsignalattimet[[]]

%'B'-B(:

:

m)theinputregressionmatrixformodelm

%

%OUTPUTS(whereXisthehiddenstatebeingestimated)

%x(:

t)=E[X(:

t)|y(:

1:

t)]

%V(:

:

t)=Cov[X(:

t)|y(:

1:

t)]

%VV(:

:

t)=Cov[X(:

t),X(:

t-1)|y(:

1:

t)]t>=2

%loglik=sum{t=1}^TlogP(y(:

t))

%

%Ifaninputsignalisspecified,wealsoconditiononit:

%e.g.,x(:

t)=E[X(:

t)|y(:

1:

t),u(:

1:

t)]

%Ifamodelsequenceisspecified,wealsoconditiononit:

%e.g.,x(:

t)=E[X(:

t)|y(:

1:

t),u(:

1:

t),m(1:

t)]

[osT]=size(y);

ss=size(A,1);%sizeofstatespace

%setdefaultparams

model=ones(1,T);

u=[];

B=[];

ndx=[];

args=varargin;

nargs=length(args);

fori=1:

2:

nargs

 switchargs{i}

  case'model',model=args{i+1};

  case'u',u=args{i+1};

  case'B',B=args{i+1};

  case'ndx',ndx=args{i+1};

  otherwise,error(['unrecognizedargument'args{i}])

 end

end

x=zeros(ss,T);

V=zeros(ss,ss,T);

VV=zeros(ss,ss,T);

loglik=0;

fort=1:

T

 m=model(t);

 ift==1

   %prevx=init_x(:

m);

   %prevV=init_V(:

:

m);

   prevx=init_x;

   prevV=init_V;

   initial=1;

 else

   prevx=x(:

t-1);

   prevV=V(:

:

t-1);

   initial=0;

 end

 ifisempty(u)

   [x(:

t),V(:

:

t),LL,VV(:

:

t)]=...

   kalman_update(A(:

:

m),C(:

:

m),Q(:

:

m),R(:

:

m),y(:

t),prevx,prevV,'initial',initial);

 else

   ifisempty(ndx)

     [x(:

t),V(:

:

t),LL,VV(:

:

t)]=...

     kalman_update(A(:

:

m),C(:

:

m),Q(:

:

m),R(:

:

m),y(:

t),prevx,prevV,...

           'initial',initial,'u',u(:

t),'B',B(:

:

m));

   else

     i=ndx{t};

     %copyoverallelements;onlysomewillgetupdated

     x(:

t)=prevx;

     prevP=inv(prevV);

     prevPsmall=prevP(i,i);

     prevVsmall=inv(prevPsmall);

     [x(i,t),smallV,LL,VV(i,i,t)]=...

     kalman_update(A(i,i,m),C(:

i,m),Q(i,i,m),R(:

:

m),y(:

t),prevx(i),prevVsmall,...

           'initial',initial,'u',u(:

t),'B',B(i,:

m));

     smallP=inv(smallV);

     prevP(i,i)=smallP;

     V(:

:

t)=inv(prevP);

   end   

 end

 loglik=loglik+LL;

end

function[xnew,Vnew,loglik,VVnew]=kalman_update(A,C,Q,R,y,x,V,varargin)

%KALMAN_UPDATEDoaonestepupdateoftheKalmanfilter

%[xnew,Vnew,loglik]=kalman_update(A,C,Q,R,y,x,V,...)

%

%INPUTS:

%A-thesystemmatrix

%C-theobservationmatrix

%Q-thesystemcovariance

%R-theobservationcovariance

%y(:

)-theobservationattimet

%x(:

)-E[X|y(:

1:

t-1)]priormean

%V(:

:

)-Cov[X|y(:

1:

t-1)]priorcovariance

%

%OPTIONALINPUTS(string/valuepairs[defaultinbrackets])

%'initial'-1meansxandVaretakenasinitialconditions(soAandQareignored)[0]

%'u'-u(:

)thecontrolsignalattimet[[]]

%'B'-theinputregressionmatrix

%

%OUTPUTS(whereXisthehiddenstatebeingestimated)

%xnew(:

)=E[X|y(:

1:

t)]

%Vnew(:

:

)=Var[X(t)|y(:

1:

t)]

%VVnew(:

:

)=Cov[X(t),X(t-1)|y(:

1:

t)]

%loglik=logP(y(:

t)|y(:

1:

t-1))log-likelihoodofinnovatio

%setdefaultparams

u=[];

B=[];

initial=0;

args=varargin;

fori=1:

2:

length(args)

 switchargs{i}

  case'u',u=args{i+1};

  case'B',B=args{i+1};

  case'initial',initial=args{i+1};

  otherwise,error(['unrecognizedargument'args{i}])

 end

end

% xpred(:

)=E[X_t+1|y(:

1:

t)]

% Vpred(:

:

)=Cov[X_t+1|y(:

1:

t)]

ifinitial

 ifisempty(u)

   xpred=x;

 else

   xpred=x+B*u;

 end

 Vpred=V;

else

 ifisempty(u)

   xpred=A*x;

 else

   xpred=A*x+B*u;

 end

 Vpred=A*V*A'+Q;

end

e=y-C*xpred;%error(innovation)

n=length(e);

ss=length(A);

S=C*Vpred*C'+R;

Sinv=inv(S);

ss=length(V);

loglik=gaussian_prob(e,zeros(1,length(e)),S,1);

K=Vpred*C'*Sinv;%Kalmangainmatrix

%Ifthereisnoobservationvector,setK=zeros(ss).

xnew=xpred+K*e;

Vnew=(eye(ss)-K*C)*Vpred;

VVnew=(eye(ss)-K*C)*A*V;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2