www.gusucode.com > 基于matlab编程雷达目标航迹跟踪源码程序 > 基于matlab编程雷达目标航迹跟踪源码程序/数据处理程序/point_track_association.m

    function [trust_track ,point_now,track_data_output] = point_track_association(point_now ,trust_track ,track_data_output,...
    ts,K_association,time_accumulate)

% 函数实现功能:
% 点迹可靠航迹关联程序
% 输入数据与可靠航迹关联,能够关联上的,更新可靠航迹
% 否则,存入暂时点迹文件,用于航迹起始,或者最后成为噪声
% 一个点迹只能关联一条航迹,即最先与该点关联上的航迹,用该点来更新该航迹
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 输入变量 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% point_now --> 每次从CFAR处理后来的点迹,经过基本门限滤波后剩余点迹,存储在缓冲区中
% trust_track --> 可靠航迹文件,存储已经形成的可靠航迹的新息
% 1-6列:每条航迹最后一个点的滤波信息,1距离,2距离向速度,3方位角,4方位角向速度,5俯仰角,6俯仰角速度
% 7-42列:滤波误差协方差信息,本是一个6*6的矩阵,存成行则变成36列
% 43航迹识别标志,44来/去,45是第几个点,46实点/补点,47属于哪个通道,48航迹未被更新次数,49更新标志0未更新/1更新,50航迹消亡的门限值;
% K_association --> 一个可供选择的参数,用来调节波门大小
% time_accumulate --> 积累的时间,也即从第一批数据到此批处理数据之间所经过的时间
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 输入变量 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 输出变量 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% point_now --> 每次从CFAR处理后来的点迹,经过基本门限滤波后剩余点迹,存储在缓冲区中
% trust_track --> 可靠航迹文件,存储已经形成的可靠航迹的信息
% track_data_output --> 该批次数据处理完毕后,输出的航迹信息,存储输出航迹信息的多行9列矩阵;各列代表含义如下:1距
% 离,2方位角,3俯仰角,4属于第几条航迹,5来/去,6积累时间,7是第几个点,8实点/补点,9属于哪个通道;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 输出变量 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
F=[1 ts 0 0 0 0;0 1 0 0 0 0;0 0 1 ts 0 0;0 0 0 1 0 0;0 0 0 0 1 ts;0 0 0 0 0 1];%状态矩阵
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];%单位矩阵
G=[ts^2/2 0 0;ts 0 0;0 ts^2/2 0;0 ts 0;0 0 ts^2/2;0 0 ts];%过程噪声分布矩阵
H=[1 0 0 0 0 0 ;0 0 1 0 0 0;0 0 0 0 1 0];%观测矩阵
% sigma_r=60;
% sigma_a=1/180*pi;
% sigma_e=1/180*pi;
sigma_r=10;%目标距离的观测噪声标准差
sigma_a=1e-1;%目标方位角的观测噪声标准差
sigma_e=1e-1;%目标俯仰角的观测噪声标准差

sigma_ar=3;%目标距离的过程噪声标准差
sigma_aa=3;%目标方位角的过程噪声标准差
sigma_ae=3;%目标俯仰角的过程噪声标准差
Q=[sigma_ar^2 0 0;0 sigma_aa^2 0;0 0 sigma_ae^2];%过程噪声协方差等于G*Q*G'
R_noise=[sigma_r^2 0 0;0 sigma_a^2 0;0 0 sigma_e^2];%观测噪声协方差
for loop_of_trust_track = 1:size(trust_track ,1)
    for loop_of_point = 1:size(point_now ,1)
        if(point_now(loop_of_point ,8) == 0 & trust_track(loop_of_trust_track ,49) == 0)   % 确保一个点迹只更新一条航迹
            state_filter_last= trust_track(loop_of_trust_track,1:6)';%航迹上最后一个点的信息
            state_filter_predict=F*state_filter_last;%用航迹上的最后一个点预测下一点的位置
            for i=1:6
                filter_variance_last(i,:)=trust_track(loop_of_trust_track,1+i*6:6+i*6);%%%滤波误差协方差
            end
            filter_variance_predict=F*filter_variance_last*F'+G*Q*G';           %%%预测误差协方差
            sigma_r_predict=filter_variance_predict(1,1);%得到距离向预测误差标准差
            sigma_a_predict=filter_variance_predict(3,3);%得到方位角向预测误差标准差
            sigma_e_predict=filter_variance_predict(5,5);%得到俯仰角向预测误差标准差
            range_gate_of_association = K_association*sqrt(sigma_r^2+sigma_r_predict^2+ts^4/4*sigma_ar^2);% 点迹航迹关联中的距离门限
            azimuth_gate_of_association = K_association*sqrt(sigma_a^2+sigma_a_predict^2+ts^4/4*sigma_aa^2);%点迹航迹关联中的方位角门限
            elevation_gate_of_association = K_association*sqrt(sigma_e^2+sigma_e_predict^2+ts^4/4*sigma_ae^2);%点迹航迹关联中的俯仰角门限
            if (abs(state_filter_predict(1,1) - point_now(loop_of_point ,1))<= range_gate_of_association & ...
                    abs(state_filter_predict(3,1) - point_now(loop_of_point ,2))<= azimuth_gate_of_association &...
                    abs(state_filter_predict(5,1) - point_now(loop_of_point ,3))<= elevation_gate_of_association)
                point_now(loop_of_point ,8) = 1;%相关成功,下面对相关上的点进行滤波
                state_view=point_now(loop_of_point ,1:3)';%得到观测值
                %%%%%%%%%%%%%%%%滤波%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  

                Kalman_gain=filter_variance_predict*H'*[H*filter_variance_predict*H'+R_noise]^(-1);          %%%%增益

                filter_variance=[I-Kalman_gain*H]*filter_variance_predict;         %%%%滤波误差协方差

                state_filter=state_filter_predict+Kalman_gain*[state_view-H*state_filter_predict];     %%%%滤波估计
                %%%%%%%%%%%%%%%%%滤波%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                trust_track(loop_of_trust_track ,1:6) = state_filter';   %  最后一个点的状态更新
                for i=1:6
                    trust_track(loop_of_trust_track,1+i*6:6+i*6)=filter_variance(i,:);
                end
                 
                trust_track(loop_of_trust_track ,45) =  trust_track(loop_of_trust_track ,45) + 1;    % 可靠航迹点数加一
                trust_track(loop_of_trust_track ,46) = 0;      %  实/补点标志,实点为0,补点为1
                trust_track(loop_of_trust_track ,48) = 0;      %  未用实点更新次数置0;
                trust_track(loop_of_trust_track ,49) = 1;     %  更新标志置1
                trust_track (loop_of_trust_track ,50) = point_now(loop_of_point ,7) ;     % 更新航迹消亡的门限次数
                if(trust_track(loop_of_trust_track ,45) > 2 )     %   如果不是刚起始的航迹,输出
                    track_data_output = [track_data_output;state_filter(1,1) ,state_filter(3,1),state_filter(5,1),...           
                                   trust_track(loop_of_trust_track ,43),trust_track(loop_of_trust_track ,44),...
                                   time_accumulate,trust_track(loop_of_trust_track ,45),trust_track(loop_of_trust_track ,46),trust_track(loop_of_trust_track ,47)];
                end 
            end
        end
    end
     
end
point_now(find(point_now(:,8) == 1) ,:) = [];  % 删除跟可靠航迹关联上的点迹
track_data_output = sortrows(track_data_output,4);     % 按照航迹标号排序