本博客環境爲Matlab2018 ,軟件版本不同可能會有些出入,需要稍作修改。
RSSI指紋定位技術
仿真要求
要求一:RSSI的測量值由對數路徑損耗模型產生,爲減小波動造成的誤差,其值可由多次測量取平均值來得到。
要求二:定位指紋數據庫的建立是基於網格形式產生不同的指紋節點。
要求三: 比較KNN算法與WKNN算法的CDF曲線對比圖,橫座標爲定位誤差,縱座標爲CDF。
代碼如下:
主函數,我的文件命名爲RSSI1.m
clear all;
clc;
BS1=[0,0];
BS2=[500,0];
BS3=[500,500];
BS4=[0,500];
std_var=4; %陰影效應,四個基站
A=[BS1;BS2;BS3;BS4]; %矩陣A包含基站的座標
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);%構建數據庫,m個第三列
for j=1:m
distance(j)=norm(X(j,3:end)-RSSIoone');
end
[C,I]=sort(distance);
%KNN algorithm
K=3;
match_result=X(I(1:K),1:2);%矩陣的行1-k,
est1=mean(match_result);%得到knn
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;%初始化都爲0
n2=0;
n3=0;
for j=1:number-5%計算累積分佈函數
if RMSE1(j)<=RMSE(i) % knn
n1=n1+1;
end
if RMSE2(j)<=RMSE(i) % wnn
n2=n2+1;
end
if RMSE3(j)<=RMSE(i) % nn
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函數,我的文件命名爲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的集合
運行結果如下圖所示: