gusucode.com > 扩展卡尔曼滤波,粒子滤波,去偏卡尔曼滤波和循环增益尔曼滤波的源程序 > 粒子滤波/particle_filter.m

    function [filter_data]=data_kalman_filter(view_data,point_view_data,N,object_init_state,Q1,point_Q2,T,l,real_data)
%定义初试滤波
filter_data0=object_init_state';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ch=[1 T 0 0;0 1 0 0;0 0 1 T;0 0 0 1];               %定义状态转移矩阵
M=10;                                               %定义粒子数为10
M_out=10;
%h=[1 0 0 0;0 0 1 0];                               %观测转移矩阵
%观测误差是随时间变化的所以需计算观测误差
%cos_2_v_thita=(object_init_state(1,1)^2)/(object_init_state(1,1)^2+object_init_state(1,3)^2);
%sin_2_v_thita=1-cos_2_v_thita;
%R_2=(object_init_state(1,1)^2+object_init_state(1,3)^2);
%Q2=zeros(2,2);       
%Q2(1,1)=point_Q2(1,1)*cos_2_v_thita+R_2*sin_2_v_thita*point_Q2(2,2);
%Q2(1,2)=sqrt(cos_2_v_thita)*sqrt(sin_2_v_thita)*(point_Q2(1,1)-R_2*point_Q2(2,2));
%Q2(1,2)=0;
%Q2(2,1)=Q2(1,2);
%Q2(2,2)=point_Q2(1,1)*sin_2_v_thita+R_2*cos_2_v_thita*point_Q2(2,2);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
for i=1:M
    w1=sqrt(Q1(1,1))*randn;
    w2=sqrt(Q1(2,2))*randn;
    w=[w1;w2];
    x_part(:,i)=filter_data0+l*w;
end
 q0=ones(1,M)/M;   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%根据初始预测计算滤波值
%通过输入观测值进行卡尔曼滤波
for i=1:N
    for k=1:M
        w1=sqrt(Q1(1,1))*randn;
        w2=sqrt(Q1(2,2))*randn;
        w=[w1;w2];
        xpart_minus(:,k)=ch*x_part(:,k)+l*w;
        r=sqrt(xpart_minus(1,k)^2+xpart_minus(3,k)^2);
        if xpart_minus(1,k)>0 
           thita=atan(xpart_minus(3,k)/xpart_minus(1,k));
       else
           thita=atan(xpart_minus(3,k)/xpart_minus(1,k))+pi;
       end
        z_part=[r;thita];
        vhat=point_view_data(:,i)-z_part;                               %观测值和预测值的差
        if i==1
           q(i,k)=1/(2*pi*sqrt(point_Q2(1,1)*point_Q2(2,2)))*exp(-(vhat(1)^2/(2*point_Q2(1,1))+vhat(2)^2/(2*point_Q2(2,2))))*q0(k);  
       else
           q(i,k)=1/(2*pi*sqrt(point_Q2(1,1)*point_Q2(2,2)))*exp(-(vhat(1)^2/(2*point_Q2(1,1))+vhat(2)^2/(2*point_Q2(2,2))))*q(i-1,k); 
       end
    end
    qsum=sum(q(i,:));
    for k=1:M
        q(i,k)=q(i,k)/qsum;                                 %  归一化权值
    end
    %x_part=xpart_minus;
    qsum2=q(i,:)*q(i,:)';
    Nff=1/qsum2;
   
    if Nff<2/3*M
        u=rand/M_out; 
       
        for k=1:M           
            qtempsum=0;
            for j=1:M
                qtempsum=qtempsum+q(i,j);
                if qtempsum>= u
                   x_part(:,k) = xpart_minus(:,j);
                   u=u+1/M_out;
                   break; 
                end
           end
        end
        q(i,:)=ones(1,M)/M;
    else
        x_part=xpart_minus;
    end
    %重采样有问题
 
   x_filt=zeros(4,1);
   for k=1:M
       x_filt=q(k)*x_part(:,k)+x_filt;
   end
   filter_data(:,i)=x_filt;
 
    
end