www.pudn.com > pdaf-demo.rar > pdaf.m


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%Probabilistic Data Association Filter    
%Writed by Liangqun Li  
%Date:2006.4.21 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
tic 
Pd=1;                                                    %检测概率 
Pg=0.99;                                                 %正确量测落入跟踪门内得概率 
g_sigma=9.21;                                            %门限 
gamma=1;                                                 %每一个单位面积内产生一个杂波 
Target_measurement=zeros(2,n);                           %目标观测互联存储矩阵 
target_delta=0.15;                                       %目标对应的观测标准差    
data_measurement=zeros(2,n);                             %观测存储矩阵,n采样次数    行---代表目标 列---代表传感器                       
P=zeros(4,4);                                            %滤波时协方差更新 
x_filter=zeros(4,n);                                     %存储所有六个目标的各时刻的滤波值 
A = [1 T 0 0;0 1 0 0;0 0 1 T;0 0 0 1];                   %状态转移矩阵 
C = [1 0 0 0;0 0 1 0];  
R=[target_delta^2  0;0  target_delta^2];                 % 
G=[T^2/2 0;0 T^2/2;T 0;0 T]; 
P=[target_delta^2 0 0 0;0 0.01 0 0;0 0 target_delta^2 0;0 0 0 0.01];%初始化协方差 
x_filter1=zeros(4,n,MC_number);                          %MC_number次montle carlo仿真所得全部结果存储矩阵 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
%主程序 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
for M=1:MC_number 
%产生路径 
Noise=[]; 
for i=1:n 
            data_measurement(1,i)=data_measurement1(1,i)+randn(1)*target_delta; 
            data_measurement(2,i)=data_measurement1(2,i)+randn(1)*target_delta;                 %传感器观测的位置  
end 
NOISE=[]; 
%滤波开始 
for t=1:n 
%     Noise=[]; 
%     y=[]; 
%     for i=1:c 
%         Noise_x=V(i,1)+target_delta(i)*3.5-2*rand(1,mm)*target_delta(i)*3.5; 
%         Noise_y=V(i,2)+target_delta(i)*3.5-2*rand(1,mm)*target_delta(i)*3.5;      %产生杂波 
%         Noise1=[Noise_x ;Noise_y]; 
%         Noise=[Noise Noise1]; 
%     end 
%     b=zeros(1,2); 
%     b(1)=data_measurement(1,1,t); 
%     b(2)=data_measurement(1,2,t); 
%     y=[Noise b']; 
%     b(1)=data_measurement(2,1,t); 
%     b(2)=data_measurement(2,2,t); 
%     y=[y b'];                                                                     %杂波、观测都放在y中 
 
    if t~=1 
        x_predic = A*x_filter(:,t-1);                                  %用前一时刻的滤波值来预测当前的值  
    else 
        x_predic = target_position';                                   %第一次采样我们用真实位置当预测值  
    end 
    P_predic = A*P*A'+G*Q*G'; 
    Z_predic = C*x_predic; 
    S = C*P_predic*C'+ R; 
    K = P_predic*C'*inv(S);                                            %增益 
    ellipse_Volume=pi*g_sigma*sqrt(det(S));                            %计算椭球体积,这里算的是面积    
    number_returns=floor(10*ellipse_Volume*gamma+1);                   %错误回波数 
    side=sqrt((10*ellipse_Volume*gamma+1)/gamma)/2;                    %求出正方行边长的二分之一 
    Noise_x=x_predic(1)+side-2*rand(1,number_returns)*side;            %在预测值周围产生多余回波 
    Noise_y=x_predic(3)+side-2*rand(1,number_returns)*side; 
    Noise=[Noise_x ;Noise_y]; 
    NOISE=[NOISE Noise]; 
    % 
    b=zeros(1,2); 
    b(1)=data_measurement(1,t); 
    b(2)=data_measurement(2,t); 
    y1=[Noise b'];                                                      %将接收到的所有的回波存在y1中 
    y=[]; 
    d=[]; 
    m=0; 
    for j=1:(number_returns+1) 
        d=y1(:,j)-Z_predic; 
        D=d'*inv(S)*d; 
        if D<=g_sigma 
            y=[y y1(:,j)];                                              %把落入跟踪门中的所有回波放入y中 
            m=m+1;                                                      %记录观测个数 
        end 
    end 
     
    %m=0表示无有效回波 
    Bk=gamma*2*pi*sqrt(det(S))*(1-Pd*Pg)/Pd;                            %算b0       
    if m==0 
       x_filter(:,t)= x_predic; 
       P=P_predic;                                                      %无回波的情况 
   else         
    E=zeros(1,m); 
    belta=zeros(1,m); 
    for i=1:m 
        a=(y(:,i)-Z_predic)'*inv(S)*(y(:,i)-Z_predic); 
        E(i)=E(i)+exp(-a/2); 
    end 
    belta0=Bk/(Bk+sum(E));                                                                                                         %无回波时的关联概率 
    v=zeros(2,1); 
    v1=zeros(2,2); 
    for i=1:m 
        belta(i)=E(i)/(Bk+sum(E));                                          %算关联概率 
        v=v+belta(i)*(y(:,i)-Z_predic); 
        v1=v1+belta(i)*(y(:,i)-Z_predic)*(y(:,i)-Z_predic)'; 
    end 
    x_filter(:,t)= x_predic + K*v; 
%算协方差 
    Pc=(eye(4)-K*C)*P_predic; 
    PP=K*(v1-v*v')*K'; 
    P=belta0*P_predic+(1-belta0)*Pc+PP; 
    end 
%     Z=y(:,num); 
%     K = P_predic*C'*inv(S); 
%     x_filter(:,i,t)= x_predic + K*(Z - Z_predic); 
%     P(:,:,i)= P_predic - K*S*K'; 
%     x_predic = A*x_filter(:,i,t); 
%     V(i,1)=x_predic(1);V(i,2)=x_predic(3); 
    x_filter1(:,t,M)=x_filter(:,t); 
% end% end 
end 
end 
toc 
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% %画图 
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%R=sum(U1,4)/MC_number;   
x_filter=sum(x_filter1,3)/MC_number;                                %滤波值作平均 
plot(x_filter(1,:),x_filter(3,:),'r+'),hold on 
plot(data_measurement(1,:),data_measurement(2,:),'*') 
plot(data_measurement1(1,:),data_measurement1(2,:),'-') 
% plot(NOISE(1,:),NOISE(2,:),'.') 
axis([0 30 1 7]) 
a=zeros(1,n); 
xlabel('x(km)'),ylabel('y(km)'); 
legend('estimated position','measurements','target position',4) 
figure 
for j=1:n 
        a(1,j)=sqrt((x_filter(1,j)-data_measurement1(1,j))^2+(x_filter(3,j)-data_measurement1(2,j))^2);%最小均方误差 
end 
plot(1:n,a(1,:),'r:')  
xlabel('t(s)'),ylabel('estimated errors(km)'); 
 
% a=zeros(1,n); 
% b=zeros(1,n); 
% figure(1) 
% for i=1:c 
%     a=zeros(1,n); 
%     b=zeros(1,n); 
%     for j=1:n 
%         a(j)=data_measurement1(i,1,j);b(j)=data_measurement1(i,2,j); 
%     end 
%     plot(a(:),b(:),'-'),hold on 
% end 
% % axis([5900 8500 5900 6200 ]) 
% for i=1:c 
 
 
%     for j=1:n 
%         a(j)=x_filter(1,i,j);b(j)=x_filter(3,i,j); 
%     end 
% if i==1 
%     plot(a(:),b(:),'m:') 
% else  
%     plot(a(:),b(:),':') 
% end 
% end 
% xlabel('x/m'),ylabel('y/m'); 
% axis([5900 9100 6150 6450 ]) 
% a=zeros(c,n);b=zeros(c,n);c1=zeros(1,n);MEASURE=zeros(2,c,n); 
% % for j=1:n 
% %     for i=1:c 
% %         hh=0;hh1=0; 
% %         a(i,j)=sqrt((x_filter(1,i,j)-data_measurement1(i,1,j))^2+(x_filter(3,i,j)-data_measurement1(i,2,j))^2); 
% %         for k=1:5 
% %             hh=data_measurement(i,1,k,j)+hh;hh1=data_measurement(i,2,k,j)+hh1; 
% %             MEASURE(:,i,j)=[hh/5 hh1/5]'; 
% %         end 
% %      b(i,j)=sqrt((MEASURE(1,i,j)-data_measurement1(i,1,j))^2+(MEASURE(2,i,j)-data_measurement1(i,2,j))^2); 
% %         end 
% %     c1(1,j)=sum(a(i,j))/sum(b(i,j)); 
% % end 
% for j=1:n 
%     a(1,j)=sqrt((x_filter(1,1,j)-data_measurement1(1,1,j))^2+(x_filter(3,1,j)-data_measurement1(1,2,j))^2);%最小均方误差 
%     c1(1,j)=c1(1,j)+a(1,j); 
% end 
% % axis([0 20 0 11 ]) 
% xlabel('times'),ylabel('Mean Estimated Errors/m'); 
% legend('target1','target2') 
% % 
% c1=zeros(1,n); 
% for j=1:n 
%     a(1,j)=sqrt((x_filter(2,1,j)-target_position(2,1))^2+(x_filter(4,1,j)-target_position(4,1))^2);%最小均方误差 
%     c1(1,j)=c1(1,j)+a(1,j); 
% end 
% figure(4) 
% plot(1:n,c1(1,:),'r:')  
% hold on 
% c1=zeros(1,n); 
% for j=1:n 
%     a(1,j)=sqrt((x_filter(2,2,j)-target_position(2,2))^2+(x_filter(4,2,j)-target_position(4,2))^2);%最小均方误差 
%     c1(1,j)=c1(1,j)+a(1,j); 
% plot(1:n,c1(1,:),'r-')  
% xlabel('times'),ylabel('Mean Estimated Errors m/s'); 
% legend('target1','target2')