⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kalman.m

📁 程序实现单目标在空间中的真实飞行轨迹与使用小波后对目标的估计轨迹
💻 M
字号:
clc
clear
 T=1%雷达扫描周期
 num=100;%滤波次数
 al=1/120;%机动频率常数
 amax=100;%m/s^2
 amax1=-100;
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%产生真实轨迹%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 N1=10/T;
 N2=20/T;
 N3=33/T;
 N4=47/T;
 
 sx=zeros(1,N4);%目标实际x位置
 sy=zeros(1,N4);
 svx=zeros(1,N4);%目标实际x方向速度
 svy=zeros(1,N4);
 sax=zeros(1,N4);%目标实际x方向加速度
 say=zeros(1,N4);
 sx(1)=100;%初始x位置
 sy(1)=3000;%初始y位置
 v0=426;%x方向初始速度m/s
 b=pi/4;%目标初始航向角
 svx(1)=v0*cos(b);%初始x速度
 svy(1)==v0*sin(b);%初始y速度
 sax=0;%初始x加速度
 say=0;%初始y加速度
 a0=20;%x方向的加速度m/s^2
 
 
 Rr=3000;%%旋转半径m
 for i=1:N4-1
      if (i>N1&i<N2-1)
       s=v0*T+0.5*a0*T*T;
      v0=v0+a0*T;
      xx=s*cos(b);
      yy=s*sin(b);
      sx(i+1)=sx(i)+xx;
      sy(i+1)=sy(i)+yy;
      svx(i+1)=v0*cos(b);
      svy(i+1)=v0*sin(b); 
      sax(i+1)=a0*cos(b);
      say(i+1)=a0*sin(b);
       elseif (i>N2&i<N3-1)
       a1=v0^2/Rr;
      bb=a1/v0*T;
      xx=Rr*(sin(b+bb)-sin(b));
      yy=Rr*(cos(b)-cos(b+bb));
      b=b+bb;
      sx(i+1)=sx(i)+xx;
      sy(i+1)=sy(i)+yy;
      svx(i)=v0*cos(b);
      svy(i)=v0*sin(b);
      sax(i)=-a1*sin(b);
      say(i)=a1*cos(b);
       elseif (i>N3&i<N4-1)
       a1=v0^2/Rr;
      bb=a1/v0*T;
      xx=Rr*(sin(b-bb)-sin(b));
      yy=Rr*(cos(b)-cos(b-bb));
      b=b-bb;
      sx(i+1)=sx(i)-xx;
      sy(i+1)=sy(i)-yy;
      svx(i)=v0*cos(b);
      svy(i)=v0*sin(b);
      sax(i)=a1*sin(b);
      say(i)=a1*cos(b);
       else
        s=v0*T;
      xx=s*cos(b);
      yy=s*sin(b);
      sx(i+1)=sx(i)+xx;
      sy(i+1)=sy(i)+yy;
      svx(i)=v0*cos(b);
      svy(i)=v0*sin(b);
      sax(i)=0;
      say(i)=0; 
       
     end
       
     
 end
 
 
 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Qb=[1 T 1/al^2*(-1+al*T+exp(-al*T)) 0 0 0;0 1 1/al*(1-exp(-al*T)) 0 0 0;0 0 exp(-al*T) 0 0 0;0 0 0 1 T 1/al^2*(-1+al*T+exp(-al*T));0 0 0 0 1 1/al*(1-exp(-al*T));0 0 0 0 0 exp(-al*T)];%机动模型为"当前"统计模型
%%%%Qc=[1 T T*T/2 0 0 0;0 1 T 0 0 0;0 0 1 0 0 0;0 0 0 1 T T*T/2;0 0 0 0 1 T;0 0 0 0 0 1];%一步转移输矩阵  滤波模型为a-b-r滤波
H=[1 0 0 0 0 0;0 0 0 1 0 0];%观测矩阵
I=[1 0 0 0 0 0;0 1 0 0 0 0;0 0 1 0 0 0;0 0 0 1 0 0;0 0 0 0 1 0;0 0 0 0 0 1];%单位矩阵
  deta_w=1;
   x0=30;
   y0=30;%固定测量误差
  
 bl=0.01;%比例系数
 %e2=normrnd(0,sqrt(deta_w),[1 N4]);%第一个参数是均值,第二个是标准差,后面用于指定生成矩阵的大小
 e2=randn(1,N4);
 vk=zeros(2,1,N4);%观测噪声V(k)
 Z=zeros(2,1,N4);%观测值
 xtzt=zeros(6,1,N4);%系统状态
 R=zeros(2,2,N4);%测噪声方差
 for i=1:N4
    xtzt(1,1,i)=sx(i);%真实轨迹x
    xtzt(4,1,i)=sy(i);%真实轨迹y
 end
 for i=1:N4
 vk(1,1,i)=10*e2(i);%计算观测噪声V(k)    (bl*sx(i)+x0)*
 vk(2,1,i)=10*e2(i);%(bl*sy(i)+y0)*
 Z(:,:,i)=H*xtzt(:,:,i)+vk(:,:,i);%观测方程
 R(:,:,i)=[mean(e2(i)*e2(i)) 0 ;0 mean(e2(i)*e2(i))];%计算观测噪声方差
 end
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%小波重构%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  for i=1:N4
    Zx(i)=Z(1,1,i);
    Zy(i)=Z(2,1,i);
  end
  
 [ZxC,ZxL] = wavedec(Zx,2,'db2');%db1,db2,db3
 [ZyC,ZyL] = wavedec(Zy,2,'db2');

 subplot(3,1,1);
 plot(Zx,Zy);
 title('vk(1,1,i)=10*e2(i)观测轨迹')
  
  %xA3 = waverec(ZxC,ZxL,'db1');
  %yA3 = waverec(ZyC,ZyL,'db1');
  
  xA3 = wrcoef('a',ZxC,ZxL,'db2',2);
  yA3 = wrcoef('a',ZyC,ZyL,'db2',2);
  
  subplot(3,1,2);
  plot(xA3, yA3);
  title('db2小波重构观测轨迹');
  
  subplot(3,1,3);
  plot(sx, sy);
  title('真实轨迹')
  
   w=zeros(2,1,N4);%观测值
for i=1:N4
   w(1,1,i)= xA3(i);
   w(2,1,i)= yA3(i);
end
%subplot(4,1,4);
%plot(w(1,:),w(2,:));
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  for k=1:N4
      guance_x(k)=Z(1,1,k); %观测x坐标
      guance_y(k)=Z(2,1,k); %观测y坐标
  end
  
  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%计算Q中的常数矩阵
a2x=zeros(1,N4);%ax加速度方差
a2y=zeros(1,N4);%ay加速度方差
Q=zeros(6,6,N4);%常数矩阵
Q11=zeros(3,3,N4);%常数矩阵
Q22=zeros(3,3,N4);%常数矩阵
Q12=zeros(3,3,N4);%常数矩阵

q11=1/(2*al^5)*(1-exp(-2*al*T)+2*al*T+2*al^3*T^3/3-2*al*al*T^2-4*al*T*exp(-al*T));
q12=1/(2*al^4)*(exp(-2*al*T)+1-2*exp(-al*T)+2*al*T*exp(-al*T)-2*al*T+al*al*T^2);
q21=q12;
q13=1/(2*al^3)*(1-exp(-2*al*T)-2*al*T*exp(-al*T));
q31=q13;
q22=1/(2*al^3)*(4*exp(-al*T)-3-exp(-2*al*T)+2*al*T);
%q23=1/(2*al^2)*(exp(-2*al*T)+1-2*al*T);
q23=1/(2*al^2)*(exp(-2*al*T)+1-2*exp(-al*T));
q32=q23;
q33=1/(2*al)*(1-exp(-2*al*T));
q2=[q11 q12 q13;q21 q22 q23;q31 q32 q33];
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%kalman滤波初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
XX1=zeros(6,1,N4);%存放一步预测估计值
wXX1=zeros(6,1,N4);
PP1=zeros(6,6,N4);%存放预测滤波协方差矩阵
K=zeros(6,2,N4);%存放增益矩阵
Qz=zeros(6,6,N4);%
a2x(3)=10;
a2y(3)=10;

 %X=zeros(6,1,N4);
 XX=zeros(6,1,N4);%存放估计值
  wXX=zeros(6,1,N4);
 PP=zeros(6,6,N4);%存放滤波协方差矩阵
 %XX(:,:,3)=[Z(1,1,3) 3*(Z(1,1,3)-Z(1,1,2)-(Z(1,1,3)-Z(1,1,1)))/T (Z(1,1,3)-2*Z(1,1,2)+Z(1,1,1))/T^2 Z(2,1,3) 3*(Z(2,1,3)-Z(2,1,2)-(Z(2,1,3)-Z(2,1,1)))/T (Z(2,1,3)-2*Z(2,1,2)+Z(2,1,1))/T^2]';%初始状态值估计
 XX(:,:,3)=[403 295 0 3602 370 0];
 wXX(:,:,3)=[403 295 0 3602 370 0];
%对PP(:,:,3)进行初始化

PP(:,:,3)=[1 0 0 0 0 0;0 1 0 0 0 0;0 0 0 1 0 0;0 0 0 1 0 0;0 0 0 0 1 0;0 0 0 0 0 1];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%KALMAN 滤波1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

for i=3:N4-1
    Q11(:,:,i)=2*al*a2x(i)*q2;%计算Q矩阵
    Q22(:,:,i)=2*al*a2y(i)*q2;%计算Q矩阵
    Q(:,:,i)=[Q11(:,:,i) Q12(:,:,i);Q12(:,:,i) Q22(:,:,i)];%计算Q矩阵
    XX1(:,:,i)=Qb*XX(:,:,i);%计算一步预测估计值                         X(k/k-1)=Q(k+1,k)X(k-1/k-1)
    PP1(:,:,i)=Qb*PP(:,:,i)*Qb'+Q(:,:,i);%计算预测滤波协方差矩阵         P(k/k-1)=Q(k+1,k)P(k-1/k-1)Q'(k+1,k)+G(k-1)Q(k-1)G'(k-1) %G(k-1)=I%
    K(:,:,i)=PP1(:,:,i)*H'*inv(H*PP1(:,:,i)*H'+R(:,:,i));%计算增益矩阵  K(k)=P(k/k-1)H(k)'[H(k)P(k/k-1)H(k)'+R(k)]"
    XX(:,:,i+1)=XX1(:,:,i)+K(:,:,i)*(Z(:,:,i+1)-H*XX1(:,:,i));%计算估计值
    PP(:,:,i+1)=(I-K(:,:,i+1)*H)*PP1(:,:,i);%计算协方差更新方程          P(k/k)=[I-K(k)H(k)]P(k/k-1)
end
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%KALMAN 滤波2%%%%%%%%%%%%%%
for i=3:N4-1
    Q11(:,:,i)=2*al*a2x(i)*q2;%计算Q矩阵
    Q22(:,:,i)=2*al*a2y(i)*q2;%计算Q矩阵
    Q(:,:,i)=[Q11(:,:,i) Q12(:,:,i);Q12(:,:,i) Q22(:,:,i)];%计算Q矩阵
    wXX1(:,:,i)=Qb*wXX(:,:,i);%计算一步预测估计值                         X(k/k-1)=Q(k+1,k)X(k-1/k-1)
    PP1(:,:,i)=Qb*PP(:,:,i)*Qb'+Q(:,:,i);%计算预测滤波协方差矩阵         P(k/k-1)=Q(k+1,k)P(k-1/k-1)Q'(k+1,k)+G(k-1)Q(k-1)G'(k-1) %G(k-1)=I%
    K(:,:,i)=PP1(:,:,i)*H'*inv(H*PP1(:,:,i)*H'+R(:,:,i));%计算增益矩阵  K(k)=P(k/k-1)H(k)'[H(k)P(k/k-1)H(k)'+R(k)]"
    wXX(:,:,i+1)=wXX1(:,:,i)+K(:,:,i)*(w(:,:,i+1)-H*wXX1(:,:,i));%计算估计值
    PP(:,:,i+1)=(I-K(:,:,i+1)*H)*PP1(:,:,i);%计算协方差更新方程          P(k/k)=[I-K(k)H(k)]P(k/k-1)
end






%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%图形显示%%%%%%%%%%%%%%%%%%%%%%%%
x_filter=zeros(1,N4);
y_filter=zeros(1,N4);

wx_filter=zeros(1,N4);
wy_filter=zeros(1,N4);

for k=1:N4;
x_filter(k)=XX(1,1,k);
y_filter(k)=XX(4,1,k);
end

for k=1:N4;
wx_filter(k)=wXX(1,1,k);
wy_filter(k)=wXX(4,1,k);
end
figure(2)
subplot(2,1,1)
 plot(sx,sy,'r-',guance_x,guance_y,'b-x');
 hold on
 plot(x_filter,y_filter,'g-h');
 legend('真实飞行轨迹','观测飞行轨迹','估计飞行轨迹',2);
 title('目标在空间中的真实飞行轨迹与估计轨迹')
 subplot(2,1,2)
  plot(sx,sy,'r-',xA3,yA3,'b-x');
 hold on
 plot(wx_filter,wy_filter,'g-h');
 legend('真实飞行轨迹','观测飞行轨迹','估计飞行轨迹',2);
 title('目标在空间中的真实飞行轨迹与使用小波后的估计轨迹——db2,vk(1,1,i)=10*e2(i) ')
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -