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!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章