简介:本资源是一套面向电子信息工程、通信与信号处理方向本科生及初级研究者的MATLAB实践代码,聚焦主动可重构智能表面(RIS)辅助的通感一体化(ISAC)系统波束成形设计与性能评估问题,适用于课程设计、毕业设计及算法验证场景。压缩包共68个文件,含49个核心MATLAB函数(.m)、3个预置信道与场景数据(.mat)、2个备份脚本(.asv)、11个临时备份文件(.zbak)及1个README说明文档,整体大小2.44MB;代码采用参数化架构,关键变量集中定义于parafor_BS.m等配置模块,波束方向图绘制(plotbeampattern.m)、通信/雷达SINR计算(calcommSINR.m/calRadarSINR.m)、RIS功率建模(calRISpower.m)及凸优化可行性检验(Convex Opt testfeasible.m)等功能模块划分清晰,注释详实,便于理解算法流程与调试修改。已有70人学习下载,配套案例数据可直接运行,显著降低通感融合系统建模仿真门槛。 做“主动RIS辅助ISAC系统的波束成形设计与性能分析”这个课题时,我在MATLAB里前前后后写了两周多的仿真代码,中间推翻重来了不止一次。这个方向最近在无线通信圈子里确实火,RIS和ISAC都是6G预研的热点,两者叠加之后,既能用智能超表面改善通感一体化系统的覆盖,又能通过主动反射单元补偿路径损耗,解决了被动RIS“乘性衰落”导致增益兑现不了的老大难问题。这篇文章就从我自己实际跑通这套系统仿真的角度,把系统建模、波束成形设计、MATLAB实现细节和踩过的坑全部摊开讲,适合正在做RIS-ISAC方向课题的研究生,以及想快速把论文仿真跑起来的工程师参考。
1. 项目背景与系统设计思路
1.1 为什么选主动RIS做ISAC
刚开始接触这个题目时,我心里其实有个疑问:被动RIS都研究这么多年了,发射端加个智能超表面控制相位,工程上更简单,为什么非要引入“主动RIS”这个概念?后来把两者的链路预算一算就明白了。
被动RIS本质上只能调相位,反射信号幅度的最大值就是1。在实际部署中,基站到RIS再到用户的级联信道是两条链路相乘,路径损耗会累计,这就是所谓的乘性衰落问题。RIS虽然能把信号“聚”向某个方向,但总链路衰减往往还是很大。用在通信里还能靠波束成形勉强补回来,但用在ISAC系统里问题就大了——感知目标回波本身就是双程损耗,再加上RIS的乘性损耗,感知信噪比经常低到无法检测目标。
主动RIS就不一样,每个反射单元内部集成了放大电路,反射系数可以写成 a_n e^{jφ_n},其中幅度 a_n 可以大于1,相当于在反射的同时做了一级信号增强。这样一来,RIS到用户的链路损耗、目标回波路径的损耗,都能在反射面这个环节获得补偿。放到ISAC场景中,感知回波信噪比能提升不少,通信覆盖范围也能有效扩展。当然代价也很直接——每个主动单元都引入放大噪声,而且有源电路带来额外功耗,这个需要在建模里如实体现,否则结果会过度乐观。
1.2 系统架构与仿真参数设计
我实现的系统模型是一个典型的下行ISAC场景:基站配备 Nt 根发射天线,服务 K 个单天线用户,附近部署了一个含 N 个反射单元的主动RIS。基站发射的信号一路送去给用户做通信,另一路经过RIS反射或直接照射到目标,再经目标反射回基站接收机,用于目标探测与参数估计。
系统框图可以简单理解成三个角色:基站、RIS、用户(外加一个感知目标)。基站完成发射波束成形,RIS完成反射相位和幅度调控,用户端只需要单天线接收。感知部分则直接复用基站接收模块,这是ISAC“硬件复用”的核心思想。
仿真参数的设置上,我参照了常见的毫米波系统配置:
| 参数 | 数值 | 说明 |
|---|---|---|
| 基站天线数 Nt | 8 | 均匀线阵,半波长间隔 |
| 用户数 K | 2 | 单天线用户 |
| RIS单元数 N | 32 | 后续可扫16/64做对比 |
| 载波频率 | 28 GHz | 毫米波ISAC典型频段 |
| 信道模型 | 莱斯信道 | K因子10dB,含视距分量 |
| 基站总功率 Pt | 30 dBm | 等功率分配迭代 |
| RIS放大功率上限 | 20 dBm | 主动放大模块总功率约束 |
| 噪声功率谱密度 | -174 dBm/Hz | 带宽100 MHz |
设置完这些参数就可以开始搭信号模型了。这个阶段最容易犯的错误是忽略维度匹配,我后面讲到MATLAB实现时会专门说这个问题。
2. 系统建模与优化问题构建
2.1 信号模型与主动RIS噪声
系统建模是整个项目的地基,信号模型写错,后面优化做得再漂亮也白搭。我采用基带等效模型,基站发射信号为 x = Ws,其中 W ∈ C^{Nt×K} 是发射波束成形矩阵,s 是满足 E[ss^H]=I 的数据流向量。
定义 BS-RIS 信道 G(N×Nt)、RIS-User 信道 hr,k(N×1)、BS-User 直连信道 hd,k(Nt×1),那么用户 k 的接收信号为:
y_k = (hd,k^H + hr,k^H Θ G) W s + hr,k^H Θ zr + zk
其中 Θ = diag(a e^{jφ_1}, ... , a e^{jφ_N}) 是RIS反射系数矩阵,a 是公共放大增益,φ_n 是第 n 个单元的相移。zr 是主动RIS内部放大电路引入的噪声向量,每个元素方差为 σr²,zk 是用户接收噪声,方差为 σ²。
这里有个非常关键的细节:主动RIS引入的噪声跟反射系数有关。经过Θ之后,泄露到用户端的噪声功率是 a²||hr,k^H diag(e^{jφ})||²σr²。这个噪声功率不再是一个常数,而是会随着RIS相位和幅度变化,优化时需要把它放在SINR表达式的分母里一起处理。很多初学者会把主动RIS噪声当作固定噪声加到分母,这样表面上简化了,实际却会得到错误的优化结果。
信号模型写清楚之后,感知部分采用单目标点模型。基站接收到的目标回波信号为:
r = β b(θ) s + n
β 是目标反射系数,b(θ) 是取决于目标角度 θ 的回波导向向量,n 是接收机噪声。感知性能用目标角度 θ 的克拉美-罗界(CRB)来衡量,CRB越大说明参数估计越不准,我们需要约束它在一个可接受范围内。
2.2 优化目标、约束与算法框架
优化问题需要同时兼顾通信和感知性能。通信侧的目标是最大化所有用户的频谱效率之和,感知侧则把CRB作为一个约束条件,强制系统在满足感知精度要求的前提下最大化通信速率。这样比较符合ISAC系统的实际工作模式——感知通常是任务底线,通信在此基础上追求最优。
数学上可以写成:
max_{W, φ, a} Σ_{k=1}^K log2(1 + SINR_k)
s.t. Tr(WW^H) ≤ Pt
a² · Tr(diag(e^{jφ}) G W W^H G^H diag(e^{-jφ})) ≤ Pr
CRB(θ) ≤ ε
a ≥ 1, |φ_n|=1
第一个约束是基站发射功率限制,第二个是主动RIS的总放大功率限制,第三个是感知CRB约束。这个优化问题非凸且耦合严重,变量W、φ、a相互纠缠,直接联合优化几乎不可能,业界常规做法是交替优化(AO)算法。
我的算法框架分三步迭代:
- 固定φ和a,优化W。这一步可以用正则化迫零(RZF)波束成形,也可以用上行对偶+注水功率分配求WMMSE解,工程上RZF实现简单、性能稳定。
- 固定W和a,优化φ。此时问题变成带单位模约束的相位优化,用流形优化(Manopt工具箱)求解,复杂度比SDR低不少。
- 固定W和φ,优化a。这一步有闭式解,由于目标函数关于a单调递增,直接取满足功率约束的最大值即可。
整体迭代一直到目标函数变化小于阈值或者达到最大迭代次数。实际跑下来,这个AO框架收敛性很稳定,通常在20到30次迭代内就能收敛。
3. MATLAB实现:信道生成与算法核心代码
3.1 信道生成:莱斯信道与导向矢量
信道生成是MATLAB仿真里最容易被轻视却最影响结果的部分。我这里采用莱斯信道模型,视距分量通过导向矢量构造。基站侧Nt天线均匀线阵的导向矢量为:
a_BS(θ) = [1, e^{jπ sinθ}, ..., e^{jπ(Nt-1)sinθ}]^T
RIS侧同理。生成BS-RIS信道G时,视距分量用双方位的导向矢量外积得到,非视距分量用循环复高斯随机矩阵。下面是我在项目里实际使用的信道生成函数:
function [G, Hd, Hr] = generate_channels(Nt, K, N, Kfac_dB) % 生成BS-RIS信道G(NxNt)、RIS-User信道Hr(NxK)、BS-User直连信道Hd(NtxK) % Kfac_dB为莱斯K因子 kf = 10^(Kfac_dB/10); % 随机到达/离开角度,简化单径视距 theta_br = pi*rand(1,N); % BS->RIS到达角 theta_bt = pi*rand(1,Nt); % BS侧发射角 A_RIS = exp(1j*pi*(0:N-1).'*sin(theta_br)); % N x 1 导向矢量 A_BS = exp(1j*pi*(0:Nt-1).'*sin(theta_bt)); % Nt x 1 导向矢量 % BS-RIS信道 G_los = A_RIS * A_BS'; G_nlos = (randn(N,Nt) + 1j*randn(N,Nt))/sqrt(2); G = sqrt(kf/(1+kf))*G_los + sqrt(1/(1+kf))*G_nlos; % RIS-User信道:每个用户独立生成 Hr = zeros(N, K); for k = 1:K theta_r = pi*rand(1,N); A_r = exp(1j*pi*(0:N-1).'*sin(theta_r)); Hr(:,k) = sqrt(kf/(1+kf))*A_r + sqrt(1/(1+kf))*(randn(N,1)+1j*randn(N,1))/sqrt(2); end % BS-User直连信道 Hd = (randn(Nt,K) + 1j*randn(Nt,K))/sqrt(2); end有一点必须强调:这个函数里视距分量用了简化的单径模型,适合算法验证。如果要做更贴近实际部署的仿真,建议换成Saleh-Valenzuela多径毫米波信道模型,并加入路径损耗系数。路径损耗如果不加,所有信道方差都是1,功率约束和噪声设置会失真。
信道生成后最好逐链路归一化检查,确保平均信道增益在合理范围。我曾经因为忘记除以sqrt(2)导致噪声相对功率异常,结果优化出来的性能曲线整体偏移,排查了很久。
3.2 交替优化核心代码
交替优化是整个仿真工程的主循环。我先把框架贴出来,再逐个函数解释。
function [W_opt, theta_opt, a_opt, se_hist] = ao_design(G, Hd, Hr, Pt, Pr, sigma2, sigma2_r, max_iter, tol) [N, Nt] = size(G); K = size(Hd, 2); % 初始化解 theta = exp(1j*2*pi*rand(N,1)); % 随机初始相位 a = 1.5; % 公共放大增益初始值 W = zeros(Nt,K); se_hist = zeros(max_iter,1); for iter = 1:max_iter % 1. 固定Theta优化W Theta = a * diag(theta); Heq = Hd + Hr' * Theta * G; % K x Nt 等效信道 alpha_reg = sigma2 / Pt; % 正则化系数 W = Heq' / (Heq*Heq' + alpha_reg*eye(K)); % RZF波束成形 % 对W功率归一化到Pt W = W * sqrt(Pt / trace(W*W')); % 2. 固定W和a,用流形优化更新相位theta theta = optimize_phase_manopt(theta, a, G, Hd, Hr, W, sigma2, sigma2_r); % 3. 固定W和theta,更新a(取功率约束边界) Theta_unit = diag(theta); pr_ris = trace(Theta_unit * G * (W*W') * G' * Theta_unit'); a = min(a, sqrt(Pr / max(pr_ris, 1e-12))); % 计算当前频谱效率 se_hist(iter) = compute_sum_rate(theta, a, G, Hd, Hr, W, sigma2, sigma2_r); if iter > 1 && abs(se_hist(iter) - se_hist(iter-1)) < tol break; end end W_opt = W; theta_opt = theta; a_opt = a; end相位优化这一步我用的Manopt工具箱,它把单位模约束抽象成复圆流形,不需要自己去处理投影和回缩,写起来非常干净:
function theta_opt = optimize_phase_manopt(theta0, a, G, Hd, Hr, W, sigma2, sigma2_r) % 在复圆流形上优化RIS相移,最大化和速率 manifold = complexcirclefactory(length(theta0)); problem.M = manifold; problem.cost = @(t) -compute_sum_rate(t, a, G, Hd, Hr, W, sigma2, sigma2_r); problem.egrad = @(t) -compute_grad_phase(t, a, G, Hd, Hr, W, sigma2, sigma2_r); options.maxiter = 100; options.verbosity = 0; [theta_opt, ~] = trustregions(problem, theta0, options); end这里的核心是compute_sum_rate和梯度函数。梯度计算有两种方式:手推复梯度公式,或者用MATLAB的符号工具箱自动求导。前期项目推进建议直接用数值梯度验证手推公式,验证通过后再上梯度公式,可以省去大量调试时间。我没有把完整梯度代码贴出来,因为它对每个系统模型都不同,但是计算和速率这个函数一定要写对。
3.3 性能指标计算:频谱效率与CRB
频谱效率计算要严格对应信号模型。用户k的SINR表达式为:
SINR_k = |heq_k^H w_k|² / (Σ_{j≠k} |heq_k^H w_j|² + a²σr²||hr,k^H diag(e^{jφ})||² + σ²)
这里分母第二项就是主动RIS放大噪声,注意它是关于a和φ的函数,不是常数。
function se = compute_sum_rate(theta, a, G, Hd, Hr, W, sigma2, sigma2_r) [N, Nt] = size(G); K = size(Hd,2); Theta = a * diag(theta); Heq = Hd + Hr' * Theta * G; Hr_theta = Hr' * Theta; % K x N se = 0; for k = 1:K hk = Heq(:,k); % 等效信道第k列 signal = abs(hk' * W(:,k))^2; interf = 0; for j = 1:K if j ~= k interf = interf + abs(hk' * W(:,j))^2; end end ris_noise = a^2 * sigma2_r * norm(Hr_theta(k,:))^2; sinr = signal / (interf + ris_noise + sigma2); se = se + log2(1 + sinr); end endCRB的计算相对独立。我采用单目标角度估计模型,CRB是Fisher信息矩阵的逆。代码实现如下:
function crb = compute_crb(W, target_theta, Nt, beta, sigma2) % 目标角度估计CRB,W为发射波束成形矩阵 a_t = exp(1j*pi*(0:Nt-1)'*sin(target_theta)); % 发射导向矢量 a_dot = 1j*pi*cos(target_theta)*(0:Nt-1)'.*a_t; % 对角度求导 R_s = W*W'; num = a_dot' * R_s * a_dot; den = abs(a_dot' * R_s * a_t)^2 / (a_t' * R_s * a_t); J = 2*abs(beta)^2/sigma2 * real(num - den); crb = 1 / J; end这属于点目标角度CRB的简化标量形式,对单目标场景足够用。实际项目里如果目标是多目标或需要同时估计距离和角度,需要把Fisher矩阵扩展成多维再求逆。
4. 性能分析:收敛性与方案对比
4.1 算法收敛性与复杂度
交替优化的收敛性是这套算法的第一关验指标。我在仿真中记录每一轮迭代的和速率值,绘制了收敛曲线。实测下来,RZF波束成形加流形优化的组合,通常在20轮左右就能达到稳定值。初始相位随机选择的情况下,多次独立运行最终收敛点大致相同,这说明算法在给定参数下陷入局部最优的波动是可控的。
但是这里有个经验之谈:如果初始相位选得特别差,算法可能收敛到比较低的局部最优。实际项目里我采用多起点策略,随机初始化10组相位,各自跑完取和速率最高的一组。增加这一步骤之后,基线性能大约提升了5%到10%,代价是仿真时间变成10倍。对于追求较快迭代的调试阶段,可以先把初始化次数降到3组,正式出结果时再加大。
复杂度方面,每次迭代中RZF求解涉及K×K矩阵求逆,复杂度是O(K³),可以忽略;流形优化是主要开销,每次迭代需要计算目标函数与梯度,大约是O(N·Nt·K)的矩阵乘法量级。当N从32增加到128时,单轮运行时间大约增加3倍,整体仿真时间还能接受,不需要专门做并行优化。
4.2 主动RIS与被动RIS的对比
这个项目最核心的成果就是主动与被动RIS的对比。我把主动RIS的公共放大增益a固定为1时,就退化为被动RIS(只有相位控制)。同样仿真参数下,两者的性能差异非常明显。
在中等SNR区间,主动RIS辅助的ISAC系统相比被动RIS有大约3到5 bps/Hz的和速率增益。这个增益一方面来自主动RIS放大信号本身,另一方面来自它把级联信道增益抬高后,波束成形端的等效信道正交性更好,用户间干扰被有效压低。感知侧CRB的对比更夸张,主动RIS在同等发射功率下可以把目标角度CRB降低一个数量级左右,这对雷达感知任务来说是一个跨越性的提升。
当然,性能提升不是免费的。主动RIS每个单元都有功率放大器,硬件成本和功耗远高于被动RIS。从系统设计角度,如果感知精度要求不高、覆盖距离近,被动RIS依然是更经济的选择;只有在远距离探测或强干扰场景,主动RIS的性能优势才真正值回票价。
4.3 关键参数敏感性分析
我把RIS单元数N从16扫到64,观察性能变化。结果符合预期:单元数增加时,可控自由度增多,波束更窄指向性更强,和速率与感知CRB都同步改善。但提升逐渐饱和,从32到64的增益明显小于从16到32。这意味着在真实工程中盲目堆单元数不是明智策略,找到性能拐点才划算。
另一个值得关注的参数是基站发射功率Pt与RIS放大功率Pr的配比。我把两者固定一个、变化另一个,发现当RIS功率与基站功率比例失衡时,系统性能会进入瓶颈区。一个直观的结论是:主动RIS的放大能力应随着基站功率同步增加,否则RIS链路会先饱和,通信与感知的增益都被限制住。这个现象我建议大家在项目里画一张二维热力图,非常直观。
感知CRB约束的松弛度也对结果影响很大。CRB约束越紧,系统被迫把更多功率分配给感知波束,通信谱效下降越明显。我的做法是给CRB约束一个可调权重,在固定感知任务精度要求时,选择刚好满足约束的CRB阈值,避免过度消耗通信资源。
5. 调试实录与避坑经验
5.1 维度与代数操作坑
这个项目里的矩阵维度确实是重灾区。最典型的错误是把RIS相移向量theta直接当对角矩阵用,某一次算等效信道时写成了Hd + Hr' * theta * G,维度直接对不上。正确的写法是Hr' * diag(theta) * G。
还有一个我差点忽略的问题:计算RIS功率约束时,需要考虑的是G * W,而不是W * G。主动RIS的输入信号是从基站侧过来的,所以RIS输出功率和G*W的秩、功率分布直接相关。公式写反的话,功率约束会完全错误。
5.2 主动RIS噪声的建模影响
我最初为了简单,把主动RIS的放大噪声当作一个常数功率加到接收端,结果在低SNR区间的性能曲线完全不合理——RIS单元数越多、放大倍数越大,系统性能反而越差。排查之后才发现问题出在噪声建模上。主动RIS的噪声是随反射系数变化的,经过相位调控之后泄露到用户方向上的噪声功率会随着相位的不同而改变,不能简单等效成常数。
正确的做法是像我前面代码那样,把噪声项写成a²σr²||hr,k^H diag(e^{jφ})||²,放在SINR分母里参与优化。修改之后,在低SNR区间,系统性能改善显著,因为相位优化可以主动把放大噪声导向非用户方向,相当于对噪声进行了空域抑制。这一点其实是主动RIS从性能潜力向实际收益转化的重要机制。
5.3 信道随机性导致的结果波动
这算是所有无线通信仿真都会遇到的共性问题。单次信道实现下,优化结果的方差非常大,尤其当用户数多、RIS单元多时,不同信道快照下的和速率可能相差3到5 bps/Hz。直接拿单次结果说事,很容易得出错误结论。
项目中的标准做法是蒙特卡洛仿真。每次生成一组随机信道,跑完整的AO优化,记录和速率与CRB,最后对所有实验取平均。在我的配置下,至少跑200次信道实现,曲线的置信区间才能收得比较窄。如果你只是想看趋势,最少也要跑50次。
另外建议在代码里固定随机数种子,这样才能保证实验结果可复现。我之前因为忘记固定rng,改了一个参数后前后结果对不上,查了半天才发现是随机数流变了,时间成本特别高。把rng(2024)这种种子值放在脚本开头,是个好习惯。
5.4 初始化策略与收敛性优化
流形优化的性能对初始点敏感,前文提过多起点初始化。在实际仿真中我建议把初始化次数也做成参数,调试阶段设小,正式实验设大。另外一个实战技巧是,用被动RIS优化后的相位作为主动RIS的初始相位,这样主动RIS相位优化在后续迭代中更容易收敛到高质量解。
还有个细节是CRB约束的epsilon值不要设成0。感知CRB永远是一个正数,把约束设成0会导致优化问题不可行,迭代过程中会出现NaN。给它留一点裕量,比如设为目标工作点上CRB值的1.2倍,系统性能会更稳。
写在最后,这个项目的MATLAB实现整体不算难,但细节密集。最花时间的地方不是优化算法本身,而是把信号模型、噪声项、功率约束和维度匹配这些容易出错的地方逐一理清。如果你也在跑类似的RIS-ISAC仿真,建议先搭一个极简的被动RIS+MRT的基线版本跑通框架,再加入主动RIS、流形优化、CRB约束这些模块,一步步往上加。模块多了之后排查问题会很痛苦,有一个可以对比的基线能省下大量时间。希望这些经验能帮你在MATLAB里少踩几个坑。
本文还有配套的精品资源,点击获取