基于MATLAB的RSSI定位算法仿真
clc;
clear,close all;
BorderHeight=1000;%區域長度
BorderWidth=[10,8,5,3];%區域寬度
BeanconAmountA=51;%信標節點數量
Dis=BorderHeight/(BeanconAmountA-1); %信標節點間的距離
R=50;%節點的通信距離
BigBeacon=3;%選取的信號強度最大的節點數目
LoopNum=100;%試驗重復次數
SBeta=3;
for x=1:4
? ? gl1=0;
? ? gl2=0;
? ? gl3=0;
? ? gl4=0;
? ? for m=1:LoopNum
? ? ? ? m
? ? ? ?%生成移動節點坐標
? ? ? ?Dx=BorderHeight.*rand(1,1);
? ? ? ?Dy=BorderWidth(x).*rand(1,1);
? ? ? ?UN=[Dx,Dy];
? ? ? ?for j=1:BeanconAmountA
? ? ? ? ?Beacon(:,j)=[j;(j-1)*Dis;0];%沿區域一側生成信標節點坐標
? ? ? ? ?distance(:,j)=sqrt((Dx-((j-1)*Dis))^2+Dy^2);%計算移動節點到信標的距離
? ? ? ?end
? ? ? ?figure(1);
? ? ? ?
? ? ? ? ? ? %畫出節點部署圖 ? ?
% ? ? ? ? ? ? plot(Dx,Dy,'k.');
? ? ? ? ? ? hold on
% ? ? ? ? ? ? plot(Beacon(2,1:BeanconAmountA),Beacon(3,1:BeanconAmountA),'r*');
% ? ? ? ? ? ? xlim([0,BorderHeight]);
% ? ? ? ? ? ? ylim([0,BorderWidth]);
% ? ? ? ? ? ? title('* 紅色信標節點 . 黑色移動節點');
? ? ? ? %用標準RSSI方法測算距離
? ? ? ? Loc=LocByRssi(UN,Beacon,distance,BeanconAmountA,R,BigBeacon,Dis,Dx,Dy,m,SBeta);
? ? ? ? %用動態路徑衰落指數的RSSI方法測算距離
? ? ? ? ?X=LocByDRssi(UN,Beacon,distance,BeanconAmountA,R,BigBeacon,Dis,Dx,Dy,m,SBeta);
? ? ? ? %求點位誤差、橫向誤差、縱向誤差
? ? ? ? ?error1(1,m)=sqrt((abs(Dx-X(1)))^2+(abs(Dy-X(2)))^2);
? ? ? ? ?error1(2,m)=abs(X(1)-Dx);
? ? ? ? ?error1(3,m)=abs(X(2)-Dy);
? ? ? ? ?
? ? ? ? ?error2(1,m)=sqrt((abs(Dx-Loc(1)))^2+(abs(Dy-Loc(2)))^2);
? ? ? ? ?error2(2,m)=abs(Loc(1)-Dx);
? ? ? ? ?error2(3,m)=abs(Loc(2)-Dy);
? ? ? ? ?
? ? ? ? ?%統計兩種算法誤差落在1m以內的次數
? ? ? ? ?if error1(1,m)<1?
? ? ? ? ? ? gl1=gl1 +1;?
? ? ? ? ?end
? ? ? ? ?if error2(1,m)<1?
? ? ? ? ? ? gl2=gl2 +1;?
? ? ? ? ?end
? ? ? ? ?
? ? ? ? ?%統計兩種算法誤差落在1.5m以內的次數
? ? ? ? ?if error1(1,m)<1.5?
? ? ? ? ? ? gl3=gl3+1;?
? ? ? ? ?end
? ? ? ? ?if error2(1,m)<1.5?
? ? ? ? ? ? gl4=gl4+1;?
? ? ? ? ?end
? ? end
? ?
? ? %統計動態beta值算法誤差落在1m、1.5m以內的概率
? ? gltj1(x,1)=(gl1/m)*100;
? ? gltj1(x,2)=(gl3/m)*100;
? ??
? ??
? ? %統計標準RSSI算法誤差落在1m、1.5m以內的概率
? ? gltj2(x,1)=(gl2/m)*100;
? ? gltj2(x,2)=(gl4/m)*100;
? ??
? ? max1(x,1)=max(error1(1,:));
? ? max1(x,2)=max(error1(2,:));
? ? max1(x,3)=max(error1(3,:));
? ? avg1(x,:)=mean(error1,2);
? ? std1(x,1)=std(error1(1,:));
? ? std1(x,2)=std(error1(2,:));
? ? std1(x,3)=std(error1(3,:));
? ??
? ? max2(x,1)=max(error2(1,:));
? ? max2(x,2)=max(error2(2,:));
? ? max2(x,3)=max(error2(3,:));
? ? avg2(x,:)=mean(error2,2);
? ? std2(x,1)=std(error2(1,:));
? ? std2(x,2)=std(error2(2,:));
? ? std2(x,3)=std(error2(3,:));
? ? error(x,:) = mean(error1(:,:),1);
end
for i=1:4
? ? wucha1(i)=((avg2(i,1)-avg1(i,1))/avg2(i,1))*100;
? ? wucha2(i)=((std2(i,1)-std1(i,1))/std2(i,1))*100;
end
max1
avg1
std1
??
max2
avg2
std2
??
wucha1
wucha2
??
gltj1
gltj2
Accuracy=error/R
figure;
plot(error(1,:),'-o');
title('移動節點的點位誤差')
figure;
plot(error(2,:),':+')
title('移動節點的縱向誤差')
? ?
figure;
plot(error(3,:),':+')
title('移動節點的橫向誤差')
figure;
plot(error(4,:),':+')
title('移動節點的橫向誤差2')
Aucc1=0;
Aucc2=0;
for m=i:LoopNum
? ? Aucc1=Aucc1+error(3,m);
? ? Aucc2=Aucc2+error(4,m);
end
Aucc1=Aucc1/LoopNum
Aucc2=Aucc2/LoopNum
?D148
總結
以上是生活随笔為你收集整理的基于MATLAB的RSSI定位算法仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于MATLAB的TDOA算法的仿真
- 下一篇: 基于MATLAB的RSSI 和 PLE