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

📄 fnnassociation.m

📁 IMM滤波的 matlab程序
💻 M
字号:
function Z=fnnassociation(Xkk1,Z1,Z2)

function [Xkk,Pkk,Pkk1,S,K,Xkk2]=fimm(i,Rmeasure,X0,T,Z)
% this function is JPDA
  Xkk=[X_jpda_cvk_1r(1,i);X_jpda_cvk_1theta(1,i);X_jpda_cvk_1q(1,i)];
    Xkk2=[Xkk11r(1,i);Xkk11theta(1,i);Xkk11q(1,i)];  
   S=diag([S1r(:,i),S1theta(:,i),S1q(:,i)]);
    X_jpda_cvk_2(:,i)=[X_jpda_cvk_2r(1,i);X_jpda_cvk_2theta(1,i);X_jpda_cvk_2q(1,i)];
    X_jpda_cvkk1_2(:,i)=[Xkk12r(1,i);Xkk12theta(1,i);Xkk12q(1,i)];
    S=diag([S2r(:,i),S2theta(:,i),S2q(:,i)]);
    PG=1-eps;
    gama=11;
    
    %suppose the probability of dectation PD=0.99
    PD=0.99;
    clear ZZ_jpda_1;
    j=1; 
    for ii=1:(clutternum+2)            %%%%%%%%%%%%%%%%%%%%%%%%    1:4
%         d_jpda_1(:,ii)=C0kcv*F0kcv*X_jpda_cvk_1(:,i-1)-[clutterx(ii,i),cluttery(ii,i),clutterz(ii,i)]';
          d1(:,ii)=Xkk2(:,i)-clutterx(ii,i);
           a11= d1(:,ii)'*inv( S(i))* d1(:,ii);    
         if  d1(:,ii)'*inv( S(i))* d1(:,ii)<=a*
            ZZ1(:,j)=clutterx(ii,i); % 落入门限的量测
            j=j+1;
        end 
    end
    % 如果没有量测落入门限,则用量测预测作为量测
    % ZZ_jpda_1 可以判断有没有杂波
    if j==1
%         ZZ_jpda_1(:,j)=C0kcv*F0kcv*X_jpda_cvk_1(:,i-1);
        ZZ1(:,j)=Xkk(:,i);
    end  
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
    % 确定落入门限的量测
    clear ZZ2;
    j=1;
    for ii=1:(clutternum+2)
%         d_jpda_2(:,ii)=C0kcv*F0kcv*X_jpda_cvk_2(:,i-1)-[clutterx(ii,i),cluttery(ii,i),clutterz(ii,i)]';
         d2(:,ii)=Xkk2(:,i)-clutterx(ii,i);
        %%%%%%%%%%%%%%%%%%%%%%%%%%
        a12=d2(:,ii)'*inv(S(i))*d2(:,ii);
%         a12
        if d2(:,ii)'*inv(S(i))*d2(:,ii)<=gama
            ZZ2(:,j)=clutterx(ii,i); 
            j=j+1;
        end  
    end
    % 如果没有量测落入门限,则用量测预测作为量测
    if j==1
%         ZZ_jpda_2(:,j)=C0kcv*F0kcv*X_jpda_cvk_2(:,i-1);
        ZZ2(:,j)=Xkk(:,i);
    end 
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
    % 计算单个目标jpda的计算量
    t=cputime;
    
    clear omega ZZ;
    % 生成确认阵
    [omega,ZZ]=fform_validation_matrix(ZZ1,ZZ2);
%     omega
    clear em ee;
    % 生成可行矩阵
    [em,ee]=fget_data_association_hypotheses(omega);
    clear tao sigma phi;
    % 计算 关联指示器\目标检测指示器 和 联合事件中假量测数量
    [tao,sigma,phi]=fcalculate_indicators(ee);
%     sigma
    %计算可行矩阵行、列和数量
    [n1,n2,n3]=size(ee);
    clear sigma0
    sigma0=sigma;

    clear e V_jpda P_product_PD numerator PDF_measurements;
    for ii=1:n3     %%%%(n3=7)
        product_Gause=1;
        for j=1:n1  %%2
            e(j)=1;
%       em =
%      1     2     2     3     3     1     1
%      1     1     3     1     2     2     3
          if em(j,ii)==1
                e(j)=1;
             elseif em(j,ii)==2
                %V_jpda(:,j) is the innovation of the jth measurement
                V_jpda(:,j)=ZZ(:,j)-Xkk 1(:,i);
                e(j)=exp(-0.5*V_jpda(:,j)'*inv( S)*V_jpda(:,j));
             elseif em(j,ii)==3
                V_jpda(:,j)=ZZ(:,j)-Xkk 2(:,i);
                e(j)=exp(-0.5*V_jpda(:,j)'*inv(S)*V_jpda(:,j));
             end           
             product_Gause=product_Gause*e(j);
        end
        PDF_measurements(ii)=product_Gause;  
        product_PD=1;
        for k=2:n2
            product_PD=product_PD*(PD^(sigma(k,ii))*((1-PD)^(1-sigma(k,ii))));
%             sigma 
%             product_PD
        end
        P_product_PD(ii)=product_PD;
        numerator(ii)=(falsealarmdensities)^(phi(ii)-n1) *PDF_measurements(ii)*P_product_PD(ii);
% sigma =
%      0     0     0     0     0     0     0
%      0     1     1     0     1     1     0
%      0     0     1     1     1     0     1
 end
%      numerator      
    denominator=sum(numerator);
%     denominator
    clear Con_Pro_joint_association_event;
    for ii=1:n3
        Con_Pro_joint_association_event(ii)=numerator(ii)/denominator;  % 式子(7-2-80)
    end
    
    %%%%%%%%%%%
    clear beta;
    %%%%%%%%%%%
    for ii=1:n1
        for j=1:n2
            bbb=0;
            for k=1:n3
                bbb=bbb+Con_Pro_joint_association_event(k)*ee(ii,j,k); % 式子(7-2-81)
            end
            beta(ii,j)=bbb;
        end
    end  

    clear betai_1;
    clear betai_2;
    for ii=1:n1        
        betai_1(ii)=beta(ii,2);  % (1,0)
        betai_2(ii)=beta(ii,3);
    end
    beta0_1=1-sum(betai_1);
    beta0_2=1-sum(betai_2);
    
    % 计算目标1的状态更新
    SumV_jpda_1=[0;0;0];               %   ???????
    if n1==0 
       Xkk=Xkk2;
    else  
        clear V_jpda_1;
        for ii=1:n1
            V_jpda_1(:,ii)=ZZ(:,ii)-Xkk(:,i); % 2维变3维
%             V_jpda_1    % 3*1维
            SumV_jpda_1=V_jpda_1(:,ii)*betai_1(ii)+SumV_jpda_1;  % 3*1维
%               SumV_jpda_1            % 3*1维
        end
          % the following SumV_jpda_1 is combined innovation
          Xkk=Xkk2+K_jpda_1(:,:,i)*SumV_jpda_1;   % 3*1维
    end
    
    % update P_jpda_cvk_1(:,:,i)
    SumbV_jpda_1=[0,0,0;0,0,0;0,0,0];           %  ???????
    for ii=1:n1
        SumbV_jpda_1=betai_1(ii)*V_jpda_1(:,ii)*V_jpda_1(:,ii)'+SumbV_jpda_1;
%          SumbV_jpda_1
    end
    
    % the follow formula is from Tracking and Data Association in p165
%     P_jpda_p_1(:,:,i)=K_jpda_1(:,:,i)*(SumbV_jpda_1-SumV_jpda_1*SumV_jpda_1')*K_jpda_1(:,:,i)';% 3*3维
%     P_jpda_c_1(:,:,i)=(eye(3)-K_jpda_1(:,:,i))*P_jpda_cvkk1_1(:,:,i);  % 3*3维 
%     P_jpda_cvk_1(:,:,i)=beta0_1*P_jpda_cvkk1_1(:,:,i)+(1-beta0_1)*P_jpda_c_1(:,:,i)+P_jpda_p_1(:,:,i);% 7-2-90
    
    P_jpda_p_1(:,:,i)=K1(:,i)*(SumbV_jpda_1(1,1)-SumV_jpda_1(1)*SumV_jpda_1(1)')*K1(:,i)';
    P_jpda_c_1(:,:,i)=(eye(3)-K1(:,i)*C0kcv)*P_jpda_cvkk1_1(:,:,i); 
    P_jpda_cvk_1(:,:,i)=beta0_1*P_jpda_cvkk1_1(:,:,i)+(1-beta0_1)*P_jpda_c_1(:,:,i)+P_jpda_p_1(:,:,i);
    
%     P_jpda_p_1theta(:,:,i)=Ktheta1(:,i)*(SumbV_jpda_1(2,2)-SumV_jpda_1(2)*SumV_jpda_1(2)')*Ktheta1(:,i)';
%     P_jpda_c_1theta(:,:,i)=(eye(3)-Ktheta1(:,i)*C0kcv)*P_jpda_cvkk1_1theta(:,:,i); 
%     P_jpda_cvk_1theta(:,:,i)=beta0_1*P_jpda_cvkk1_1theta(:,:,i)+(1-beta0_1)*P_jpda_c_1theta(:,:,i)+P_jpda_p_1theta(:,:,i);
%     
%      P_jpda_p_1q(:,:,i)=K1q(:,i)*(SumbV_jpda_1(3,3)-SumV_jpda_1(3)*SumV_jpda_1(3)')*K1q(:,i)';
%     P_jpda_c_1q(:,:,i)=(eye(3)-K1q(:,i)*C0kcv)*P_jpda_cvkk1_1q(:,:,i); 
%     P_jpda_cvk_1q(:,:,i)=beta0_1*P_jpda_cvkk1_1q(:,:,i)+(1-beta0_1)*P_jpda_c_1q(:,:,i)+P_jpda_p_1q(:,:,i);
%     
%     tt=cputime-t;
%     sumtime=sumtime+tt;
      
    % 计算目标2的状态更新
    SumV_jpda_2=[0;0;0]; 
    if n1==0 
        X_jpda_cvk_2(:,i)=X_jpda_cvkk1_2(:,i);
    else
        clear V_jpda_2;
        for ii=1:n1
            V_jpda_2(:,ii)=ZZ(:,ii)-X_jpda_cvk_2(:,i);
            SumV_jpda_2=betai_2(ii)*V_jpda_2(:,ii)+SumV_jpda_2;
%             SumV_jpda_2
        end
        % the following SumV_jpda_2 is combined innovation
        X_jpda_cvk_2(:,i)=X_jpda_cvkk1_2(:,i)+K_jpda_2(:,:,i)*SumV_jpda_2;
    end
    
     %  update P_jpda_cvk_2(:,:,i)
    SumbV_jpda_2=[0,0,0;0,0,0;0,0,0];
    for ii=1:n1
        SumbV_jpda_2=betai_2(ii)*V_jpda_2(:,ii)*V_jpda_2(:,ii)'+SumbV_jpda_2;  
    end
    %  SumbV_jpda_2
    %  the follow formula is from Tracking and Data Association in p165
%     P_jpda_p_2(:,:,i)= K_jpda_2(:,:,i)*(SumbV_jpda_2-SumV_jpda_2*SumV_jpda_2') *K_jpda_2(:,:,i)';
%     P_jpda_c_2(:,:,i)=(eye(9)- K_jpda_2(:,:,i)*C0kcv)*P_jpda_cvkk1_2(:,:,i);
%     P_jpda_cvk_2(:,:,i)=beta0_2*P_jpda_cvkk1_2(:,:,i)+(1-beta0_2)*P_jpda_c_2(:,:,i)+P_jpda_p_2(:,:,i);     
    P_jpda_p_2(:,:,i)=K2(:,i)*(SumbV_jpda_2(1,1)-SumV_jpda_2(1)*SumV_jpda_2(1)')*K2(:,i)';
    P_jpda_c_2(:,:,i)=(eye(3)-K2(:,i)*C0kcv)*P_jpda_cvkk1_2(:,:,i); 
    P_jpda_cvk_2(:,:,i)=beta0_2*P_jpda_cvkk1_2(:,:,i)+(1-beta0_2)*P_jpda_c_2(:,:,i)+P_jpda_p_2(:,:,i);
%     
%     P_jpda_p_2theta(:,:,i)=Ktheta2(:,i)*(SumbV_jpda_2(2,2)-SumV_jpda_2(2)*SumV_jpda_2(2)')*Ktheta2(:,i)';
%     P_jpda_c_2theta(:,:,i)=(eye(3)-Ktheta2(:,i)*C0kcv)*P_jpda_cvkk1_2theta(:,:,i); 
%     P_jpda_cvk_2theta(:,:,i)=beta0_2*P_jpda_cvkk1_2theta(:,:,i)+(1-beta0_2)*P_jpda_c_2theta(:,:,i)+P_jpda_p_2theta(:,:,i);
%     
%     P_jpda_p_2q(:,:,i)=K2q(:,i)*(SumbV_jpda_2(3,3)-SumV_jpda_2(3)*SumV_jpda_2(3)')*K2q(:,i)';
%     P_jpda_c_2q(:,:,i)=(eye(3)-K2q(:,i)*C0kcv)*P_jpda_cvkk1_2q(:,:,i); 
%     P_jpda_cvk_2q(:,:,i)=beta0_2*P_jpda_cvkk1_2q(:,:,i)+(1-beta0_2)*P_jpda_c_2q(:,:,i)+P_jpda_p_2q(:,:,i);
end

% 判断各算法对2两目标的估计是否落入3sigma门限内
for i=dataassociation_begintime:time
   
    Vcv_jpda_1(:,i)=[X_jpda_cvk_1(1,i);X_jpda_cvk_1(2,i);X_jpda_cvk_1(3,i)]-[xm_1(i);ym_1(i);zm_1(i)];  % ??
    Vcv_jpda_2(:,i)=[X_jpda_cvk_2(1,i);X_jpda_cvk_2(2,i);X_jpda_cvk_2(3,i)]-[xm_2(i);ym_2(i);zm_2(i)];    

    %判断目标1的估计是否落入3sigma门限内
    if  Vcv_jpda_1(:,i)'*inv(Rmeasure_1(:,:,i))*Vcv_jpda_1(:,i)<gama
        estimationfallintogatecv_jpda_1(i)=1;
    else
        estimationfallintogatecv_jpda_1(i)=0;
    end
    %判断目标2的估计是否落入3sigma门限内
    if Vcv_jpda_2(:,i)'*inv(Rmeasure_2(:,:,i))*Vcv_jpda_2(:,i)<gama
        estimationfallintogatecv_jpda_2(i)=1;
    else
        estimationfallintogatecv_jpda_2(i)=0;
    end
end
tracklost_cv_jpda_1=0;
tracklost_cv_jpda_2=0;
for i=dataassociation_begintime+19:time
    %使用jpda算法判断目标1的跟踪是否丢失
    if estimationfallintogatecv_jpda_1(i-19)==0&estimationfallintogatecv_jpda_1(i-18)==0&estimationfallintogatecv_jpda_1(i-17)==0&estimationfallintogatecv_jpda_1(i-16)==0&estimationfallintogatecv_jpda_1(i-15)==0&estimationfallintogatecv_jpda_1(i-14)==0&estimationfallintogatecv_jpda_1(i-13)==0&estimationfallintogatecv_jpda_1(i-12)==0&estimationfallintogatecv_jpda_1(i-11)==0&estimationfallintogatecv_jpda_1(i-10)==0&estimationfallintogatecv_jpda_1(i-9)==0&estimationfallintogatecv_jpda_1(i-8)==0&estimationfallintogatecv_jpda_1(i-7)==0&estimationfallintogatecv_jpda_1(i-6)==0&estimationfallintogatecv_jpda_1(i-5)==0&estimationfallintogatecv_jpda_1(i-4)==0&estimationfallintogatecv_jpda_1(i-3)==0&estimationfallintogatecv_jpda_1(i-2)==0&estimationfallintogatecv_jpda_1(i-1)==0&estimationfallintogatecv_jpda_1(i)==0
        tracklost_cv_jpda_1=1;
    end
    %使用jpda算法判断目标2的跟踪是否丢失
    if estimationfallintogatecv_jpda_2(i-19)==0&estimationfallintogatecv_jpda_2(i-18)==0&estimationfallintogatecv_jpda_2(i-17)==0&estimationfallintogatecv_jpda_2(i-16)==0&estimationfallintogatecv_jpda_2(i-15)==0&estimationfallintogatecv_jpda_2(i-14)==0&estimationfallintogatecv_jpda_2(i-13)==0&estimationfallintogatecv_jpda_2(i-12)==0&estimationfallintogatecv_jpda_2(i-11)==0&estimationfallintogatecv_jpda_2(i-10)==0&estimationfallintogatecv_jpda_2(i-9)==0&estimationfallintogatecv_jpda_2(i-8)==0&estimationfallintogatecv_jpda_2(i-7)==0&estimationfallintogatecv_jpda_2(i-6)==0&estimationfallintogatecv_jpda_2(i-5)==0&estimationfallintogatecv_jpda_2(i-4)==0&estimationfallintogatecv_jpda_2(i-3)==0&estimationfallintogatecv_jpda_2(i-2)==0&estimationfallintogatecv_jpda_2(i-1)==0&estimationfallintogatecv_jpda_2(i)==0
        tracklost_cv_jpda_2=1;
    end
end


D1=sqrt((Z1(1)-Xkk1(1))^2);
D2=sqrt((Z2(1)-Xkk1(1))^2);
V=[D1,D2];

[D,I]=min(V);
switch I
    case 1
        Z=Z1;
    otherwise
        Z=Z2;
end

⌨️ 快捷键说明

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