www.gusucode.com > 基于matlab编程雷达目标航迹跟踪源码程序 > 基于matlab编程雷达目标航迹跟踪源码程序/数据处理程序/main_test.m
close all; clear all; clc; %%%主程序:首先产生6条航迹:直线航迹1、圆航迹、直线航迹2、直线航迹3、8字航迹、椭圆航迹,接着进行数据处理,并将结果进行显示 %%%程序中距离的单位为m,速度的单位为m/s,角度的单位为弧度 %%%程序中的通道号并未用到,故所有通道号都取1 %%%%%%%%%%%%%%%%%%%%%直线航迹1%%%%%%%%%%%%%%%%%%%%%%%%%%%%% T=1;%一个CPI的时间 Rx0=1000;%目标在x轴上的起始距离,单位m Ry0=1000;%目标在y轴上的起始距离 Rz0=1000;%目标在z轴上的起始距离 vx=50;%目标在x轴上的速度,单位m/s vy=50;%目标在y轴上的速度 vz=50;%目标在z轴上的速度 sigma_r=10;%目标距离的观测噪声标准差 sigma_t=1e-2;%目标方位角的观测噪声标准差 sigma_p=1e-2;%目标俯仰角的观测噪声标准差 N=150;%共150个点,即共有150个CPI %noise=randn(1,N);%用来产生高斯白噪声 load qq noise;%由于噪声的随机性,不便于调试,故将噪声保存在qq文件中,调用时load一下就行 for k=1:N tmp_Rx(k)=Rx0+vx*(k-1)*T;%目标在x轴上的真实运动轨迹 tmp_Ry(k)=Ry0+vy*(k-1)*T;%目标在y轴上的真实运动轨迹 tmp_Rz(k)=Rz0+vz*(k-1)*T;%目标在z轴上的真实运动轨迹 Rr(k)=sqrt(tmp_Rx(k)^2+tmp_Ry(k)^2+tmp_Rz(k)^2);%将目标运动轨迹转换为极坐标系下的值,目标的径向距离 phi(k)=atan(tmp_Rz(k)/sqrt(tmp_Rx(k)^2+tmp_Ry(k)^2));%目标的俯仰角 theta(k)=atan(tmp_Ry(k)/tmp_Rx(k));%目标的方位角 if((tmp_Rx(k)>=0 & tmp_Ry(k)>=0) | (tmp_Rx(k)>=0 & tmp_Ry(k)<0))%进行坐标系转换时需考虑象限的问题,当位于二三象限时,方位角需要加上一个pi theta(k)=theta(k); else theta(k)=theta(k)+pi; end end Rr_observe=Rr+sigma_r*noise;%将目标的真实运动轨迹加上观测噪声,即目标的观测值 theta_observe=theta+sigma_t*noise; phi_observe=phi+sigma_p*noise; R_xy_observe=Rr_observe.*abs(cos(phi_observe)); figure(2);%将数据处理前的航迹画出来 polar(theta_observe,R_xy_observe,'k.'); title('原始航迹');hold on; DBF=ones(N,1);%代表通道号,本系统未用到,故所有通道号均取1 range_vect_line1=[Rr_observe',theta_observe',phi_observe',DBF]; %%%%%%%%%%%%%%%%%%%%%直线航迹1%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%圆形航迹%%%%%%%%%%%%%%%%%%%%%%%%%%%%% T=1;%一个CPI的时间 Rx0=6000;%目标在x轴上的起始距离 Ry0=6000;%目标在y轴上的起始距离 Rz0=1000;%目标在z轴上的起始距离 v=100;%目标的速度 w=0.05;%目标的角速度,圆的半径=v/w sigma_r=10;%目标距离的观测噪声标准差 sigma_t=1e-2;%目标方位角的观测噪声标准差 sigma_p=1e-2;%目标俯仰角的观测噪声标准差 for k=1:N tmp_Rx(k)=Rx0+v/w*cos(w*(k-1)*T);%目标在x轴上的真实运动轨迹 tmp_Ry(k)=Ry0+v/w*sin(w*(k-1)*T);%目标在y轴上的真实运动轨迹 tmp_Rz(k)=Rz0;%目标在z轴上的真实运动轨迹 Rr(k)=sqrt(tmp_Rx(k)^2+tmp_Ry(k)^2+tmp_Rz(k)^2);%将目标运动轨迹转换为极坐标系下的值,目标的径向距离 phi(k)=atan(tmp_Rz(k)/sqrt(tmp_Rx(k)^2+tmp_Ry(k)^2));%目标的俯仰角 theta(k)=atan(tmp_Ry(k)/tmp_Rx(k));%目标的方位角 if((tmp_Rx(k)>=0 & tmp_Ry(k)>=0) | (tmp_Rx(k)>=0 & tmp_Ry(k)<0))%进行坐标系转换时需考虑象限的问题,当位于二三象限时,方位角需要加上一个pi theta(k)=theta(k); else theta(k)=theta(k)+pi; end end Rr_observe=Rr+sigma_r*noise;%将目标的真实运动轨迹加上观测噪声,即目标的观测值 theta_observe=theta+sigma_t*noise; phi_observe=phi+sigma_p*noise; R_xy_observe=Rr_observe.*abs(cos(phi_observe)); polar(theta_observe,R_xy_observe,'ro');hold on; DBF=ones(N,1); range_vect_circle=[Rr_observe',theta_observe',phi_observe',DBF]; %%%%%%%%%%%%%%%%%%%%%圆形航迹%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%直线航迹2%%%%%%%%%%%%%%%%%%%%%直线航迹2和直线航迹3的设置与直线航迹1一样 Rx0=-1000; Ry0=1000; Rz0=1000; vx=-50; vy=50; vz=50; sigma_r=10; sigma_t=1e-2; sigma_p=1e-2; for k=1:N tmp_Rx(k)=Rx0+vx*(k-1)*T;%目标在x轴上的真实运动轨迹 tmp_Ry(k)=Ry0+vy*(k-1)*T;%目标在y轴上的真实运动轨迹 tmp_Rz(k)=Rz0+vz*(k-1)*T;%目标在z轴上的真实运动轨迹 Rr(k)=sqrt(tmp_Rx(k)^2+tmp_Ry(k)^2+tmp_Rz(k)^2); phi(k)=atan(tmp_Rz(k)/sqrt(tmp_Rx(k)^2+tmp_Ry(k)^2)); theta(k)=atan(tmp_Ry(k)/tmp_Rx(k)); if((tmp_Rx(k)>=0 & tmp_Ry(k)>=0) | (tmp_Rx(k)>=0 & tmp_Ry(k)<0)) theta(k)=theta(k); else theta(k)=theta(k)+pi; end end Rr_observe=Rr+sigma_r*noise; theta_observe=theta+sigma_t*noise; phi_observe=phi+sigma_p*noise; R_xy_observe=Rr_observe.*abs(cos(phi_observe)); polar(theta_observe,R_xy_observe,'yx');hold on; DBF=ones(N,1); range_vect_line2=[Rr_observe',theta_observe',phi_observe',DBF]; %%%%%%%%%%%%%%%%%直线航迹2%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%直线航迹3%%%%%%%%%%%%%%%%%%%%% Rx0=3000; Ry0=1000; Rz0=1000; vx=-50; vy=50; vz=50; sigma_r=10; sigma_t=1e-2; sigma_p=1e-2; for k=1:N tmp_Rx(k)=Rx0+vx*(k-1)*T;%目标在x轴上的真实运动轨迹 tmp_Ry(k)=Ry0+vy*(k-1)*T;%目标在y轴上的真实运动轨迹 tmp_Rz(k)=Rz0+vz*(k-1)*T;%目标在z轴上的真实运动轨迹 Rr(k)=sqrt(tmp_Rx(k)^2+tmp_Ry(k)^2+tmp_Rz(k)^2); phi(k)=atan(tmp_Rz(k)/sqrt(tmp_Rx(k)^2+tmp_Ry(k)^2)); theta(k)=atan(tmp_Ry(k)/tmp_Rx(k)); if((tmp_Rx(k)>=0 & tmp_Ry(k)>=0) | (tmp_Rx(k)>=0 & tmp_Ry(k)<0)) theta(k)=theta(k); else theta(k)=theta(k)+pi; end end Rr_observe=Rr+sigma_r*noise; theta_observe=theta+sigma_t*noise; phi_observe=phi+sigma_p*noise; R_xy_observe=Rr_observe.*abs(cos(phi_observe)); polar(theta_observe,R_xy_observe,'g+');hold on; DBF=ones(N,1); range_vect_line3=[Rr_observe',theta_observe',phi_observe',DBF]; %%%%%%%%%%%%%%%%%直线航迹3%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%8字航迹%%%%%%%%%%%%%%%%%%%%%%%%%%%%% sigma_r=10;%目标距离的观测噪声标准差 sigma_t=1e-2;%目标方位角的观测噪声标准差 sigma_p=1e-2;%目标俯仰角的观测噪声标准差 dist_8eye1=1000*sqrt(3);%一号圆心的距离 azimuth_8eye1=pi/4;%一号圆心的方位 dist_8eye2=1000*sqrt(3);%二号圆心的距离 azimuth_8eye2=pi/4*3;%二号圆心的方位 height=1000;%8字轨迹的高度 v=100;%目标运动速度 for k=1:150 t=k-1; pt=EightTrack(dist_8eye1,azimuth_8eye1,dist_8eye2,azimuth_8eye2,height,v,t);%调用8字轨迹函数EightTrack,该8字形轨迹上t时刻的点的坐标pt tmp_Rx(k)=pt(1);%得到目标直角坐标系下位置 tmp_Ry(k)=pt(2); tmp_Rz(k)=pt(3); Rr(k)=sqrt(tmp_Rx(k)^2+tmp_Ry(k)^2+tmp_Rz(k)^2);%转换为极坐标下的值 phi(k)=atan(tmp_Rz(k)/sqrt(tmp_Rx(k)^2+tmp_Ry(k)^2)); theta(k)=atan(tmp_Ry(k)/tmp_Rx(k)); if((tmp_Rx(k)>=0 & tmp_Ry(k)>=0) | (tmp_Rx(k)>=0 & tmp_Ry(k)<0)) theta(k)=theta(k); else theta(k)=theta(k)+pi; end end Rr_observe=Rr+sigma_r*noise;%加上噪声得到观测值 theta_observe=theta+sigma_t*noise; phi_observe=phi+sigma_p*noise; R_xy_observe=Rr_observe.*abs(cos(phi_observe)); polar(theta_observe,R_xy_observe,'b*');hold on; DBF=ones(N,1); range_vect_8=[Rr_observe',theta_observe',phi_observe',DBF]; %%%%%%%%%%%%%%%%%%%%%8字航迹%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%椭圆航迹%%%%%%%%%%%%%%%%%%%%%%%%%%%%% sigma_r=10;%目标距离的观测噪声标准差 sigma_t=1e-2;%目标方位角的观测噪声标准差 sigma_p=1e-2;%目标俯仰角的观测噪声标准差 N=150; dist_ellieye=5000*sqrt(3);%椭圆中心的距离 azimuth_ellieye=pi/4*3;%椭圆中心的方位 len_laxis=2000;%椭圆长轴的长度 len_saxis=1000;%椭圆短轴的长度 height=1000;%椭圆的高度 v=100;%目标运动速度 for k=1:150 t=k-1; pt=EllipseTrack(dist_ellieye,azimuth_ellieye,len_laxis,len_saxis,height,v,t);%调用椭圆轨迹函数EllipseTrack,得到该椭圆轨迹上t时刻的点的坐标pt tmp_Rx(k)=pt(1);%得到目标直角坐标系下位置 tmp_Ry(k)=pt(2); tmp_Rz(k)=pt(3); Rr(k)=sqrt(tmp_Rx(k)^2+tmp_Ry(k)^2+tmp_Rz(k)^2);%转换为极坐标下的值 phi(k)=atan(tmp_Rz(k)/sqrt(tmp_Rx(k)^2+tmp_Ry(k)^2)); theta(k)=atan(tmp_Ry(k)/tmp_Rx(k)); if((tmp_Rx(k)>=0 & tmp_Ry(k)>=0) | (tmp_Rx(k)>=0 & tmp_Ry(k)<0)) theta(k)=theta(k); else theta(k)=theta(k)+pi; end end Rr_observe=Rr+sigma_r*noise;%加上噪声得到观测值 theta_observe=theta+sigma_t*noise; phi_observe=phi+sigma_p*noise; R_xy_observe=Rr_observe.*abs(cos(phi_observe)); polar(theta_observe,R_xy_observe,'cd');hold on; DBF=ones(N,1); range_vect_ell=[Rr_observe',theta_observe',phi_observe',DBF]; %%%%%%%%%%%%%%%%%%%%%椭圆航迹%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%虚假目标:噪声%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Rr_observe=10000+sigma_r*noise;%在距离向产生高斯白噪声 theta_observe=noise * pi ;%在方位角向产生高斯白噪声 phi_observe= noise * pi ;%在俯仰角向产生高斯白噪声 range_vect_noise=[Rr_observe',theta_observe',phi_observe',DBF]; %%%%%%%%%%%%%%%%%%%%%虚假目标:噪声%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ts=1;%一个CPI的时间长度 trust_track=[]; temp_point=[]; time_accumulate=0; number_of_track=0; track_data_output=[]; for ci=1:150 %range_vect1=[range_vect_line(ci,:);range_vect_circle(ci,:);range_vect2(ci,:);range_vect3(ci,:)]; if(ci==20| ci==100) %| ci==20 | ci==40 | ci==60 | ci==80 | ci==100) range_vect=[];%将第20和第100个CPI的值置空,相当于漏警,为了查看航迹能不能补点 else range_vect=[range_vect_line1(ci,:);range_vect_circle(ci,:);range_vect_line2(ci,:);range_vect_line3(ci,:);range_vect_8(ci,:);range_vect_ell(ci,:)... ;range_vect_noise(ci,:)];%每个CPI信号处理都得到的点迹信息 end % FilePath = 'E:\data_treat'; % [range_vect] = file_save(FilePath,ci,time_accumulate+1,range_vect); [track_data_output ,trust_track,temp_point, time_accumulate, number_of_track] = datatreat(track_data_output,range_vect,ci,ts,trust_track,... temp_point, time_accumulate, number_of_track);%数据处理主函数 draw_track(track_data_output , number_of_track);%航迹显示 end