本博客環境爲Matlab2018 ,軟件版本不同可能會有些出入,需要稍作修改。
RSSI測距定位技術
仿真要求
要求一:RSSI的測量值由對數路徑損耗模型產生,爲減小波動造成的誤差,其值可由多次測量取平均值來得到。
要求二:對數路徑損耗模型中的參考距離路徑損耗和路徑損耗因子可通過參考點相互之間的測量值估計。
要求三:完成理想情況下(參考距離路徑損耗和路徑損耗因子已知)與實際情況下的RMSE曲線對比圖,橫座標爲噪聲方差,縱座標爲RMSE。
代碼如下:
主函數,我的文件命名爲RSSI.m
% the simulation of RSSI localization algorithm
clear all;
clc;
BS1=[0,0]; %定義四個參與基站的座標位置
BS2=[500,0];
BS3=[500,500];
BS4=[0,500];
MS=[100,100]; %移動臺MS的估計位置
std_var=[0,2,4,6];
A=[BS1;BS2;BS3;BS4]; %矩陣A包含基站的座標
number=300;
pd0=0;
n=3;
tt=5;
% the number of RSSI measurement for each BS
for j=1:length(std_var)%從1循環到std_var的長度
error1=0;%初始誤差爲0
error2=0;
std_var1=std_var(j);
for i=1:number %多次循環
r1=A-ones(4,1)*MS; %矩陣A減去4*1的全一矩陣乘以MS
r2=(sum(r1.^2,2)).^(1/2);
for k=1:tt
rssi(:,k)=pd0-10*n*log10(r2)-10^(std_var1/10)*randn(4,1);
end
RSSI1=mean(rssi,2);
%理想情況
r1=10.^((RSSI1-pd0)/(-10*n));
%真實情況
[p_est,n_est]=parameter_est(A,std_var1);
r2=10.^((RSSI1-p_est)/(-10*n_est));
theta1=TOALLOP(A,r1,1); % 調用TOALLOP函數
theta2=TOALLOP(A,r2,1);
error1=error1+norm(MS-theta1)^2; %norm是返回MS-theta1的最大奇異值,即max(svd(MS-theta1)),
error2=error2+norm(MS-theta2)^2; %移動臺MS估計位置與計算的到的距離的平方
end
RMSE1(j)=(error1/number)^(1/2); %求均方根誤差
RMSE2(j)=(error2/number)^(1/2);
end
% plot
plot(std_var,RMSE1,'-O',std_var,RMSE2,'-s')
xlabel('The standard deviation of RSS measurement (db)');
ylabel('RMSE');
legend('Ideal','Real');
TOALLOP函數,我的文件命名爲TOALLOP.m
function theta=TOALLOP(A,p,j)
%A是BBS的座標
%P是範圍測量
%J是參考BS的索引
[m,~]=size(A); %size得到A的行列數賦值給[m,~],~表示佔位,就是隻要行m的值!
k=sum(A.^2,2);%矩陣A每個元素分別平方,得到新矩陣,在行求和,最爲矩陣K
k1=k([1:j-1,j+1:m],:); %取出J行
A1=A([1:j-1,j+1:m],:); %取出J行
A2=A1-ones(m-1,1)*A(j,:); %得到D,就是j行與其餘行對應值相減
p1=p([1:j-1,j+1:m],:); %取出J行
p2=p(j).^2*ones(m-1,1)-p1.^2-(k(j)*ones(m-1,1)-k1); %得到b,(Rn*Rn-R1*R1-Kn+K1)其中Kn爲對應第n個x^2+y^2
theta=1/2*inv(A2'*A2)*A2'*p2; %利用最小二乘解,得
theta=theta';%轉換爲(x,y)形式
parameter_est函數,我的文件命名爲parameter_est.m
function [pd0_est,n_est]=parameter_est(A,sigma)
%A是BBS的座標
% sigma是RSSI測量的標準差
[m,~]=size(A); %size得到A的行列數賦值給[m,~],~表示佔位,就是隻要行m的值
pd0=0;
n=3;
d=zeros(m,m);
tt=5;
%每個BS的RSSI測量數
sigma1=10^(sigma/10);
h1=[];
G1=[];
for i=1:m
for j=1:m
if i~=j
d(i,j)=norm(A(i,:)-A(j,:));
for k=1:tt
prd(k)=pd0-10*n*log10(d(i,j))-sigma1*randn;
end
RSSI=mean(prd);
d_distance=-10*log10(d(i,j));
h1=[h1;RSSI];
G1=[G1;d_distance];
end
end
end
h=h1;
[m1,~]=size(h);
G=[ones(m1,1),G1];
x=inv(G'*G)*G'*h;
pd0_est=x(1,1);
n_est=x(2,1);
end
運行結果如下圖所示: