Matlab代码实现智能反射面的信道仿真
主要存在三个信道:
- 基站到UE 的直达经: BS-UE信道
- 基站到IRS 的直达经:BS_IRS信道
- IRS到用户的信道: IRS-UE信道
与传统 MIMO 系统不一样的是,BS-IRS与IRS-UE信道,这两个均可以看作是传统的MIMO信道。
考虑毫米波信道,毫米波信具有稀疏性,径数有限。
IRS是一个平面,所以其天线响应向量(array response vector)应该是一个UPA (uniform planar array)
因此其响应应该写作:
其中,
ϕ
\phi
ϕ 和
θ
\theta
θ 分别表示信号入射的方位角(azimuth angle)以及仰角(elevation angle),_N_表示天线数,而在IRS中表示其元素个数。
同样的,现在主流的基站的发送天线一般也以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的话可以自行修改。
所以仿真**BS-IRS **信道,即 定义AoA 以及AoD,路径数,以及不同路径上的增益:
function H =generate_channel(Nt,Nr,L)
AoD = pi*rand(L,2) - pi/2 ; % -pi/2 ~ 2/pi
AoA = pi*rand(L,2) - pi/2 ; % -pi/2 ~ 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: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
这里需要指出, 实际中方位角和仰角的变化范围应该不同,仰角的变化范围会偏小, 因此更合理的仿真应该进一步限制其生成范围。矩阵的生成都是基于发送角和到达角分别生成ar和at然后相乘并乘上衰落因子的 。
关于BS-UE的信道, 有几种不同的建模:
直接假设BS-UE间被阻隔, 即不存在这个信道。 这样的话也就不用仿真了。 这个场景也是合理的,许多论文中都是这样假设的。
假设被阻隔, 即不存在LOS径, 但是有NLOS径。 那么就可以用上面的代码去仿真,只需要把LOS径去掉就行了。
假设为瑞利衰落信道。 这个是最容易仿真的, 也有许多论文采用这个建模。 瑞利的仿真代码非常容易, 网上也有很多,不再赘述了。
智能反射面代码复现学习:PARAFAC-Based Channel Estimation for Intelligent Reflective Surface Assisted MIMO System
- addpath
用addpath把文件加入它的工作路径后,就不会弹出提示。 - global
global用来顶一个一个全局变量,对global的使用要慎重,首先需要先声明再使用;其次注意不要重名,可以用大写变量来区分;然后在子函数里面你又用到了n这个全局变量,你需要在子函数里面再次声明:最后是程序结束后要使用clear global来清除。
- 图中存在两个信道,即BS-IRS,以及IRS-UT,Z = XH^T
G = generate_channel_LOS(NI, Nr, P);
H = generate_channel_LOS(Nt, NI, P);
Z =H';
- 发送导频以及IRS的元素采用DFT生成
S= gen.DFTmatrix();
-
生成tensor 张量
Y = gen_tensor(G,H,Z) -
估计信道
[G_est, H_est, diff, e] = BLAS(S, eye(Nt), Y);
Hc = G * H;
Hc_est = G_est * H_est;
mseG(n) = (norm(G - G_est, 'fro') / norm(G, 'fro'))^2;
mseH(n) = (norm(H - H_est, 'fro') / norm(H, 'fro'))^2;
mse(n) = (norm(Hc - Hc_est, 'fro') / norm(Hc, 'fro'))^2;