RSSI指纹定位技术性能仿真(matlab,详细介绍仿真方案的设计、结果及结论、完整代码)

一、仿真要求

要求一:RSSI的测量值由对数路径损耗模型产生,为减小波动造成的误差,其值可由多次测量取平均值来得到。
要求二:定位指纹数据库的建立是基于网格形式产生不同的指纹节点。
要求三: 比较KNN算法与WKNN算法的CDF曲线对比图,横坐标为定位误差,纵坐标为CDF。

二、仿真方案的设计、仿真结果及结论

1.仿真方案的设计

由接收端位置节点接收多个参考节点RSSI值所构成的矢量—指纹,位置指纹的定位算法分为数据库建立和位置估计阶段。(离线阶段:构建位置WiFi指纹数据库获取参考点的RSSI;线上阶段:把接收端接收的指纹与数据库中的指纹进行匹配并输出待定位置的RSSI信息,最后得到目标位置估计。)如图:
在这里插入图片描述
位置指纹库(获取RSSI值:对于每一个参考节点,都能够接收到部署到其各自周围的M个的信号强度,这些RSSI值通常是多次测量求平均值构成的的指纹,N个PR点就构建了指纹数据库。)如图:
在这里插入图片描述
对于某个未知指纹究竟对应指纹数据库参考节点RP指纹的哪一个,用到位置估计算法(基于位置指纹的定位算法分为确定性的定位算法包括最近邻算法NN、K近邻算法KNN、加权K近邻算法WKNN;基于概率的定位算法包括基于贝叶斯的概率法。)
在这里插入图片描述
最近邻算法NN:当待测目标进入定位区域,得到一个指纹,将这个实测指纹与数据库中的指纹数据进行匹配,相似度大(待测指纹与数据库中的指纹构成M维空间点与点的距离越小)的那个指纹对应的位置便是待测目标的位置估计。
K近邻算法KNN:当待测目标进入定位区域,得到一个指纹,将这个实测指纹与数据库中的指纹数据进行匹配,提取最相似的K个指纹,假设权值一样均为1,其中K个指纹分别对应的参考节点的坐标 x . . . , y . . . (x...,y...) 取重心。
加权K近邻算法WKNN:当待测目标进入定位区域,得到一个指纹,将这个实测指纹与数据库中的指纹数据进行匹配,提取最相似的K个指纹,其中K个指纹的距离衡量相似度(距离越小相似度越高,用距离的倒数作为加权指数),权值不一样,相似度高的权重越大权值越多,这样可以提高定位精度。

2.仿真结果

在这里插入图片描述
从图中可以看出,横坐标为定位误差,纵坐标为累计分布函数CDF,红色代表加权K近邻算法WKNN、蓝色代表K近邻算法KNN、黄色代表最近邻算法NN。

3.结论

RSSI的测量值由对数路径损耗模型产生,为减小波动造成的误差,其值可由多次测量取平均值得到;定位指纹数据库的建立是基于网格形式产生不同的指纹节点;累积分布函数 (CDF) 计算给定x值的累积概率;定位精度的性能WKNN算法大于KNN算法大于NN算法;随着定位误差的逐渐增大,KNN和WKNN的优势更明显,CDF概率曲线分布增加更快,这意味着定位精度更精确。

三、完整的仿真代码

  • main.m函数代码如下:
clear all; 
clc; 
BS1=[0,0];
BS2=[500,0];
BS3=[500,500];
BS4=[0,500]; 
std_var=4; 
A=[BS1;BS2;BS3;BS4];  
pd0=0;
n=3; 
tt=5;
% the number of RSSI measurement for each BS
number=1000;
for i=1:number
    MS=[400*rand,400*rand];
    r1=A-ones(4,1)*MS;
    r2=(sum(r1.^2,2)).^(1/2);
    for k=1:tt
        rssi(:,k)=pd0-10*n*log10(r2)-10^(std_var/10)*randn(4,1);
    end
    RSSIoone=mean(rssi,2);
    %database
    X=databaseone(A,std_var);
    %matching
    [m,~]=size(X);
    for j=1:m
        distance(j)=norm(X(j,3:end)-RSSIoone');
    end
    [C,I]=sort(distance);
    %KNN algorithm
    K=50;
    match_result=X(I(1:K),1:2);
    est1=mean(match_result);
    RMSE1(i)=norm(est1-MS);
    %WKNN algorithm
    weight=1./C(1:K);
    weight=weight'/sum(weight);
    est2=sum([weight.*match_result(:,1),weight.*match_result(:,2)]);
    RMSE2(i)=norm(est2-MS);
    est3=X(I(1),1:2);
    RMSE3(i)=norm(est3-MS);
end
RMSE=0:20;
for i=1:length(RMSE)
    n1=0;
    n2=0;
    n3=0;
    for j=1:number-5
        if RMSE1(j)<=RMSE(i)
            n1=n1+1;
        end
        if RMSE2(j)<=RMSE(i)
            n2=n2+1;
        end
        if RMSE3(j)<=RMSE(i)
            n3=n3+1;
        end
    end
    p1(i)=n1/number;
    p2(i)=n2/number;
    p3(i)=n3/number;
end
% plot 
plot(RMSE,p1,'-O',RMSE,p2,'-s',RMSE,p3,'-x') 
xlabel('The localization error (m)'); 
ylabel('CDF'); 
legend('KNN','WKNN','NN');
  • databaseone.m函数代码如下:
function [X]=databaseone(A,sigma)
% A is the coordinate of BSS
% sigma is the standard deviation of RSSI measurement
pd0=0;
n=3;
[m,~]=size(A);
tt=5;
coor=[];
RSSIone=[];
for i=20:20:480
    for j=20:20:480
        coor1=[i,j];
        coor=[coor;coor1];
        d1=A-ones(m,1)*coor1;
        d2=sum(d1.^2,2);
        d=d2.^(1/2);
        for k=1:tt
            rssi(:,k)=pd0-10*n*log10(d)-10^(sigma/10)*randn(m,1);
        end
        RSS_m=mean(rssi,2)';
        RSSIone=[RSSIone;RSS_m];
    end
end
X=[coor,RSSIone];

本次的RSSI指纹定位技术性能仿真基本完成,运行的时候速度不是太快很正常,thanks!

猜你喜欢

转载自blog.csdn.net/qq_44830040/article/details/106803660
今日推荐