十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

智能反射面辅助物联网的MATLAB仿真:信道建模与相位对齐

智能反射面辅助物联网的MATLAB仿真:信道建模与相位对齐 简介基于MATLAB的IRS辅助物联网网络性能仿真项目面向通信工程、物联网方向的科研人员与高年级学生。资源聚焦智能反射表面IRS如何改善信号传播、降低干扰并提升网络容量围绕路径损耗、多径效应、反射单元相位配置等核心环节展开附有MATLAB仿真脚本、说明文本及结果预览图共3个文件压缩包仅10KB轻量且便于快速上手。已有139人浏览学习。运行代码即可在MATLAB中模拟不同IRS反射策略直观对比SINR、覆盖率、吞吐量等指标变化并借助注释和说明理解梯度上升、遗传算法等相位优化思路仿真过程覆盖参数调整与结果可视化便于系统分析适合作为课程设计或相关论文的前期验证工具。1. IRS 辅助物联网网络最值得先想清楚的一件事智能反射面IRS这个方向真正开始在工程圈里流行是它在不增加发射功率、不换更贵射频器件的前提下靠大量低成本反射单元重新布置电磁传播环境把基站信号“拐”进用户所在的死角。物联网网络恰好是典型场景节点发射功率低、集中分布在楼宇遮挡的边角位置靠增设基站来解决性价比太低。仿真这个题目MATLAB 是最顺手的工具通信工具箱里延续多年的链路仿真框架天然围绕复数矩阵展开而 IRS 的一组反射单元在数学上正是一个对角相位矩阵行向量乘对角阵再乘列向量一次复数运算就把整条反射链路算完了。下面从信道建模、相位计算、蒙特卡洛主循环和正确性验证四段把这条路讲清楚重点放在参数怎么设、代码怎么写不容易错以及拿到仿真图之后怎样证明它是对的。2. 先拆系统三条信道、路径损耗与相位对齐的数学2.1 窄带模型里为什么可以把反射面当成一个对角阵物联网仿真最常见的是窄带或单载波模型频率选择性衰落先不碰每个反射单元用一个复数增益描述即可。部署场景按三个位置点展开基站 BS 在楼顶IRS 挂在对面墙面上物联网用户传感器节点在地面低矮位置。信号的传播路径有两条一条是 BS 到用户的直达链路一条是 BS 到 IRS 再到用户的反射链路。直达链路往往因为遮挡只有很弱的幅度反射链路则承担主要的信号能量搬运工作。设 IRS 有 N 个反射单元每个单元只能调节反射信号的相位不能放大信号。N 个相位组成对角矩阵 Θ diag(e^{jθ1}, …, e^{jθN})这就是反射面在基带模型里的全部作用。它和天线阵列波束成形的数学外观很像但物理上有本质区别阵列是主动发射IRS 是无源反射设计变量只有 N 个相位角。在 MATLAB 里这种结构最自然的表达就是复数矩阵乘法不需要循环逐个单元处理。接收端等效基带信号可以写成 y (h_d g^H Θ h_1) x w。这里 h_d 是 BS 到终端的直达复数增益h_1 是 N×1 维 BS 到 IRS 各单元的信道向量g 是 N×1 维 IRS 各单元到终端的信道向量g^H 表示共轭转置。这套记号一旦定下来后面所有代码的维度问题就都锁死了。2.2 MATLAB 里生成三条信道行、列约定先定死信道生成是整个仿真的地基。常见做法是用瑞利衰落作为默认小尺度模型因为它对应密集城区无直射径的保守场景适合物联网这类终端位置通常不太好的情况。路径损耗采用距离的 -α/2 次方折算到复数幅度上α 取 2.5 到 3.5 之间的值。function [h_d, h_1, g] irs_channel_gen(N, dist_mat, alpha, sigma2) % 生成 IRS 辅助物联网网络的三条信道 % 输入: % N 反射单元数 % dist_mat 结构体, 含 d_d(直达距离), d_birs(BS-IRS), d_iru(IRS-用户) % alpha 路径损耗指数, 常见取值 2.5~3.5 % sigma2 小尺度衰落方差, 默认 1 % 输出: % h_d 1x1 直达链路复数增益 % h_1 Nx1 BS 到 IRS 各单元信道 % g Nx1 IRS 各单元到终端信道 if nargin 4, sigma2 1; end % 路径损耗系数: 幅度域按距离的 -alpha/2 次方折算 pl_d dist_mat.d_d ^ (-alpha/2); pl_birs dist_mat.d_birs ^ (-alpha/2); pl_iru dist_mat.d_iru ^ (-alpha/2); % 瑞利衰落: 复高斯随机变量, 每分量方差 1/2 h_d (randn 1j*randn) / sqrt(2) * pl_d * sqrt(sigma2); h_1 (randn(N,1) 1j*randn(N,1)) / sqrt(2) * pl_birs * sqrt(sigma2); g (randn(N,1) 1j*randn(N,1)) / sqrt(2) * pl_iru * sqrt(sigma2); end这里最需要留意的是 h_1 和 g 都固定为列向量。后面计算反射链路时写 g * Th * h_1维度是 1×N 乘 N×N 乘 N×1结果正好是标量省去一堆 squeeze。衰落方差 sigma2 不建议直接写进函数体留作参数方便后面做莱斯信道扩展把第一抽头改成固定视距分量即可。2.3 相位对齐条件不是让反射最强而是让反射和直达同相反射链路的接收贡献是 g^H Θ h_1 Σ_n g(n)^* e^{jθn} h_1(n)。把每个单元的乘积记作 r_n h_1(n)g(n)则第 n 项的相位由 -arg(r_n) θ_n 决定。要让所有反射项的贡献与直达链路 h_d |h_d|e^{jφ} 同相叠加就需要满足 θ_n φ arg(r_n)即 θ_n angle(h_d) angle(h_1(n)) angle(g(n))。这个结论和很多入门资料里写的“让反射相位对齐到信道共轭”略有差别。只对齐各反射单元之间、不管直达链路得到的是反射支路自身的相干合并再加上直达链路相位才是端到端的最大比合并。两者在直达链路很强时区别不大但在物联网场景里直达链路往往很弱错一个固定相位偏置会让仿真曲线整体差几个 dB。后面第 3 章的代码会同时给出这两条曲线作为对比。3. 用 MATLAB 搭最小可运行仿真框架参数表、蒙特卡洛主循环、随机相位对照3.1 最小参数集与初始化仿真参数建议全部集中在脚本头部用结构体或独立变量管理避免在循环里改数字。下面这套参数对应一个典型的城市微蜂窝物联网场景终端低功率发射IRS 挂在 12 米高的墙面上。参数符号示例值说明载频fc2.4 GHzISM 频段物联网常用带宽Bw180 kHz窄带系统典型带宽发射功率P_dBm14 dBm物联网节点低功率发射噪声系数NF3 dB接收机噪声系数反射单元数N64IRS 规模可扫描路径损耗指数alpha2.8城市非视距典型值直达距离d_d45 mBS 到终端BS-IRS 距离d_birs20 mIRS-终端距离d_iru25 m蒙特卡洛次数M2000每个 SNR 点的信道实现数噪声功率按 kTB NF 计算在 MATLAB 里可以直接写成 N0_dBm -174 10*log10(Bw) NF得到的是 dBm 单位。转线性值用 10^(N0_dBm/10)/1000这个换算是排错时最容易翻车的地方建议单独定义一个变量 n0_power 而不是在循环里重复写公式。3.2 把一次传输封装成一个函数蒙特卡洛循环的每个迭代要做的事是固定的生成信道、配置相位、发射 BPSK 符号、过 AWGN、硬判、统计误码。把这个过程封装成函数主循环会干净很多。function ber irs_one_trial(N, dist_mat, alpha, theta, P_lin, N0, nBits) % 执行一次信道实现下的 BPSK 传输并返回误码率 % theta 为 Nx1 相位向量; theta[] 表示不部署 IRS % % 1. 生成信道 [h_d, h_1, g] irs_channel_gen(N, dist_mat, alpha); % 2. 构造等效信道系数 h_eff if isempty(theta) h_eff h_d; % 无 IRS 基线 else Th diag(exp(1j*theta)); % 对角相位矩阵 h_eff h_d g * Th * h_1; % 直达反射等效信道 end % 3. BPSK 发射、AWGN、匹配滤波硬判 x 2*(rand(1, nBits) 0.5) - 1; % 符号映射 1/-1 y sqrt(P_lin) * h_eff * x sqrt(N0/2) * (randn(1,nBits) 1j*randn(1,nBits)); x_hat real(conj(h_eff) .* y) 0; % 匹配滤波等价于乘 conj(h_eff) ber mean(x_hat ~ (x 0)); end这里有几个关键细节。h_eff 是复标量等效信道模型把反射面的 N 个相位全部折叠成了一个系数之后不需要再关心 IRS 内部结构。匹配滤波用 conj(h_eff) 而不是直接取实部是因为 h_eff 的相位会旋转整个星座图不做相位补偿的话 BPSK 解调会出现固定误码平台。nBits 建议取 1000 到 2000太小时误码率统计抖动很大太大时蒙特卡洛总时长会明显增加。3.3 三组基线无 IRS、随机相位、对齐相位性能对比实验里最常犯的错误是只对比“有 IRS 优化”和“无 IRS”两条曲线缺少随机相位这个中间参照。随机相位代表完全不控制反射面的情况它在平均意义上仍然有功率累积效果但对齐相位会体现出明显的相干增益。% 主循环: 扫描 SNR, 统计三组基线误码率 SNR_dB_list 0:4:20; M 2000; nBits 1000; N 64; alpha 2.8; dist_mat struct(d_d,45, d_birs,20, d_iru,25); P_dBm 14; N0_dBm -174 10*log10(180e3) 3; P_lin 10^((P_dBm - 30)/10); N0_lin 10^((N0_dBm - 30)/10); ber_no zeros(size(SNR_dB_list)); ber_rand zeros(size(SNR_dB_list)); ber_align zeros(size(SNR_dB_list)); for s 1:numel(SNR_dB_list) % 调整发射功率来扫描信噪比 P_trial P_lin * 10^(SNR_dB_list(s)/10) * N0_lin / P_lin; % 等效简化: SNR_dB 用发射功率与噪声功率之比表示 P_s N0_lin * 10^(SNR_dB_list(s)/10); ber_acc zeros(3,1); for m 1:M % 随机相位配置 theta_rand 2*pi*rand(N,1); % 对齐相位配置 [h_d, h_1, g] irs_channel_gen(N, dist_mat, alpha); theta_align angle(h_d) angle(h_1 .* g); ber_acc(1) ber_acc(1) irs_one_trial(N, dist_mat, alpha, [], P_s, N0_lin, nBits); ber_acc(2) ber_acc(2) irs_one_trial(N, dist_mat, alpha, theta_rand, P_s, N0_lin, nBits); ber_acc(3) ber_acc(3) irs_one_trial(N, dist_mat, alpha, theta_align, P_s, N0_lin, nBits); end ber_no(s) ber_acc(1)/M; ber_rand(s) ber_acc(2)/M; ber_align(s) ber_acc(3)/M; end figure; semilogy(SNR_dB_list, ber_no, o-, SNR_dB_list, ber_rand, s-, SNR_dB_list, ber_align, ^-); grid on;扫描 SNR 的方式需要说明一下。irs_one_trial 内部用固定的 P_lin 和 N0实际信噪比由两者比值决定所以更简单的做法是固定 N0把 P_lin 按 SNR_dB_list 逐点替换。上面的循环里 irs_channel_gen 被调用了两次一次在 irs_one_trial 内部一次在外部为算 theta_align 而生成信道这会导致对齐相位所用信道与 irs_one_trial 内部信道不一致。稳妥的做法是把 irs_one_trial 改成接收 h_d、h_1、g 作为输入外部统一生成信道后再分别计算三种配置避免重复抽取。4. 性能指标、反射相位量化与 MATLAB 排错检查单4.1 三种指标对应三种不同的工程问题物联网仿真里最常用的三个指标是接收信噪比、误码率和遍历速率。它们回答的问题不同信噪比反映链路预算够不够误码率反映真实解码性能遍历速率适合做系统级容量对比。MATLAB 里这三个指标都是一行代码的事。指标公式MATLAB 实现适用场景接收 SNR|h_eff|² P / N010*log10(abs(h_eff)^2 * P_lin / N0_lin)链路预算评估BPSK 误码率仿真统计或 Q 函数理论值mean(x_hat ~ (x 0))低速率传感链路遍历速率E[log2(1SNR)]mean(log2(1 snr_lin))系统容量对比注意 SNR 和 Eb/N0 的区别。物联网链路通常按符号信噪比 SNR 扫点因为带宽已知符号速率可以直接换算如果误码率曲线想和教科书上的理论公式对齐就要先把 SNR 折算成 Eb/N0BPSK 下 Eb/N0 SNR - 10*log10(1)QPSK 下差 3 dB。这个换算不对曲线横轴会和理论值整体偏移。4.2 反射相位量化连续相位是上限离散相位才是工程值实际 IRS 的相移器是离散的常见分辨率是 1 bit0/180 度到 4 bit22.5 度步进。连续相位仿真得到的是理论上限直接拿它当系统设计值会偏乐观。量化在 MATLAB 里实现起来很简单就是对 theta 做就近取整。function Theta quantize_irs(theta, bits) % 将连续相位量化到 2^bits 个离散值 % theta 为 Nx1 弧度相位; bits1 对应 0/pi, bits2 对应 0/pi/2/pi/3pi/2 step 2*pi / 2^bits; theta_q round(theta / step) * step; Theta diag(exp(1j*theta_q)); end量化误差对系统性能的影响随 N 增大而变得复杂单元数少时少数单元的相位误差还能靠其他单元补偿单元数多且信道独立时各单元误差近似独立等效信噪比损失趋于一个稳定值。1 bit 相位的性能损失通常在 2 dB 量级2 bit 可以压到接近连续相位的水平。仿真时建议把 bits 作为参数扫描画出 BER 随量化位数变化的曲线比闷头查文献更直观。4.3 三个一定会踩的坑坑一随机相位性能超过对齐相位。如果出现这种情况几乎可以断定信道没有在每一轮蒙特卡洛实现中重新抽样或者 theta_align 是在旧信道下算的、而误码率却在另一组信道下统计。把信道生成放在最外层、三个配置共用同一组 h_d、h_1、g这个问题就消失了。坑二增大 N 之后 SNR 饱和。常见原因是路径损耗模型没有归一化参考距离。如果直接用 d^(-alpha) 而不是 (d/d0)^(-alpha)当 d_birs 或 d_iru 小于 1 米时路径损耗因子会大于 1导致反射链路功率虚高反过来当距离很大时功率又会衰减得过快。建议把参考距离 d01m 显式写出来和实测校准值保持一致。坑三BER 曲线出现错误平台。通常不是 IRS 的问题而是解调端没有做相位补偿。BPSK 对相位敏感只有匹配滤波或等效的相位旋转补偿之后才能硬判另一个容易忽略的是噪声方差没有按 I/Q 两路拆分AWGN 的实部和虚部各占一半噪声功率正确写法是 sqrt(N0/2)(randn 1jrandn)。5. 验证仿真置信度N 的标度律、parfor 提速与参数化改造5.1 用 N 的增长斜率验证相位优化是否真的写对了判断相位对齐代码是否正确有一个非常有效的标度律检验固定 SNR扫描 IRS 单元数 N观察平均接收功率随 N 的变化。对齐相位下N 个反射单元的幅度同相叠加功率按 N² 增长换算成 dB 就是每 10 倍 N 增加约 20 dB随机相位下各单元功率非相干叠加功率按 N 线性增长每 10 倍 N 增加约 10 dB。这个差异足够大仿真曲线一眼就能看出是否符合理论预期。N_set 8:8:128; P_av_align zeros(size(N_set)); P_av_rand zeros(size(N_set)); for k 1:numel(N_set) Nk N_set(k); P_sum_a 0; P_sum_r 0; for m 1:500 [h_d, h_1, g] irs_channel_gen(Nk, dist_mat, alpha); theta_a angle(h_d) angle(h_1 .* g); P_sum_a P_sum_a abs(h_d g*diag(exp(1j*theta_a))*h_1)^2; theta_r 2*pi*rand(Nk,1); P_sum_r P_sum_r abs(h_d g*diag(exp(1j*theta_r))*h_1)^2; end P_av_align(k) 10*log10(P_sum_a/500); P_av_rand(k) 10*log10(P_sum_r/500); end如果对齐相位曲线斜率明显低于 20 dB/十倍N优先检查 theta 是否把直达链路相位也包含进去了如果随机相位曲线斜率明显高于 10 dB/十倍N说明随机相位在某一轮之后被复用了把 rand(N,1) 挪到信道生成之后即可。5.2 用 parfor 把蒙特卡洛压进等得起的范围M 到 5000 以上时内层循环会成为性能瓶颈。parfor 替换 for 前只需要确认两件事循环体内每次迭代依赖的随机数序列是否冲突以及累加变量能否用归约表达式。最简单可靠的随机数做法是让每次迭代自己构造独立参数种子在 parfor 内用rng(m, threefry)这种逐迭代重置的方式而不是依赖全局随机流否则并行池不同 worker 之间会产生完全相同的信道序列。parpool(local, 4); parfor m 1:M rng(m, threefry); % 用迭代序号做种子, 保证可复现 [h_d, h_1, g] irs_channel_gen(N, dist_mat, alpha); % ... 后续统计累加到本地变量 end需要留意的是 parfor 池启动本身有开销N64、M500、三组基线的规模不值得开并行当 N 到 256、M 到 5000 以上时4 worker 的提速通常能到 2.5 倍以上。中途想停的话把每个 SNR 点的中间结果用 save 追加到 .mat 文件比跑完一起存更稳妥。5.3 把脚本改造成函数让“改参数”只动一个结构体仿真做几次之后就会发现真正花时间的不是等 Monte Carlo 跑完而是每次改参数都要在脚本里找对应变量。常见的做法是把整个仿真主体封装成run_irs_sim(params)params 是一个带着所有默认字段的结构体调用时只需覆盖关心的字段function out run_irs_sim(params) if nargin 1, params struct(); end defaults struct(N,64, alpha,2.8, M,2000, SNR_dB_list,0:4:20, bits,2); for f fieldnames(defaults) if ~isfield(params, f{1}), params.(f{1}) defaults.(f{1}); end end % ... 主体循环, 读取 params 下各字段 out.ber_align ber_align; out.ber_rand ber_rand; end改造完成后批量实验只需要写一个循环遍历结构体数组每次调用 run_irs_sim 传入不同 N 或不同 bits结果存进 .mat 后用同一段绘图代码出图。这样的代码结构也方便之后把瑞利衰落换成莱斯或者把单天线终端换成两用户核心的等效信道公式 h_d gThetah_1 不需要动。本文还有配套的精品资源点击获取
返回列表