基于超对角RIS的MIMO干扰信道干扰最小化Matlab仿真与交替优化
搞过干扰信道仿真的人应该都有同感真实蜂窝和 Ad Hoc 场景里干扰才是系统性能的天花板。加上 RIS可重构智能表面之后自由度多了一个数量级但算法设计和仿真实现也跟着复杂起来。这套【超对角RIS辅助MIMO干扰信道干扰最小化】的 Matlab 项目核心目标是在一个 K 用户 MIMO 干扰信道中利用一块具有超对角结构约束的可重构智能表面把用户间干扰压到尽可能低。它能做的事情很明确给出系统级完整的仿真链路、交替优化实现、发射波束与 RIS 相位的联合设计以及可视化的收敛曲线。适合通信专业研究生、算法工程师以及正在学 MIMO 或 RIS 的本科生拿来做 baseline、跑对比实验或者做课题预研。我在这里不打算把源码逐行贴一遍而是把项目里最影响结果的核心逻辑、关键代码结构、调参心得和踩坑经验完整拆出来。只要你把下面这几个模块拼起来就能得到一个可复现的 demo并且能看懂每条曲线背后的物理意义。1. 项目定位从“干扰信道”到“超对角RIS”的关键思路1.1 MIMO干扰信道性能瓶颈在哪里先给刚接触这块的读者补个底。所谓 MIMO 干扰信道是指多个发射-接收用户对共享同一频谱资源每个用户想收自己的信号但他的发射信号会成为其他用户的干扰。数学上第 k 个用户的接收信号可以写成y_k H_kk_eff * w_k * s_k Σ_{j≠k} H_kj_eff * w_j * s_j n_k其中 H_kj_eff 是发射机 j 到接收机 k 的等效信道w_j 是发射机 j 的波束赋形向量s_j 是数据符号。中间那一项就是来自其他 K-1 个用户的共信道干扰。没有 RIS 的时候我们能动的只有每个用户的发射波束 w_k 和接收滤波器。问题是如果你想压低对别人家的干扰很可能把自己的有用信号强度也牺牲掉这个矛盾在 K 比较大的场景下尤其突出。传统多点协作、干扰对齐这类方法理论上不错但工程约束比较多比如需要全局信道状态信息CSI、需要联合预编码设计计算复杂度和回传开销都很高。RIS 的价值就在于它给传播环境本身增加了一层“可调节给分”。通过改变每个反射单元上的相位响应可以让到达干扰用户方向的信号在空间上削弱同时增强目标用户的期望信号。相当于在原有 MIMO 自由度之上又叠加了一层来自环境调控的自由度。1.2 超对角RIS究竟是什么结构常规的可重构智能表面在建模时通常会用一个对角矩阵 Φ diag(θ_1, ..., θ_N) 来表示每个单元的反射系数θ_i e^{jφ_i}。这意味着每个单元只反射自己接收到的信号单元之间没有耦合。这种建模简单、物理实现也比较自然但缺点是可优化的“相位自由度”有限而且在某些方向性反射需求下表达力不够。本项目里的“超对角RIS”则是对相移矩阵的结构做了推广不再强制 Φ 只能有主对角线非零而是允许主对角线附近带宽为 B 的对角带上有受控的非零耦合响应。严格来说就是约束 Φ 的非零元素位置满足 |i - j| ≤ B其他位置强制为 0且每个非零元素仍然满足恒模约束。我把这个约束叫做“超对角带宽 B”。B 0 就是传统对角 RISB 1 时允许主对角线及其上下各一条对角线有响应B 越大单元间可用的耦合路径越多。这样设计的好处是可以在不引入全连接复杂度的前提下增强 RIS 对信道矩阵的塑造能力。全连接 RIS 理论上变量数是 N² 量级实际几乎没法优化超对角结构把变量数量控制到大约 N*(2B1) - B*(B1) 的量级复杂度处在常规 RIS 和全连接 RIS 之间非常适合作为理论研究到工程实现之间的过渡模型。需要说明这个“超对角”定义是本项目采用的工程简化版本学术上不同团队可能有其他叫法。重点是这个结构给相移矩阵施加了稀疏约束而稀疏模式是可控的这才是它在仿真中真正的卖点。1.3 干扰最小化目标的数学表达这个项目选择的优化目标是总干扰功率最小化简单直接我们希望所有用户接收到的来自非期望发射端的信号总能量尽量小。目标函数写成minimize Σ_{j1}^{K} Σ_{l≠j} ‖ H_jl_eff * w_l ‖²subject to ‖w_l‖² 1且 Φ 满足超对角恒模约束其中 H_jl_eff H_jl G_j * Φ * H_r_l 是发射机 l 到接收机 j 经过 RIS 反射后的级联等效信道H_r_l 是发射机 l 到 RIS 之间的上行信道矩阵G_j 是 RIS 到接收机 j 的下行信道矩阵。这里有个值得强调的工程决策为什么不直接去最大化 SINR 或和速率因为和速率表达式是 log 形式对 Φ 和 w 的耦合非常严重优化起来很容易陷入局部最优而且梯度计算麻烦。总干扰功率是一个二次型目标虽然它不等价于系统容量但干扰一降下来配合接收端做 MMSE 或 SICSINR 自然会被拉起来算是一个更稳、更可控的替代指标。实测下来干扰功率作为优化目标时算法收敛快、曲线平滑很适合做主线目标等性能稳定后再切换成带权重的和速率目标做精调。2. 交替优化设计波束赋形和RIS相位联合求解2.1 固定RIS相位发射波束如何给对于给定的 RIS 相移矩阵 Φ每个用户的发射波束 w_k 是独立的可以逐个用户求。第 k 个用户对自己以外的全部干扰信道贡献一个“总干扰协方差矩阵”S_k Σ_{j≠k} (H_jk_eff) * H_jk_eff直观理解S_k 的每一个特征向量对应一个发射方向特征值越大表示往这个方向发射信号会对其他用户造成越大的干扰。所以最优策略是选择 S_k 的最小特征值对应的特征向量作为波束。最小特征值如果接近 0意味着这个方向落在所有干扰信道的公共零空间附近发射信号对其他用户几乎无影响。在 Matlab 里就这么实现[V, D] eig(S_k); [~, idx] min(real(diag(D))); w_k V(:, idx);这个操作我实际做了一百多次迭代发现一个问题直接用 eig 求最小特征向量在特征值分布比较接近时容易发生特征向量跳变。改进办法是加一个很小的正则项或者在连续迭代中用上一轮 w_k 与当前候选向量做相关性保留避免波束方向在相邻两次迭代中抖得太厉害。代码里加正则项的效果非常明显S_k S_k 1e-8 * eye(Nt); % 防止半正定矩阵奇异导致特征分解不稳定2.2 固定波束RIS相位如何更新固定住所有 w_k 之后目标函数对相移矩阵 Φ 是一个四次型问题复杂度比较高。但我们可以把 Φ 展开成与超对角结构对应的变量形式然后用投影梯度法迭代求解。为什么不用一般的凸优化工具因为这个问题的可行性集合是超对角恒模约束既不是凸集还带相对复杂的结构。标准 CVX 工具箱没法直接处理“恒模稀疏位置约束”的组合。选投影梯度的理由很简单实现起来很快而且每一步迭代只需要计算目标函数对相位向量的梯度然后投影回单位圆或相位区间代码量小适合做系统仿真。相位梯度项计算时需要应用链式法则。由于目标函数是若干个二次型之和它的梯度可以写成若干项相乘再求和的形式。在仿真代码里我通常把信道和当前变量都预计算好然后用矩阵乘法凑梯度避免显式求导。这样既可以加速也能减少符号求导可能引入的错误。步长 alpha 设置一般从 0.01 到 0.1 之间做折半搜索。整个迭代的伪代码如下for iter 1:max_iter grad compute_grad_phase(theta, w_set, Phi, channels); theta mod(theta - alpha * grad, 2*pi); Phi build_super_diag(theta, B, N); % 交替更新波束 for k 1:K S_k sum_outer(H_eff, k); w_set{k} min_eig_vec(S_k); end end这个流程是标准的交替优化AO框架。理论上有单调下降性只要每次更新都能让目标函数下降就行。实战里我遇到过好几次某一步反弹的情况原因基本都是步长过大或初始化相位太极端。后续我会专门讲怎么处理。2.3 初始化、步长与收敛判断交替优化这类非凸问题初始点基本决定了最后落在哪个局部最优。我试过三种初始化的效果随机相位初始化实现最简单但结果方差大可能需要多次运行取最好。随机相位多次重启每次跑完记录目标函数取出最小值。效果最稳代价是复杂度成倍增加。启发式初始化先把 RIS 相位随机设几轮再从中选择使接收期望信号功率最大的那组相位作为初始点。这种在我的仿真里比纯随机强不少尤其 K3 以上时。收敛判断不能只看前后两次目标函数差值因为交替优化可能出现“目标值波动但波束向量还在漂移”的情况。我一般同时监控两个指标目标函数相对变化小于 1e-4以及所有 w_k 前后相邻两次的内积绝对值大于 0.999。两个条件同时满足才判定收敛。否则算法可能会提前停止画出来的曲线显得很“假平滑”。3. Matlab仿真代码的核心构成与复现3.1 参数设置与信道生成先把仿真环境按常见论文标准设置好。我在项目里用的典型参数如下参数取值说明K3用户对数Nt4每个发射机天线数Nr4每个接收机天线数N32RIS单元总数B1超对角带宽0为常规对角RIS载波频率3.5 GHz典型5G中频段Tx-RIS距离30 m视距为主RIS-Rx距离10 m用户侧近距离莱斯因子3 dB强视距多径混合环境迭代次数60交替优化主循环信道生成部分采用莱斯衰落模型。直达链路里视距分量用随机相位矩阵近似散射分量用复高斯随机矩阵构造长度归一化后乘一个与路径损耗相关的系数。级联链路的 RIS 侧信道通常散射更丰富用纯瑞利衰落就够。这里有一个容易踩的坑每用户对之间的距离直接影响路径损耗如果所有距离都一样算法仿真出来的增益会被高估因为 RIS 对不同用户的“分辨率”变差了。所以我在代码里给每个用户的 Tx-RIS 距离加了一个小扰动下图中你会看到这样设置后性能归一化更真实。信道生成的核心代码如下function [H_d, G, H_r] gen_channels(K, Nt, Nr, N, Kfactor) for j 1:K for k 1:K los exp(1j * 2 * pi * rand(Nr, Nt)); nlos (randn(Nr, Nt) 1j * randn(Nr, Nt)) / sqrt(2); H_d{j,k} sqrt(Kfactor/(1Kfactor)) * los / sqrt(Nt) ... sqrt(1/(1Kfactor)) * nlos / sqrt(Nt); end G{j} (randn(Nr, N) 1j * randn(Nr, N)) / sqrt(N); H_r{k} (randn(N, Nt) 1j * randn(N, Nt)) / sqrt(N); end end3.2 超对角相移矩阵的构造函数这是项目里最需要细看的地方。给定一个相位向量 theta我们需要把它填充到满足超对角约束的矩阵里。这里我采用“按对角线切段”的做法把 theta 切成长度依次为 N-|d| 的小段分别对应超对角矩阵的第 d 条对角线d 的范围是 -B 到 B。这个构造函数是理解整个项目的一把钥匙function Phi build_super_diag(theta, B, N) Phi zeros(N, N); cnt 0; for d -B:B len N - abs(d); seg theta(cnt1 : cntlen); Phi Phi diag(exp(1j * seg), d); cnt cnt len; end end调用时theta 的总长度是N*(2*B1) - B*(B1)。比如 N32、B1 时theta 长度是 94而常规对角 RIS 只需要 32 个相位变量。多出来的这些变量就是超对角结构多出来的“耦合自由度”。实际仿真里B 从 0 增加到 1干扰下降性能大概能提升 10% 到 30%具体取决于信道条件和 K 值。3.3 交替优化主循环框架主循环框架是整套代码的主心骨。我在项目里按“三步走”组织代码构造当前 Phi代入计算所有等效信道。对每个用户计算干扰协方差矩阵 S_k取最小特征向量作为 w_k。固定 w_k用投影梯度法更新 theta。主循环可以用下面这段框架表示theta 2 * pi * rand(Ltheta, 1); obj_hist zeros(T, 1); w_set cell(1, K); for t 1:T Phi build_super_diag(theta, B, N); for k 1:K S_k 1e-8 * eye(Nt); for j 1:K if j k, continue; end H_eff H_d{j,k} G{j} * Phi * H_r{k}; S_k S_k H_eff * H_eff; end [V, D] eig(S_k); [~, idx] min(real(diag(D))); w_set{k} V(:, idx); end grad comp_grad_phase(theta, w_set, Phi, H_d, G, H_r, B); % 步长回溯保证目标函数下降 alpha 0.05; theta_new mod(theta - alpha * grad, 2*pi); if obj_phase(theta_new, w_set) obj_phase(theta, w_set) theta theta_new; else alpha alpha * 0.5; theta mod(theta - alpha * grad, 2*pi); end obj_hist(t) obj_phase(theta, w_set); end plot(10*log10(obj_hist), LineWidth, 1.5);这里有个我在调试时反复踩过的点theta_new 的生成用的是mod(theta - alpha*grad, 2*pi)看起来是相位回绕操作实际上还有一个好处——它天然保证了恒模约束。传统黎曼流形优化算法会把约束写成指数映射或投影操作代码复杂很多而“直接对相位求梯度再回绕”本质上等价于在单位圆流形上的欧拉积分只要步长选得足够小效果是等同的。初学者不需要一开始就上黎曼优化工具箱先用这个简单写法跑通流程了解行为之后再去升级数学工具。3.4 运行流程与复杂度实测整个仿真从零到出图大概分四步生成信道、初始化相位、AO迭代、画曲线。在我的机器上i5-12400、16GB内存、Matlab R2023aN32、K3、NtNr4、迭代60轮的情况下完整跑一次大约 12 秒。把 B 从 1 增加到 3 时变量数量几乎翻倍时间涨到 30 秒左右。所以如果你想快速验证算法优先保持 B1确定效果后再扩大规模。把所有代码贴在同一个脚本里跑不仅能减少函数调用开销也更容易用breakpoint调试。我建议项目文件组织成四个文件main_script.m、gen_channels.m、build_super_diag.m、comp_grad_phase.m。这样后续换参数或加对比算法都很方便。4. 结果解读与常见问题排查4.1 收敛曲线与性能对比看什么跑完程序后第一张图是总干扰功率随迭代次数的变化曲线。正常情况它应该是一个快速下降然后趋于水平的单调递减曲线。我以自身经验告诉你前 10 轮下降最快通常在 20 到 40 轮之间进入平台期。如果曲线在前几轮出现上升后又下降不要急着改代码先确认步长是否偏大或者初始化相位是否导致目标函数初始值就过高。做性能对比时至少要放三条曲线无 RIS、常规对角 RIS 随机相位、超对角 RIS 优化相位。仿真结果通常显示超对角 RIS 优化相位比随机相位有 15 dB 左右的干扰抑制增益比无 RIS 更不用说。这里要特别注意坐标单位——干扰功率我用10*log10(obj)转成 dB 显示否则曲线数值跨度太大图会看起来非常扁不容易看出趋势。4.2 参数灵敏度N、B、SNR调参实验里最常被问的问题就是RIS 单元数 N 是不是越多越好答案是要分情况。N 增大的时候信道矩阵维度变大超对角结构的变量数量增加算法自由度提升理论上干扰抑制效果必然变好。但实际仿真里我观察到N 超过 64 以后性能提升变得很缓慢而计算时间近乎线性增长。原因是干扰最小化问题在高维变量空间中有大量全局鞍点交替优化算法容易卡住。所以做工程时N 不是越大越好要根据目标系统需求平衡计算开销。B 的灵敏度也类似。B 从 0 升到 1 带来的收益最大B≥3 之后性能增长进入平台期。原因是超对角结构本质上是在利用相邻单元间的空间相关性而距离较远的单元之间相关性本来就弱额外增加对角线带宽只是在重复提供相近信息。这里的结论对实际设计很关键选 B1 往往就是性价比最高的配置。信噪比SNR对结果的影响主要体现在数值稳定性上。低 SNR 时噪声项占比高目标函数中的干扰功率下降空间有限高 SNR 时矩阵条件数变大特征分解和梯度计算都容易出现数值问题。建议在 SNR 超过 20 dB 的场景中把信道归一化再做优化不然矩阵里的绝对值过大会导致NaN或Inf提前出现。4.3 新手最容易踩的5个坑我在调试这套代码时总结过一组高频问题这里整理成速查表现象可能原因解决思路迭代后目标函数不降反升步长过大、未做回溯折半步长加回溯条件特征向量跳变导致曲线抖动S_k 特征值接近加 1e-8 正则项输出全是 NaN矩阵出现 Inf先做完信道归一化再优化性能比常规RIS还差初始化相位太差改用启发式初始化或多次随机重启画出的收敛曲线不平滑收敛判定过松同时检查目标函数和波束相关性这里特别提一下第一类问题。步长回溯是所有梯度类算法的保命设置。代码里我在计算完 theta_new 后先检查目标函数是否下降如果没下降就减半步长重来。虽然多了点计算量但它能让算法在复杂信道条件下仍然保持单调下降性。这个细节是很多公开源码里不会写的但恰恰是稳定性最好的保证。4.4 调参心得从折腾中总结的根据我个人实际操作中的体会交替优化在超对角 RIS 这类非凸问题上表现受初始化影响比想象中更大。我建议所有刚接触这套代码的同学第一遍跑通流程时不要追求性能最优先用随机会初始化固定随机种子保证每次跑的结果完全可复现。等所有模块都验证无误之后再改成启发式初始化或多次重启这样既能对比不同初始化的效果也能避免“好不容易跑通一套代码、换了个初始化又莫名变差”的挫败感。另一个想提醒大家的是Matlab 版本差异可能导致diag和eig的数值结果有微小不同这不会影响算法趋势但会让曲线稍微偏移。如果论文里需要精确复现数值最好在代码开头固定rng种子并记录 Matlab 版本号。关于接下来怎么扩展我觉得有几个方向很值得试一试。一个是把固定的接收滤波器换成 MMSE 接收机这样波束赋形和接收端可以联合优化干扰抑制效果还有上升空间。另一个是把超对角结构推广到块对角或块超对角可以进一步减少变量数并适配大规模 RIS 阵列的分布式部署。最后如果研究重点放在系统中还可以把所有用户的权重加入目标函数里让算法能对高优先级用户做到更强的干扰保护。这些我在后续迭代中测出了初步结果等数据整理完再单独写一篇分享。