RSSI测距定位技术性能仿真(matlab,详细介绍仿真方案的设计、结果及结论、完整代码及注释)

一、仿真要求

要求一:RSSI的测量值由对数路径损耗模型产生,为减小波动造成的误差,其值可由多次测量取平均值来得到。
要求二:对数路径损耗模型中的参考距离路径损耗和路径损耗因子可通过参考点相互之间的测量值估计。
要求三:完成理想情况下(参考距离路径损耗和路径损耗因子已知)与实际情况下的RMSE曲线对比图,横坐标为噪声方差,纵坐标为RMSE。

二、仿真方案的设计、仿真结果及结论

1.仿真方案的设计

在这里插入图片描述

2.仿真结果

第一种情况:tt=5时
在这里插入图片描述
第二种情况:tt=10时
在这里插入图片描述
第三种情况:tt=30时
在这里插入图片描述

3.结论

在这里插入图片描述

三、完整仿真代码

1.main.m代码如下:

%RSSI定位算法的仿真
clear all;
clc;
BS1=[0,0];
BS2=[500,0];
BS3=[500,500];
BS4=[0,500];
MS=[100,500];
std_var=[0,2,4,6];%标准偏差
A=[BS1;BS2;BS3;BS4];%A表示每一个已知节点构成坐标矩阵
number=300;
pd0=0;%pd0接收功率=0db
n=3;%n表示路径损耗因子
tt=5;%每5个锚节点测量RSSI值求平均得到RSSI值
%tt=10;
%tt=30;
% 每个BS的RSSI测量值
for j=1:length(std_var)
    error1=0;
    error2=0;
    std_var1=std_var(j);
    for i=1:number%循环次数number800
        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_var1/10)*randn(4,1);%将db转换为非db,产生对数正态分布得到RSSI
        end
        RSSI1=mean(rssi,2);%求平均得到未知节点到已知节点的RSSI值,估计未知节点的坐标
        % 理想情况,prd0、n已知
        r1=10.^((RSSI1-pd0)/(-10*n));%得到r1距离
        % 实际情况
        [p_est,n_est]=parameter_est(A,std_var1);
        r2=10.^((RSSI1-p_est)/(-10*n_est));%r2维移动台未知节点到已知节点距离
        theta1=TOALLOP(A,r1,1);%输入A,已知r1,参考节点为1得到theta1估计
        theta2=TOALLOP(A,r2,1);%得到theta2估计
        error1=error1+norm(MS-theta1)^2;%均方误差
        error2=error2+norm(MS-theta2)^2;
    end
    RMSE1(j)=(error1/number)^(1/2);%理想情况RSSI标准偏差
    RMSE2(j)=(error2/number)^(1/2);%实际情况RSSI标准偏差
end
% plot
plot(std_var,RMSE1,'-O',std_var,RMSE2,'-s')
xlabel('RSSI标准偏差 (db)');
ylabel('均方根误差RMSE');
legend('理想情况','实际情况');

2.parameter_est.m(参数估计函数)代码如下:

function [pd0_est,n_est]=parameter_est(A,sigma)%参数估计函数,A是已知节点构成的坐标,sigma是标准偏差
% A是很多BS的坐标
% sigma是RSSI测量的标准差
[m,~]=size(A);%有多少个已知节点参加定位
pd0=0;
n=3;
d=zeros(m,m);%初始化固定节点坐标为0
tt=5;
% 每个BS的RSSI测量的个数
sigma1=10^(sigma/10);%db转化为非db
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;%距离为k的每个测量值的prd
            end
            RSSI=mean(prd);%平均值
            d_distance=-10*log10(d(i,j));
            h1=[h1;RSSI];%对应Ax=B的B
            G1=[G1;d_distance];%G1对应Ax=B的A
        end
    end
end
h=h1;
[m1,~]=size(h);
G=[ones(m1,1),G1];%将接收功率的式子转化为矩阵形式,构造G为n*2维矩阵
x=inv(G'*G)*G'*h;%最小二乘法得到位置估计
pd0_est=x(1,1);%pd0估计
n_est=x(2,1);%路径损耗因子估计
end

3.TOALLOP(TOA定位算法)代码如下:

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)形式

做到这里,本次的RSSI测距定位技术性能仿真基本完成,有不足欢迎评论!

猜你喜欢

转载自blog.csdn.net/qq_44830040/article/details/106533751
今日推荐