之前写了许多最新的智能反射面文章的读后感, 现在这一领域的文章也是井喷式爆发。 但是网上公布的代码非常少, 这篇博客就分享下如何用matlab建模仿真智能反射面信道
主流的智能反射面系统大同小异,这里就随便截取了一篇文章中的系统框图来示意。 简单来说,智能反射面系统可以分为三个信道:
英文缩写中,
首先是考虑经过智能反射面的信道, 即BS-IRS 和 IRS-UE信道。 这两个信道都可以看做是传统的MIMO信道, 我们考虑现在最热的毫米波信道, 即具有稀疏性, 径数有限。 **另外需要指出的是, 由于IRS是一个平面,因此其天线响应向量(array response vector),应当按照 UPA (uniform planar array) 来算, 而不能按ULA (uniform linear array)。 因此, 其响应可以写为:
其中, ϕ \phi ϕ 和 θ \theta θ 分别代表了信号入射的方位角 (azimuth angle) 和 仰角 (elevation angle)。 N N N代表的是天线总数(智能反射面反射因子数)。 λ \lambda λ是波长, d d d是天线间隔, 由于一般都设置有 d = 0.5 λ d=0.5\lambda d=0.5λ, 上式可以进一步化简。
同样的,现在主流的基站的发送天线一般也以UPA形式为主。 因此, BS-IRS信道实际上就是两个UPA之间的MIMO信道仿真。 首先先写一个函数, 来实现单侧UPA的天线响应向量的仿真:
function y = array_response(phi,theta, N)
for m= 0:sqrt(N)-1
for n= 0:sqrt(N)-1
y(m*(sqrt(N))+n+1) = exp( 1i* pi* ( m*sin(phi)*sin(theta) + n*cos(theta) ) );
end
end
y = y.'/sqrt(N);
end
这里假设了UPA是正方形UPA,即横向和纵向的阵子数相等。 如果想考虑长方形UPA的话可以自行修改, 但如果只是想简单地仿真一个智能反射面信道的话完全可以用上述代码实现。 具体就不过多展开了,就是将上面的响应公式翻译成了matlab代码而已。
有了这个函数, 就能很快地仿真BS-IRS信道了:
function H = generate_channel(Nt, Nr, L)
AoD = pi*rand(L, 2) - pi/2; %-2/pi~2/pi
AOA = pi*rand(L, 2) - pi/2; %-2/pi~2/pi
alpha(1) = 1; % gain of the LoS
alpha(2:L) = 10^(-0.5)*(randn(1,L-1)+1i*randn(1,L-1))/sqrt(2);
H = zeros(Nr, Nt);
for l=1:1:L
ar = array_response(AOA(L,1),AOA(L,2), Nr);
at = array_response(AOD(L,1),AOD(L,2), Nt);
H = H + sqrt(Nr * Nt)*alpha(l)*ar*at';
end
其中, Nt 代表发送天线数, Nr代表接收天线数, L代表路径总数 (1条LOS直射径+(L-1)条NLOS径)。
每条径需要包含四个变量: 发送的方位角和仰角; 接收的方位角和仰角。 我们生成AOD, 代表发送的方位角和仰角。
AOD = pi*rand(L, 2) - pi/2;
这里相当于生成了 L × 2 L \times 2 L×2 个 − 0.5 π -0.5\pi −0.5π~ 0.5 π 0.5\pi 0.5π的角度,其中每条路径各有发送方位角和仰角一个。 AOA同理。
这里需要指出, 实际中方位角和仰角的变化范围应该不同,仰角的变化范围会偏小, 因此更合理的仿真应该进一步限制其生成范围。 但就像上面所说,如果只是为了随机生成智能反射面信道用于仿真,不用纠结的那么细。
α \alpha α代表的是信道的衰落系数, 为了区别LOS径和NLOS径,我们默认第一径是LOS径,给了归一化的能量为1。 而NLOS径的能量则是高斯变量, 并且为了体现出与LOS径的能量差, 给了一个衰减系数。
因为疫情在家,没有mathpix,实在懒得自己手打latex,就截了下MIMO的公式。 和我们的模型有一点点区别, 但是每一径的生成是一样的,就是根据发送角和到达角分别生成ar和at然后相乘并乘上衰落因子。 懂的自然懂,不懂的可以根据我的代码反推一下。
这样的话就可以仿真BS-IRS信道了, 而 IRS - UE的信道也同理,同样可以建模为上面这个信道模型。
关于BS-UE的信道, 有几种不同的建模: