RTI无线电层析成像Matlab仿真数据生成

文章目录

  • 概述
  • 初始化环境参数
    • 生成环境和节点位置计算
    • 逆面积椭圆模型
    • 高斯随机场
  • 数据生成
    • 生成由墙体组成的随机空间损耗场图像
    • 估计无线电信号链路质量

概述

无线电层析成像是一种通过获取一定区域内多对相对固定的无线通信节点间的某种测量数据后,按照一定的数学处理方法,对区域内的障碍物目标以图像的形式
展现出来的成像技术。

开山之作:
J. Wilson and N. Patwari, “Radio tomographic imaging with wireless networks,”
IEEE Trans. Mobile Comput., vol. 9, no. 5, pp. 621–632,May 2010.
Radio tomographic imaging with wireless networks

优势:

  1. 不要求物体佩戴任何设备;
  2. 无线电波可以穿透物理结构。
    RTI无线电层析成像Matlab仿真数据生成_第1张图片

初始化环境参数

生成环境和节点位置计算

代码是初始化环境参数,并生成用于深度学习的训练数据和测试数据的代码。主要包括以下部分:

输入参数:包括移动射频节点数量、每个节点收集数据的航点数、信噪比范围、路径损耗指数范围、全球平均发射功率水平范围、信号角度范围、Kappa参数(用于生成空间相关的高斯随机场)、节点遍历区域大小、图像原点坐标、图像大小、像素大小、白色像素的衰减、垂直、水平和方形墙的最小/最大值等。

数据预分配:预先分配一些变量的空间,包括像素数、UWB链路数、每个链路的UWB数据数等。

节点位置计算:根据输入参数计算每个节点的所有坐标。

数据存储:预先分配存储数据的空间,包括节点位置、UWB节点间距离、SLF权重、不匹配实验的SLF权重和偏置的权重。

生成权重和距离:根据节点位置和输入参数生成SLF权重和UWB节点间距离。

生成空间相关的高斯随机场:根据图像大小、像素大小和Kappa参数生成空间相关的高斯随机场,并进行Cholesky分解得到上三角矩阵。

%M:移动RF节点的数量
%Tw:每个节点收集数据的航点数
%sig_epsilon_range:噪声信噪比的范围
%alpha_range:路径损耗指数的范围
%b_range:全局平均发射功率水平的范围
%sig_theta_range:SLF图像的标准差范围
%kappa:空间相关性高斯随机场的参数
%areabounds:节点遍历区域的大小
%imgorg:图像的左下角坐标
%imgdims:图像的大小(像素)
%pixelsize:每个像素的长度/宽度 %dBwhite:白色像素的衰减值(分贝)
%wallcount_vec:垂直、水平和方形墙壁的最小/最大数量

clear; clc; close all;  % 清空命令窗口、清空工作区、关闭所有图窗

M  = 4;              %number of mobile RF nodes  移动射频节点的数量
Tw = 6;              %number of waypoints for each node to gather data from  每个节点收集数据的航点数,一条边上有6个航点
sig_epsilon_range = [0.3,1,3];    % SNR is about 30,40,50  信噪比约为30、40、50
%对于信噪比(SNR),通常使用以分贝(dB)为单位的对数比值来表示。在这里,sig_epsilon_range = [0.3,1,3] 是指信噪比的范围,其中的值是对应于SNR的对数比值。
%SNR = 10 * log10(sig_epsilon_range^2)
%当 sig_epsilon_range = 0.3 时,SNR ≈ 30 dB 当 sig_epsilon_range = 1 时,SNR ≈ 40 dB 当 sig_epsilon_range = 3 时,SNR ≈ 50 dB
%低噪、中噪、高噪
alpha_range = [0.9 1];     % path loss exponent  路径损耗指数
b_range = [90 100];        %global avg TX "level" (db)  全球平均发射功率水平(分贝)

sig_theta_range = [0.01,0.03,0.09];  % 信号角度范围
%sig_theta_range中的三个值分别为0.01、0.03和0.09,表示了三种不同的信号角度范围。较小的值表示信号角度范围较窄,即信号的传输方向相对集中。较大的值表示信号角度范围较宽,即信号的传输方向相对分散。
%通过在生成数据时使用不同的sig_theta值,可以模拟不同的信号角度环境。这样可以更好地评估和比较算法在不同信号角度条件下的性能和鲁棒性。


kappa = 0.21;  % kappa参数,用于生成空间相关的高斯随机场
%kappa参数用于生成空间相关的高斯随机场(GRF)。GRF是一种随机过程,用于建模空间中的随机变量,如图像或地理数据。
%在这里,kappa参数被用于生成空间相关的高斯随机场的协方差矩阵。协方差矩阵描述了随机变量之间的相关性和方差。kappa的值决定了GRF的空间相关性的程度。
%较小的kappa值会导致GRF的相关性较弱,即相邻像素之间的相关性较低。这意味着生成的随机场在空间上具有较大的变化和不规则性。
%较大的kappa值会导致GRF的相关性较强,即相邻像素之间的相关性较高。这意味着生成的随机场在空间上具有较为平滑和连续的变化。
%通过调整kappa值,可以控制生成的随机场的空间相关性,从而适应不同的应用需求和模拟场景。
areabounds = [0 5 0 5];    %size of the node traverse area (m) [xmin xmax ymin ymax]  节点遍历区域的大小(米)
imgorg = [0.5 0.5];        %lower left corner of the image [x y] (m)  图像的左下角坐标(米)
imgdims = [40 40];         %image size in pixels  图像的大小(像素)
pixelsize = 0.1;           %l/w of each square pixel (m)  每个正方形像素的长度/宽度(米)
dBwhite = 1;               %dB atten of a white pixel  白色像素的衰减(分贝)
wallcount_vec = [0 2 0 2 1 3]; %min/max for vertical , horizontal and square walls  垂直、水平和方形墙的最小/最大值
%表示垂直、水平和方形墙壁的最小和最大数量。这个向量中的值用来限制在区域内生成的墙壁的数量。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%preallocate data  预分配数据
K = imgdims(1)*imgdims(2);         %pixel count  像素数
N_Link = M*(M-1);                  %Number of UWB Links  UWB链路数
N_Tw = Tw^2;                       %number of UWB data per link  每个链路的UWB数据数
%每条链路连接连接两个节点,每个节点可以在6个航点上移动
x_1=0; y_1=0; 
x_2 = imgdims(2)*pixelsize+2*imgorg(1);      %UWB node range  UWB节点范围
y_2 = imgdims(1)*pixelsize+2*imgorg(2);
x_distance = (imgdims(2)-1)*pixelsize/(Tw-1);  %distance of two position of per node  每个节点两个位置之间的距离
y_distance = (imgdims(1)-1)*pixelsize/(Tw-1);
x_org = imgorg(1)+0.5*pixelsize;         %coordinate of first UWB node  第一个UWB节点的坐标
y_org = imgorg(2)+0.5*pixelsize;

% all coordinates of each node  每个节点的所有坐标
c = NaN(M,Tw);
for Twi = 1:Tw          %Tw point per node
    pos_node(1,Twi) = x_org + (Twi-1)*x_distance + 1j * y_1;
    pos_node(2,Twi) = x_2 + 1j * (y_org + (Twi-1)*y_distance);
    pos_node(3,Twi) = x_org + (Twi-1)*x_distance + 1j * y_2;
    pos_node(4,Twi) = x_1 + 1j * (y_org + (Twi-1)*y_distance);
end 

%通过 for 循环,对于每个节点,根据给定的参数计算节点的坐标,并将其存储在 pos_node 矩阵中。

%具体来说,对于每个节点,根据节点的索引 Twi 和给定的参数(x_org、y_org、x_distance、y_distance),计算出节点在不同路径点上的坐标。

%对于节点 1,其 x 坐标为 x_org + (Twi-1)*x_distance,y 坐标为 y_1。在这里,路径点是沿着 x 轴移动的。
%(0.55,0)	(1.33,0)	(2.11,0)	(2.89,0)	(3.67,0)	(4.45,0)
%对于节点 2,其 x 坐标为 x_2,y 坐标为 y_org + (Twi-1)*y_distance。在这里,路径点是沿着 y 轴移动的。
%(5,0.55)	(5,1.33)	(5,2.11)	(5,2.89)	(5,3.67)	(5,4.45)
%对于节点 3,其 x 坐标为 x_org + (Twi-1)*x_distance,y 坐标为 y_2。在这里,路径点是沿着 x 轴移动的。
%(0.55,5)	(1.33,5)	(2.11,5)	(2.89,5)	(3.67,5)	(4.45,5)
%对于节点 4,其 x 坐标为 x_1,y 坐标为 y_org + (Twi-1)*y_distance。在这里,路径点是沿着 y 轴移动的。
%(0,0.55)	(0,1.33)	(0,2.11)	(0,2.89)	(0,3.67)	(0,4.45)


%store the data  存储数据
nodepos = NaN(2,N_Tw,N_Link);     
%nodepos 是一个大小为 2 x N_Tw x N_Link 的矩阵,用于存储每个测量的UWB节点的位置。N_Tw代表每个节点的路径点数,N_Link代表链路的数量。
d = NaN(N_Link*N_Tw,1);                 %distance of UWB node for each measurements  每个测量的UWB节点间距离
W = NaN(N_Link*N_Tw,K);                 %weight of slf  slf的权重
W_ENR = NaN(N_Link*N_Tw,K);             %weight of slf for mismatched experiments  用于不匹配实验的slf权重
Z = zeros(N_Link*N_Tw,N_Link);          %weight of bias  偏置的权重

%node position calculation  节点位置计算
N_Linki = 0;
for i1 = 1:M
    for i2 = 1:M
        if i1 ~= i2
            N_Linki = N_Linki + 1;
            for Twi = 1:Tw
                nodepos(1,(Twi-1)*Tw+1:Twi*Tw,N_Linki)=pos_node(i1,Twi)*ones(1,Tw);
                nodepos(2,(Twi-1)*Tw+1:Twi*Tw,N_Linki)=pos_node(i2,:);
                %分别记录下对于每条链路,节点的位置
            end 
        end
    end
end 
%(Twi-1)Tw+1:TwiTw表示节点i1在nodepos矩阵中的位置索引范围。例如,当Twi=1时,索引范围为1:Tw;当Twi=2时,索引范围为Tw+1:2*Tw,依此类推。
%通过pos_node(i1,Twi)*ones(1,Tw)的赋值,将节点i1在路径点Twi上的坐标赋给了nodepos矩阵的第一个维度中指定的索引范围。这样,nodepos矩阵中的相应位置就存储了节点i1在不同路径点上的坐标信息。
%generate weight and distance  生成权重和距离
for N_Linki = 1:N_Link
    W((N_Linki-1)*N_Tw+1:N_Linki*N_Tw,:) = ...
        f_gen_Wi_ellipse(nodepos(:,:,N_Linki),pixelsize,imgorg,imgdims,1,2);
        % Inverse Area Elliptical Model:
        %B. R. Hamilton, X. Ma, R. J. Baxley, and S. M. Matechik, ‘‘Propagation
        %modeling for radio frequency tomography in wireless networks,   IEEE J.
        %Sel. Topics Signal Process., vol. 8, no. 1, pp. 55–65, Feb. 2014.
%     W((N_Linki-1)*N_Tw+1:N_Linki*N_Tw,:) = ...
%         f_gen_Wi(nodepos(:,:,N_Linki),pixelsize,imgorg,imgdims,1,2);     % Normalized Ellipse Model
    di = abs( nodepos(1,:,N_Linki) - nodepos(2,:,N_Linki) )';              %link lengths
%   使用abs函数计算向量差的绝对值,得到节点之间的距离(欧式距离)。
    d((N_Linki-1)*N_Tw+1:N_Linki*N_Tw,1) = 20 * log10( di );%将距离转换为分贝单位
    Z((N_Linki-1)*N_Tw+1:N_Linki*N_Tw,N_Linki) = ones(N_Tw,1);%将Z矩阵中对应链路的列设置为1,表示偏置的权重。
end 

C_theta = f_gen_C(imgdims,pixelsize,kappa);   % spatial correlated Gaussian random field
R_theta = chol(C_theta);  % 生成C_theta的上三角矩阵
%根据图像大小、像素大小和Kappa参数生成空间相关的高斯随机场,并进行Cholesky分解得到上三角矩阵。

逆面积椭圆模型

Inverse Area Elliptical Model:
Propagation Modeling for Radio Frequency Tomography in Wireless Networks

逆面积椭圆模型基于以下假设和原理:

  1. 假设无线电信号在传播过程中遵循自由空间传播模型。
  2. 假设目标区域的电磁波传播具有各向同性特性。
  3. 假设目标区域的电磁波传播路径可以近似为直线传播。
  4. 假设目标区域的电磁波传播路径与正常方向形成的夹角较小,使得传播路径可以近似为椭圆弧。

基于以上假设,逆面积椭圆模型的计算过程如下:

  1. 首先,根据图像的行数和列数确定像素总数K。
  2. 对于每个像素,计算像素相对于目标区域的椭圆中心的位置。
  3. 根据椭圆模型的公式计算像素的权重。权重的计算基于椭圆的半长轴、半短轴和椭圆弧的关系。通常使用的权重公式是根据椭圆的半长轴、半短轴和像素到椭圆中心的距离计算的。这个公式可以保证在椭圆中心处的权重最大,随着像素距离椭圆中心的距离增加,权重逐渐减小。
  4. 将计算得到的像素权重作为权重矩阵的一行,最终得到整个链路的权重矩阵。

论文中的逆面积椭圆模型的公式如下:

X i j = 1 π u u 2 + d 2 X_{ij} = \frac{1}{{\pi u \sqrt{u^2 + d^2}}} Xij=πuu2+d2 1

其中, X i j X_{ij} Xij表示像素权重, u u u表示像素到椭圆中心的距离, d d d表示两个节点之间的距离。

通过这个公式,像素的权重与像素到椭圆中心的距离成反比。当像素越接近椭圆中心时,权重越大,反之,权重越小。这种权重计算方式可以更准确地反映无线电信号在像素上的传播强度。

与归一化椭圆模型相比,逆面积椭圆模型具有以下优势:

  1. 更准确的权重计算:逆面积椭圆模型考虑了像素到椭圆中心的距离,使得权重计算更加准确。这样可以更好地反映无线电信号在不同像素上的传播强度。

  2. 更好的图像质量:逆面积椭圆模型能够提供更高质量的成像结果。通过更准确的权重计算,可以减少成像中的噪声和伪像,提高图像的清晰度和准确性。

  3. 更好的目标定位和形状识别:逆面积椭圆模型能够更精确地定位目标区域,并提供更准确的形状识别。相比于归一化椭圆模型,逆面积椭圆模型能够更好地捕捉到目标区域的细节和边缘信息。

function [ Wi ] = f_gen_Wi_ellipse( nodepos, pixelsize, imgorg, imgdims, i1, i2 )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% f_gen_Wi : GENERATE A WEIGHT MATRIX FOR THE ITH LINK (BIN) IN THE SYSTEM
% This function calls f_pixel_weights to compile all the relevant weights for all measurements taken
% between a given pair of nodes
% nodepos - array of node positions with time
% pixelsize - l/w of each square pixel (m)
% imgorg - [x y] position of lower left corner of image(m)
% imgdims - [rows cols] of the image
% i1 - node index of the TX, i2 - node index of the RX  (link i)
% Wi ( ni x K ) - weights for link i 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ni = size(nodepos,2); %# of time steps
K = imgdims(1)*imgdims(2); %pixel count

Wi = NaN(ni,K);
if i1 ~= i2 
    for j = 1:ni %loop over individual link's measurements
        p1 = [real(nodepos(i1,j)) imag(nodepos(i1,j))];
        p2 = [real(nodepos(i2,j)) imag(nodepos(i2,j))];
        Wi(j,:) = f_pixel_weights_3(imgdims,pixelsize,imgorg,p1,p2);
    end
else
    Wi = zeros(ni,K); %invalid link
end

end
function Xij = f_pixel_weights_3(imgdims, pixelsize, imgorg, p1, p2)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% COMPUTES THE PIXEL WEIGHTS FOR SINGLE MEASUREMENT J OF LINK I (tomographic projection) %
% Xij (1 x numpixels) - row vector of weights for the given points. inverse area ellipse %
% imgdims (1x2) - number of [rows cols] in the image. the image is assumed to reside in  %
%   the first quadrant, with the lower left corner at the origin                         %
% pixelsize - the PHYSICAL length of a pixel's sides, assumed to be square pixels (m)    %
% imgorg (1x2) - physical [x y] location of the lower left corner of the image (m)       %
% p1, p2 (1x2) - [x y] locations of the two nodes of interest (m)                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% inverse area ellipse model

freq_RF = 2.4e9;  % RF 2.4 GHz
lanpt = 3e8/freq_RF;    %wave length

p1 = p1' - imgorg';
p2 = p2' - imgorg'; %scale points to "single units"
fai = (p1-p2)/norm(p1-p2);   %projection vector
c = (p1+p2)/2;               % center of the ellipse
d = norm(p1-p2);

K = imgdims(1)*imgdims(2); %pixel count
bb = zeros(1,K);
u = NaN(1,K);
u_max = 0.5*sqrt(1*lanpt*d);

NI = 0;
for j=1:imgdims(2)   %col
    for i=1:imgdims(1)   %row
        NI = NI + 1;          % number of pixels
        sx = (j-0.5)*pixelsize;
        sy = (imgdims(1)-i+0.5)*pixelsize;
        px = fai(1)*(sx-c(1))+fai(2)*(sy-c(2));
        py = -fai(2)*(sx-c(1))+fai(1)*(sy-c(2));
        a0 = 1; b0 = -(px^2+py^2-d^2); c0 = -py^2*d^2;
        u_2 = (-b0 + sqrt(b0^2-4*a0*c0))/(2*a0);
        u(1,NI) = sqrt(u_2);
        if u(1,NI)<u_max
            if u(1,NI)<0.05
                u(1,NI) = 0.05;
            end
            bb(1,NI) = 1/(pi*u(1,NI)*sqrt(u(1,NI)^2+d^2));
        end
    end 
end
Xij = bb;
% imshow(reshape(Xij,[40,40]),[0 max(Xij)])

% %DEBUG plot code

end

根据代码中的变量和计算过程,用数学公式来具象化一下代码中的中间变量:

  1. 投影向量fai:

    f a i = p 1 − p 2 ∥ p 1 − p 2 ∥ \mathbf{fai} = \frac{\mathbf{p1} - \mathbf{p2}}{\|\mathbf{p1} - \mathbf{p2}\|} fai=p1p2p1p2

    投影向量fai表示从节点p1指向节点p2的方向向量。它的物理含义是两个节点之间的传播方向。

  2. 椭圆中心c:

    c = p 1 + p 2 2 \mathbf{c} = \frac{\mathbf{p1} + \mathbf{p2}}{2} c=2p1+p2

    椭圆中心c表示节点p1和节点p2之间的中心位置,两个节点之间传播路径的中心点。

  3. 两个节点之间的距离d:

    d = ∥ p 1 − p 2 ∥ d = \|\mathbf{p1} - \mathbf{p2}\| d=p1p2

    两个节点之间的距离d表示节点p1和节点p2之间的物理距离。表示两个节点之间的传播路径的长度。

  4. 像素的物理坐标 ( x , y ) (x, y) (x,y)

    x = ( j − 0.5 ) × pixelsize x = (j - 0.5) \times \text{pixelsize} x=(j0.5)×pixelsize
    y = ( imgdims ( 1 ) − i + 0.5 ) × pixelsize y = (\text{imgdims}(1) - i + 0.5) \times \text{pixelsize} y=(imgdims(1)i+0.5)×pixelsize

    像素的物理坐标表示像素在图像中的具体位置。其中,j表示列索引,i表示行索引。这些公式根据像素的索引和像素大小将像素的位置转换为物理坐标。

  5. 像素相对于椭圆中心的位置(px, py):

    px = f a i ( 1 ) × ( x − c ( 1 ) ) + f a i ( 2 ) × ( y − c ( 2 ) ) \text{px} = \mathbf{fai}(1) \times (x - c(1)) + \mathbf{fai}(2) \times (y - c(2)) px=fai(1)×(xc(1))+fai(2)×(yc(2))
    py = − f a i ( 2 ) × ( x − c ( 1 ) ) + f a i ( 1 ) × ( y − c ( 2 ) ) \text{py} = -\mathbf{fai}(2) \times (x - c(1)) + \mathbf{fai}(1) \times (y - c(2)) py=fai(2)×(xc(1))+fai(1)×(yc(2))

    像素相对于椭圆中心的位置表示像素相对于椭圆中心的偏移量。

  6. 计算权重的中间变量u:

    a 0 = 1 a_0 = 1 a0=1
    b 0 = − ( px 2 + py 2 − d 2 ) b_0 = -(\text{px}^2 + \text{py}^2 - d^2) b0=(px2+py2d2)
    c 0 = − py 2 × d 2 c_0 = -\text{py}^2 \times d^2 c0=py2×d2
    u 2 = − b 0 + b 0 2 − 4 a 0 c 0 2 a 0 u_2 = \frac{-b_0 + \sqrt{b_0^2 - 4a_0c_0}}{2a_0} u2=2a0b0+b024a0c0
    u = u 2 u = \sqrt{u_2} u=u2

    这些中间变量用于计算像素的权重。它们基于椭圆模型的方程来计算像素的权重。通过计算像素相对于椭圆中心的位置和椭圆模型的公式,可以得到中间变量u。

  7. 计算像素的权重bb:

    如果 u < 0.05 u < 0.05 u<0.05,则 u = 0.05 u = 0.05 u=0.05
    这是为了避免u过小导致权重计算出现除以接近于零的值的情况。当u值非常接近于零时,权重计算公式中的分母会接近于零,这可能会导致除法运算产生无穷大或非常大的值。为了避免这种情况,代码中将u的最小值限制为0.05。将u设置为0.05是一种经验性的做法,目的是确保权重计算的稳定性和可靠性。通过将u的最小值设置为一个较小的值,可以避免权重计算过程中出现数值不稳定的情况,并确保计算得到的权重在合理的范围内。这样可以提高无线电频率层析成像的准确性和稳定性
    bb ( N I ) = 1 π u u 2 + d 2 \text{bb}(NI) = \frac{1}{\pi u \sqrt{u^2 + d^2}} bb(NI)=πuu2+d2 1

    像素的权重bb表示像素的相对重要性或传播强度。它的物理含义是像素在传播路径中的权重,即像素对于目标成像的贡献程度。

高斯随机场

在空间相关的高斯随机场模型中,随机变量被假设为服从多元高斯分布,并且不同位置的随机变量之间存在一定的空间相关性。
具体而言,该模型假设随机变量在空间上具有平稳性和空间相关性,即任意两个随机变量之间的相关程度与它们之间的空间距离有关。
空间相关的高斯随机场模型可以通过协方差函数或者变差函数来描述随机变量之间的空间相关性。
协方差函数描述了随机变量之间的线性相关性,而变差函数描述了随机变量之间的非线性相关性。

C_theta = f_gen_C(imgdims,pixelsize,kappa)

计算协方差矩阵,计算出的C_theta是(16001600)的矩阵(1600=4040)。
kappa是用来控制空间协方差函数的传播范围的参数。具体来说,它是指数函数中的一个除数,用于调整像素之间的距离对协方差的影响程度。
指数函数在计算空间协方差时的形式为 C = exp(-dmn / kappa),其中dmn表示像素之间的距离。通过调整kappa的值,可以控制指数函数的衰减速度。
当kappa的值较小时,指数函数的衰减速度较慢,像素之间的距离对协方差的影响较大,即相关性会在较远的像素之间保持较强;而当kappa的值较大时,指数函数的衰减速度较快,像素之间的距离对协方差的影响较小,即相关性会在较近的像素之间迅速减弱。

function [ C ] = f_gen_C( imgdims, pixelsize, kappa  )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% COMPUTE SPATIAL COVARIANCE MATRIX                           %
% inputs:                                                     %
%   imgdims (1x2) rows, cols in the image                     %
%   pixelsize - physical size of the sides of a pixel (m)     %
%   kappa - a priori covar spread parameter (m)               %
% outputs:                                                    %
%   C - the spatial covariance function                       %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
M = imgdims(1); N = imgdims(2); Y = pixelsize; X = pixelsize;

%grid: store y,x coords of pixel m,n (row,col) (center) as a vector:
%grid(r,:) gives the y,x coordinates of pixel r
[m, n] = ndgrid(0:M-1,0:N-1);  %生成一个网格,表示图像中每个像素的坐标
grid = [-m*Y-Y/2   n*X+X/2]; % 计算每个像素的中心坐标,并将结果存储在grid矩阵中  
grid = reshape(grid,M*N,2);     % 二维的像素坐标转换为一维的向量
%dmn: distance from pixel m to pixel n 
[m, n] = ndgrid(1:M*N,1:M*N); 
dmn = sqrt( sum( (grid(m,:)-grid(n,:)).^2 ,2) ); 
dmn = reshape(dmn,M*N,M*N);

%Cg: spatial covariance matrix: exponential function of pixel distance
C = exp(-dmn / kappa); %使用指数函数来表示像素之间的空间相关性,距离越近相关性越强。

end

Cholesky Decomposition : Matrix Decomposition

R_theta = chol(C_theta); 

Cholesky分解是一种常用的数值计算方法,用于将对称正定矩阵分解为一个下三角矩阵和它的转置的乘积。在生成高斯随机场时,Cholesky分解用于从指定的协方差矩阵生成样本。

Cholesky分解的条件是输入矩阵必须是对称正定的。对称正定矩阵具有以下性质:

  • 对于任意非零向量z, z T A z > 0 z^T A z > 0 zTAz>0,其中A是对称正定矩阵。

推导过程:
假设我们有一个对称正定矩阵A,我们要找到一个下三角矩阵L,使得 A = L L T A = LL^T A=LLT
我们对L的元素进行逐列的计算,可以使用如下的递推关系式:
L i j = { A i j − ∑ k = 1 i − 1 L i k 2 , if  i = j 1 L j j ( A i j − ∑ k = 1 j − 1 L i k L j k ) , if  i > j L_{ij} = \begin{cases} \sqrt{A_{ij} - \sum_{k=1}^{i-1}L_{ik}^2}, & \text{if } i=j \\ \frac{1}{L_{jj}}(A_{ij} - \sum_{k=1}^{j-1}L_{ik}L_{jk}), & \text{if } i>j \end{cases} Lij= Aijk=1i1Lik2 ,Ljj1(Aijk=1j1LikLjk),if i=jif i>j

在生成高斯随机场时,Cholesky分解用于从指定的协方差矩阵生成样本。通过将协方差矩阵进行Cholesky分解,我们可以得到一个下三角矩阵L。然后,通过生成一个均值为0、方差为1的标准正态分布随机变量向量z,并将z乘以L的转置,就可以得到一个满足指定均值和协方差的高斯随机场样本。
推荐阅读:
线性方程组-直接法 1:Gauss消去与LU分解
线性方程组-直接法 2:Cholesky分解

数据生成

以下是在运行"Environment_P6_SNR30_40_50.m"文件后运行的,该文件初始化了用于生成数据的环境参数。主要包括以下部分:

生成随机图像:设置不同的随机种子进行训练集和测试集的生成。定义了一些变量,包括真实环境图像、ENR估计的环境图像、L1正则化估计的环境图像、噪声图像、路径损耗、偏置、RSS测量数据、噪声水平、信号角度标准差和噪声。

生成训练数据:循环生成训练数据,包括生成随机的偏置和路径损耗、随机生成真实环境图像、在真实环境图像上加入噪声、计算RSS测量数据。

使用ENR估计SLF图像:使用ENR算法估计SLF图像。

数据归一化:将偏置和路径损耗进行归一化。

保存数据:将RSS测量数据、去噪后的RSS测量数据、真实环境图像、ENR估计的环境图像、归一化的偏置和路径损耗、噪声水平保存为MAT文件。

计算RMSE:计算ENR估计的环境图像和真实环境图像的均方根误差(RMSE)。

可视化:随机选取10个样本,分别显示真实环境图像和ENR估计的环境图像。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Run this file after running Environment_P6_SNR30_40_50.m
% which initializes environment parameters for generating data
% Generate training/testing data for Deep Learning with uncalibrated alpha and b              %
% theta_vec  :  flatten SLF image     
% b  :  bias.       alpha  :  path loss exponent
% ab_norm  :  [b_norm, alpha_norm]
% sig_epsilon_class  :  noise level
% y  :  noisy RSS measurement input
% y_denoised  :  clean RSS measurement input (as target)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% GENERATE some RANDOM IMAGE %
% please set different random seed for training set and testing set
rng(2023);    % set random seed 
NI = 50;                 %number of images
theta_vec = NaN(K,NI);             %real environment images
%真实环境图像,是一个大小为KxNI的矩阵,其中K表示图像中像素的数量,NI表示图像的数量。每一列代表一个真实环境图像,每个元素表示对应像素的值。
theta_vec_ENR = NaN(K,NI);         %ENR estimated environment images
theta_vec_L1 = NaN(K,NI);          %L1 regularization estimated environment images
theta_vec_noise = NaN(K,NI);       %An image of an environment with noise
alpha = NaN(1,NI);                        %path loss
b = NaN(N_Link,NI);                     %bias
y = NaN(N_Link*N_Tw,NI);                 %RSS measurements data
sig_epsilon_class = NaN(NI,1);           %noise level
sig_epsilon = NaN(NI,1);
sig_theta = NaN(NI,1);
epsilon = NaN(N_Link*N_Tw,NI);

% random sig_epsilon
for i = 1:NI
    sig_epsilon_index_rand = randperm(3);
    %生成一个1到3的随机排列,存储在sig_epsilon_index_rand中。这个随机排列用于随机选择噪声水平、信号角度标准差和噪声级别类别。
    sig_epsilon_class(i) = sig_epsilon_index_rand(1)-1;   %class  0  1  2
    %将随机排列中的第一个元素减去1,将结果存储在sig_epsilon_class(i)中。
    sig_epsilon(i) = sig_epsilon_range(sig_epsilon_index_rand(1));
    %根据随机排列中的第一个元素在sig_epsilon_range中选择对应的噪声水平值,将结果存储在sig_epsilon(i)中。
    %sig_epsilon_range = [0.3,1,3]; 
    sig_theta(i) = sig_theta_range(sig_epsilon_index_rand(1));
    %sig_theta_range = [0.01,0.03,0.09]; 
end

% Generate training data
for N_img = 1:NI
    N_img
    b(:,N_img) = rand(N_Link,1)*(b_range(2)-b_range(1)) + b_range(1);  %N_img th bias
    %生成一个介于 b_range(1) 和 b_range(2) 之间的随机向量 b
    %b_range = [90 100]; 
    alpha(1,N_img) = rand*(alpha_range(2)-alpha_range(1))+alpha_range(1);
    %生成一个介于 alpha_range(1) 和 alpha_range(2) 之间的随机数
    %alpha_range = [0.9 1];  
    theta_img = f_gen_randSLFimg(imgdims(1),imgdims(2),dBwhite,wallcount_vec);
    theta_vec(:,N_img) = reshape(theta_img,K,1);
    %将生成的真实环境图像theta_img转换为大小为Kx1的向量,并存储在theta_vec的第N_img列中
    theta_vec_noise(:,N_img) = theta_vec(:,N_img) + sig_theta(N_img)*R_theta'*randn(K,1);
    %为第N_img个图像生成带有噪声的环境图像。将真实环境图像theta_vec(:,N_img)与随机生成的大小为Kx1的高斯噪声向量进行叠加,其中噪声的标准差由sig_theta(N_img)控制。
    epsilon(:,N_img) = sig_epsilon(N_img)* randn(N_Link*N_Tw,1);
    %为第N_img个图像生成噪声。使用randn函数生成一个大小为N_Link*N_Tw的高斯噪声向量,乘以sig_epsilon(N_img)的系数,得到噪声向量。                
end 

y = Z*b - 2*W*theta_vec_noise - d*alpha + epsilon;
% y(y<0) = 0;

y_denoise = Z*b - 2*W*theta_vec - d*alpha;
% y_denoise(y_denoise<0) = 0;

% ENR estimate SLF img
fprintf('Start estimating SLF with ENR.\n');
% lanpt1 = 0.5;
% lanpt2 = 5;
% lanpt1 = 0.25;
% lanpt2 = 2.5;
lanpt1 = 0.5;
lanpt2 = 2;
Cmodel_inv = inv(C_theta); Gamma = chol(Cmodel_inv); Gamma(abs(Gamma)<1e-6) = 0;
tic;
parfor N_img = 1:NI
    fprintf('Sample %d/%d is under processing.\n',N_img,NI);
    RSS_noise = y(:, N_img);
    theta_en = Estimate_slf_ENR(K,N_Link,RSS_noise,Z,W,d,lanpt1,lanpt2,Gamma);
    theta_vec_ENR(:,N_img) = reshape(theta_en,K,1);
end
toc;

% y_min = min(y_denoise,[],2);
% y_max = max(y_denoise,[],2);


% y_norm = (y-y_min)./(y_max-y_min);
% y_denoise_norm = (y_denoise-y_min)./(y_max-y_min);

b_norm = (b - b_range(1))/(b_range(2)-b_range(1));
alpha_norm = (alpha - alpha_range(1))/(alpha_range(2)-alpha_range(1));
ab_norm = [b_norm;alpha_norm];

RSS = transpose(y);
RSS_denoise = transpose(y_denoise);
slf_img = reshape(theta_vec, [imgdims(1), imgdims(2), NI]);
slf_img = permute(slf_img, [3, 1, 2]);
slf_img_ENR = reshape(theta_vec_ENR, [imgdims(1), imgdims(2), NI]);
slf_img_ENR = permute(slf_img_ENR, [3, 1, 2]);
% slf_img_L1 = reshape(theta_vec_L1, [imgdims(1), imgdims(2), NI]);
% slf_img_L1 = permute(slf_img_L1, [3, 1, 2]);
ab_norm = transpose(ab_norm);
%将变量进行归一化处理,然后根据给定的维度对数据进行重构和重排,最终得到重构后的数据矩阵和向量。
save('..\data\testing_data.mat','RSS','RSS_denoise', 'slf_img', 'slf_img_ENR', 'ab_norm', 'sig_epsilon_class');

rmse_ENR_all = sqrt(mean((slf_img_ENR - slf_img).^2, 'all'))
index_low = (sig_epsilon_class==0);
index_mid = (sig_epsilon_class==1);
index_high = (sig_epsilon_class==2);
rmse_low = sqrt(mean((slf_img_ENR(index_low,:,:) - slf_img(index_low,:,:)).^2, 'all'))
rmse_mid = sqrt(mean((slf_img_ENR(index_mid,:,:) - slf_img(index_mid,:,:)).^2, 'all'))
rmse_high = sqrt(mean((slf_img_ENR(index_high,:,:) - slf_img(index_high,:,:)).^2, 'all'))
%评估重构图像slf_img_ENR和原始图像slf_img之间的差异

for samplei = 1:10
    figure
    imshow(squeeze(slf_img(samplei,:,:)),[0 1],'initialmagnification','fit');
    %显示原始图像slf_img中的第samplei个样本。
    % squeeze函数用于去除维度为1的维度,然后使用imshow函数显示图像,灰度值范围为0到1,
    % initialmagnification参数设置为fit表示自动缩放图像以适应窗口大小。
    figure
    imshow(squeeze(slf_img_ENR(samplei,:,:)),[0 1],'initialmagnification','fit');
end

生成由墙体组成的随机空间损耗场图像

function [ SLF_rand ] = f_gen_randSLFimg( M,N,dBwhite,wallcount_vec )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% func_gen_randSLFimg: generate a random spatial loss field image consisting of wall pieces        %
%   M,N: # of rows/cols in the image, 5x5 pixel MINIMUM                                            %
%   dBwhite: maximum attenuation for a wall pixel (dB)                                             %
%   wallcount_vec: [VMIN VMAX HMIN HMAX SMIN SMAX] 
%   the bounds on the possible count of vert. , horz. walls and squares                            %
%                                                                                                  %
% OUTPUTS:                                                                                         %
% SLF_rand: the randomly generated spatial loss field image                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

SLF_rand = zeros(M,N); %创建一个大小为MxN的零矩阵,作为最终生成的随机空间损耗场图像。
num_vwalls = randi(wallcount_vec(1:2),1); %random number of vertical walls in the image
num_hwalls = randi(wallcount_vec(3:4),1); %" " horizontal walls
num_square = randi(wallcount_vec(5:6),1); %" " horizontal walls

vwall_len = randi([4 floor(0.6*M)],num_vwalls,1); %length of each vertical wall
hwall_len = randi([4 floor(0.6*N)],num_hwalls,1); %"" horiz. wall
squ_len=randi([1 floor(0.1*min(M,N))],num_square,1); %square len

vwall_atten = 0.6*dBwhite + rand(num_vwalls,1)*(0.4*dBwhite); %attenuations of each wall
hwall_atten = 0.6*dBwhite + rand(num_hwalls,1)*(0.4*dBwhite);
squ_atten= 0.6*dBwhite + rand(num_square,1)*(0.4*dBwhite);

vwall_pos = zeros(num_vwalls,2); %store row,col of start of each vwall
hwall_pos = zeros(num_hwalls,2); % " " hwall
squ_pos = zeros(num_square,2);
vwall_width = zeros(num_vwalls,1);
hwall_width = zeros(num_hwalls,1);
for i = 1:num_vwalls
    vwall_width(i)=randi([1 max(1,floor(0.18*vwall_len(i)))],1);   %ith wall's width
    %根据垂直墙的长度 vwall_len(i) 来生成一个随机的宽度,宽度的范围为 1 到 max(1, floor(0.18 * vwall_len(i)))
    vwall_pos(i,1) = randi(M-vwall_len(i)+1,1); %row pos of vert wall i  
    vwall_pos(i,2) = randi(N-vwall_width(i)+1,1);              %col pos " "
end
for i = 1:num_hwalls
    hwall_width(i)=randi([1 max(1,floor(0.18*hwall_len(i)))],1);   %ith wall's width
    hwall_pos(i,1) = randi(M-hwall_width(i)+1,1);              %row pos of horiz. wall i
    hwall_pos(i,2) = randi(N-hwall_len(i)+1,1); %col pos " "
end
for i = 1:num_square
    squ_pos(i,1) = randi(M-squ_len(i)+1,1); %row pos of square wall i  
    squ_pos(i,2) = randi(N-squ_len(i)+1,1);              %col pos " "
end

%fill in the wall attenuation values
for i = 1:num_vwalls
    SLF_rand( vwall_pos(i,1):(vwall_pos(i,1)+vwall_len(i)-1) , vwall_pos(i,2):(vwall_pos(i,2)+vwall_width(i)-1) ) = vwall_atten(i);
    %每个垂直墙的衰减值 vwall_atten(i) 填充到空间损耗场图像 SLF_rand 的对应位置上。
end
for i = 1:num_hwalls
    SLF_rand( hwall_pos(i,1):(hwall_pos(i,1)+hwall_width(i)-1) , hwall_pos(i,2):(hwall_pos(i,2)+hwall_len(i)-1) ) = hwall_atten(i);
end
for i = 1:num_square
    SLF_rand( squ_pos(i,1):(squ_pos(i,1)+squ_len(i)-1) , squ_pos(i,2):(squ_pos(i,2)+squ_len(i)-1) ) = squ_atten(i);
end

% % DEBUG PLOT CODE %
% imshow(SLF_rand,[0 dBwhite],'initialmagnification','fit');

end

估计无线电信号链路质量

这段代码是一个用于估计无线电信号链路质量的函数。它使用了凸优化库CVX进行求解。

函数的输入参数包括K(无线节点的数量)、N_Link(链路的数量)、RSS_noise(噪声的接收信号强度)、Z、W、d、lanpt1、lanpt2和Gamma。

函数的目标是最小化RSS_noise与估计的信号强度之间的差异,并且还考虑了正则化项来平衡信号强度的稀疏性和信号强度的分布。

约束条件包括信号强度的非负性、链路强度的范围以及信号强度的限制。

最后,函数返回估计的信号强度theta_en。

需要注意的是,这段代码使用了CVX库进行凸优化求解,因此需要安装并配置CVX库才能运行。

function r=Estimate_slf_ENR(K,N_Link,RSS_noise,Z,W,d,lanpt1,lanpt2,Gamma)
cvx_begin quiet
    variable theta_en(K,1) nonnegative
    variable b_en(N_Link,1) nonnegative
    variable alpha_en(1,1) nonnegative
    % For 2-norm form, please refer to http://cvxr.com/cvx/doc/advanced.html#eliminating-quadratic-forms
    minimize norm(RSS_noise - Z*b_en + 2*W*theta_en + d*alpha_en) +...
        lanpt1 * norm(theta_en,1) + lanpt2 * norm(Gamma * theta_en)
    subject to 
        0 <= theta_en <=1;
        90 <= b_en <= 100;
        0.9 <= alpha_en <=1;
cvx_end
r=theta_en;
end

你可能感兴趣的:(RTI,matlab)