aiwa 发表于 2011-8-22 15:33:58

有偏卡尔曼滤波器Matlab源码

本帖最后由 aiwa 于 2011-8-22 10:35 编辑

有偏卡尔曼滤波器可以用来消除无线定位中的非视距误差,首次使用有偏卡尔曼滤波器的参考文献是下面两篇论文
刘琚,李静.一种在非视距环境中的TDOA/AOA混合定位方法.通信学报,2005,26(5):63-67.
Bao Long Le, K. Ahmed, H. Tsuji. Mobile location estimator with NLOS mitigation using Kalman filtering. IEEE Wireless Communications and Networking, 2003, 3:1969-1973.
本源码为GreenSim团队原创,转载请注明。
function =BiasedKalmanFilter(x,X0,P0,Phi,Gamma,Q,H,R,SIGMAD,SIGMA_NLOS)
%% 用于校正NLOS误差的有偏卡尔曼滤波器
% GreenSim团队原创作品,转载请注明
% 更多原创作品,请访问GreenSim团队主页→http://blog.sina.com.cn/greensim
%% 本程序加入了非视距检测模块,对于NLOS使用有偏卡尔曼滤波,对于LOS使用标准卡尔曼滤波
%% 输入参数列表
%x   输入距离观测值序列,1×N的行向量
%X0    预测序列的初始值,1×2的列向量,包括距离和径向速度两个分量
%P0    预测误差矩阵的初始值,2×2的矩阵
%Phi   状态转移矩阵,2×2的矩阵
%Gamma 噪声输入矩阵,2×1的矩阵
%Q   输入噪声协方差矩阵,1×1的矩阵
%H   观测矩阵,1×2的向量
%R   观测噪声协方差矩阵,1×1的矩阵
%% 输出参数列表
%X   预测输出值
%FlagNLOS标记,为1表示LOS,为0表示非视距
%%
N=length(x);
X=zeros(1,N);
X(1)=X0(1);
Flag=ones(N,1);
for i=2:N
    if i>15%因为检测区间为15个样本
      YB=x((i-15):(i));%待检测的样本
      %YB=x((i-15):(i))-X((i-15):(i));改成这个以后,无论怎么调整参数都不收敛
      YBstd=std(YB);
    else
      YBstd=0;
    end
    if YBstd>3*sqrt(SIGMAD)%如果局部样本标准差大于三倍(可改)观测误差的标准差,则判断为NLOS
      Flag(i)=0;
      %设置调整参数
      lambda=1.4;
      %由状态方程得到的预测值
      X1=Phi*X0;
      %计算上述预测的协方差矩阵
      P1=Phi*P0*(Phi')+Gamma*Q*(Gamma');
      %计算滤波增益(加权系数)
      K=P1*(H')*inv(Q*P1*(H')+lambda*R);
      %计算观察值
      Y=x(i)+lambda*R;
      %加权得到滤波输出值
      X2=X1+K*(Y-S*X1-SIGMA_NLOS);
    else
      %由状态方程得到的预测值
      X1=Phi*X0;
      %计算上述预测的协方差矩阵
      P1=Phi*P0*(Phi')+Gamma*Q*(Gamma');
      %计算滤波增益(加权系数)
      K=P1*(H')*inv(P*P1*(H')+R);
      %计算观察值
      Y=x(i)+R;
      %加权得到滤波输出值
      X2=X1+K*(Y-H*X1);
    end
    %记录和更新
    P2=(-K*H)*P1;
    X(i)=X2(1);
    X0=X2;
    P0=P2;

end
专业级算法设计&代写程序,GreenSim团队QQ:761222791
页: [1]
查看完整版本: 有偏卡尔曼滤波器Matlab源码