Matlab-RSSI测距定位技术性能仿真 理想情况下与实际情况下的RMSE曲线对比图

本博客环境为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

运行结果如下图所示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44436677/article/details/106818965
今日推荐