尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

主动RIS辅助ISAC波束成形:建模、优化与MATLAB实现

主动RIS辅助ISAC波束成形:建模、优化与MATLAB实现 简介本资源是一套面向电子信息工程、通信与信号处理方向本科生及初阶研究者的MATLAB实践代码聚焦主动可重构智能表面RIS辅助的通感一体化ISAC系统波束成形设计与性能评估。代码覆盖信道建模、联合波束赋形优化、通信/雷达SINR计算、波束方向图绘制及多参数性能扫描等核心环节适用于课程设计、毕设课题中对新型RIS-ISAC架构的算法验证与仿真分析。压缩包含68个文件49个.m主程序脚本、3个.mat案例数据、11个.zbak备份文件及2个.asv临时文件总大小2.44MB脚本采用参数化结构设计关键模块如calW.m波束权重求解、plotbeampattern.m波束图可视化、Main_MM.m主仿真流程均配有详尽中文注释辅以README.md说明与performance_figure4.fig结果示例便于快速理解框架逻辑并开展定制化修改。 做ISAC波束成形仿真的人应该都有这种感觉单通信或单雷达的波束成形还没彻底吃透论文里又冒出个RIS。如果只是被动RIS还好反射系数的模值被限制在1以内用SDR或者MM算法硬解就行可一旦换成主动RIS每个反射单元都具备放大能力问题就从“调相位”变成了“设计一个有源放大矩阵”约束、噪声模型、优化目标全变了。我最近正好在跑主动RIS辅助ISAC的波束成形代码把这个方向从模型推导到仿真实现完整走了一遍踩了不少坑也没有一篇现成的资料把里面的细节讲透。这篇文章把整套方案拆开说清楚从系统模型、优化问题、交替求解到MATLAB关键代码和结果分析适合正在做RIS辅助ISAC方向研究、或者想快速搭出一版可用仿真框架的通信专业研究生和工程师参考。文中的代码基于CVX实现核心思路不依赖特定工具箱版本稍微改改就能迁移到自己的项目里。1. 为什么主动RIS是ISAC的“隐藏增益”1.1 ISAC系统里波束成形为什么这么难做通感一体化ISAC的核心诉求是在同一套硬件和频谱资源上同时完成通信与感知。基站既要把数据流发给用户又要把电磁波打向目标并接收回波这两个任务对波束方向的要求往往不一致。通信用户可能在某个角度感知目标可能在另一个角度发射功率又必须在这两个方向之间分配。更麻烦的是感知链路的双程路径损耗远大于通信链路的单程损耗回波信号到达基站时通常已经很微弱如果发射波束没有对准目标检测性能会迅速劣化。这本身就是个非凸的折中优化问题。通信和感知互抢功率和空间自由度单纯的波束成形设计已经很讲究。当RIS加入之后自由度变多但同时变量之间高度耦合优化难度直接上一个台阶。1.2 被动RIS的天花板双路径损耗问题RIS的本质是用大量低成本反射单元重新配置无线传播环境让信号通过反射路径到达原本覆盖不到或信号很弱的位置。它的优势在ISAC场景里是明显的可以额外构造一条通往感知目标的强反射链路也可以把泄漏到无用方向的能量重新导向用户。但被动RIS有个绕不开的物理限制反射系数的模值不大于1。反射单元只能调相位不能提供真正的功率增益。基站到RIS再到目标这条链路经历的是双路径损耗。如果基站到RIS的距离是50米RIS到目标的距离也是50米自由空间损耗大约相当于100米直射路径的两倍以上再加上反射面的孔径效率损失最终到达目标的功率可能比直射链路损失20到30dB。相位调得再好也只是把本来要被散射掉的能量聚拢起来绝对增益被路径损耗死死摁住。这就是被动RIS在ISAC里比较尴尬的地方。通信用户离得近还好说感知目标往往在较远距离双路径损耗叠加之后RIS的辅助效果会明显缩水。单纯增加反射单元数量能部分补偿但单元数量也受成本和尺寸约束。1.3 主动RIS每个反射单元都是一个有源放大器主动RIS在每个反射单元上集成反射型放大器反射系数可以写成β_n e^{jθ_n}其中 β_n 不再限制在 [0,1]而是可以大于1通常在 [β_min, β_max] 范围内可调β_max往往取2~5甚至更高。这意味着主动RIS不仅能调相位还能真正放大信号直接补偿双路径损耗。对于感知目标这种远距离场景主动RIS等于在物理层引入了一个分布式放大阵列把波束增益和功率增益同时握在手里这是被动RIS做不到的。代价也很明确——放大器会引入额外的热噪声。每增加一倍的放大倍数信号和噪声同时被放大如果RIS的等效噪声系数足够低放大带来的信噪比收益是正的但如果放大倍数过高噪声也随之水涨船高最终可能吞噬增益。主动RIS的波束成形设计本质上就是在“信号放大收益”和“噪声放大代价”之间找平衡点。在ISAC系统里这个折中尤其微妙。通信链路的噪声底相对固定感知链路的回波还要经历一次路径损耗主动RIS放大的是发射信号但回波链路中还叠加了感知目标的雷达截面积波动。因此主动RIS的放大增益分配既要照顾用户SINR又要保证感知SNR问题从单一链路优化变成多链路联合资源分配。1.4 这套代码解决的具体问题我这次实现的仿真代码解决的场景如下基站配备多天线通过主动RIS辅助同时向一个单天线通信用户发送数据并对一个远场目标进行感知。目标是设计基站的发射波束成形向量和主动RIS的反射/放大系数矩阵在满足感知SNR约束和发射功率约束的前提下最大化通信用户的可达速率。代码框架基于交替优化AO把联合优化问题拆成两个子问题分别用半定松弛SDR求解然后迭代直到收敛。所有关键部分都给了可以直接运行的MATLAB片段参数、信道生成、噪声设置和性能评估都做了标注。下面从系统模型开始逐步展开。2. 系统模型与信号链路从基站到感知目标的每一跳2.1 发射信号与基站模型考虑一个单小区场景。基站配备N_t根发射天线部署在固定位置。通信用户是单天线设备感知目标是点目标。同时存在一个配置了N个反射单元的主动RIS部署在基站和用户/目标之间的某个位置帮助下行通信链路和感知回波链路。基站发射的基带信号是x w s其中s ∈ ℂ表示功率归一化的数据符号w ∈ ℂ^{N_t×1}是发射波束成形向量。基站总发射功率约束为‖w‖² ≤ P_t。在ISAC系统中波束成形向量既承担通信方向调制的职责又负责把能量聚焦到感知目标方向。不同之处在于发射信号本身是通信数据而感知功能通过回波分析来实现。对感知来说不要求知道s的具体值只关心回波的信噪比和相关参数估计精度。2.2 信道模型信道建模采用常见的窄带平坦衰落模型。基站到用户的直接信道记为 h_d ∈ ℂ^{N_t×1}。基站到RIS的链路用信道矩阵G_1 ∈ ℂ^{N×N_t} 表示。基站到RIS之间通常假设为LoS或莱斯信道因为RIS一般部署在能够视距覆盖基站的位置。RIS到用户的链路记为 h_r ∈ ℂ^{N×1}。RIS到感知目标的链路记为 g_t ∈ ℂ^N这里假设目标在RIS的远场从RIS到目标用导向矢量描述。目标到基站的回波信道和基站到目标的直射回波路径也做相应建模。对于莱斯信道基站到RIS的信道矩阵可以写成G_1 √(κ/(1κ)) G_LoS √(1/(1κ)) G_NLoS其中κ是莱斯因子。如果场景是强LoSκ可以取较大值比如5或者10dB。具体生成时候可以用MATLAB的randn函数生成高斯矩阵LoS分量用导向矢量外积构造。这个细节看起来不起眼但对仿真结果影响很大——如果κ设太小整个信道呈现瑞利衰落RIS的相位调整收益会被信道随机性掩盖曲线看起来会非常平。2.3 主动RIS的反射与放大模型主动RIS的第n个反射单元对入射信号的响应可以表示为φ_n β_n e^{jθ_n}其中β_n是反射振幅θ_n是相移。与被动RIS不同β_n的取值范围是[β_min, β_max]β_min可以取0.1β_max取3或5。所有单元的反射系数组成对角矩阵Φ diag(φ_1, φ_2, ..., φ_N)主动RIS在放大信号的同时会引入放大噪声v_r ∈ ℂ^N其每个元素服从零均值循环对称复高斯分布方差为σ_r²。这个噪声是主动RIS区别于被动RIS的本质特征。在仿真中这个噪声的功率设置必须和电路参数匹配。如果用等效噪声温度来算σ_r² k T_e B F其中k是玻尔兹曼常数T_e是等效噪声温度B是带宽F是噪声系数。很多初学者直接把σ_r²设成和接收机噪声一样大结果主动RIS的增益被噪声完全抵消曲线必然难看。考虑到代码的可复现性我采用归一化噪声功率设置令RIS放大噪声方差相对于通信接收噪声方差为一个固定比例比如σ_r² 0.01σ_c²。这个假设在多数研究论文里也常用方便对比不同放大倍数下的性能趋势。2.4 通信用户的接收信号信号从基站发出后经过两条路径到达通信用户直射链路和RIS反射链路。用户的接收信号可以写成y_c (h_d^H h_r^H Φ G_1) w s n_c其中n_c是用户接收机噪声服从零均值循环对称复高斯分布方差为σ_c²。等效信道可以合并写作h_eff^H h_d^H h_r^H Φ G_1通信用户的接收SINR表达式γ_c |h_eff^H w|² / σ_c²这里注意信号经过主动RIS放大后到达用户的信号功率是|h_r^H Φ G_1 w|²与被动RIS的区别在于Φ中包含了β_n 1的分量所以这部分功率可能超出直射链路好几个数量级。RIS的放大噪声也会通过h_r链路到达用户所以严格说主动RIS引入的放大噪声会在用户端产生额外干扰项。这部分干扰功率是σ_r²‖h_r^H Φ‖²。在建模时如果忽略它仿真结果会系统性偏乐观尤其是在β_max取值较大的情况下误差可能达到数个dB。我在下面的优化问题里会把它显式写进SINR表达式中。2.5 感知回波模型基站在发射通信信号的同时部分能量会经RIS反射照射到感知目标上。目标反射后回波沿着两条路径返回基站一条是目标到RIS再到基站的反射链路另一条是目标直接到基站的链路。为了简化不考虑多径和高阶反射。接收到的回波信号可以建模为y_s α (g_t^H Φ G_1 w) s n_s其中α是包含雷达截面积、双程路径损耗和传播相位的复合系数n_s是基站接收端的感知处理噪声方差为σ_s²。感知SNR定义为γ_s |α|² |g_t^H Φ G_1 w|² / σ_s²这个表达式的关键信息是感知SNR由发射波束成形和RIS系数共同决定。RIS的放大系数β_n直接作用于g_t^H Φ G_1 w这一项相当于对感知链路的发射功率进行了额外的空间聚焦。这也是主动RIS相对被动RIS在感知性能上最突出的增益来源。2.6 总功率约束中的细节主动RIS场景下总功率约束不能只写‖w‖² ≤ P_t。因为RIS放大之后反射信号的功率‖Φ G_1 w‖²同样被辐射出去这部分功率由RIS的有源放大器提供但它是整个系统辐射功率的一部分。在实际系统中总辐射功率约束需要写成‖w‖² ‖Φ G_1 w‖² ≤ P_max也就是说基站的发射功率和RIS的放大功率加起来不能超过系统总功率预算。如果忽略RIS放大功率的约束优化器会把β_n推向最大值造成结果失真。这个问题在代码实现里是用CVX求解时的约束表达问题后面第5章会专门讲怎么处理。3. 数学建模通信速率、感知SNR与联合优化问题3.1 通信可达速率与SINR表达式考虑主动RIS放大噪声的影响后通信用户的有效SINR为γ_c |h_eff^H w|² / (σ_c² σ_r² ‖h_r^H Φ‖²)可达速率为R_c log₂(1 γ_c)分母中的 σ_r² ‖h_r^H Φ‖² 是RIS放大噪声通过h_r链路泄漏到用户端的功率。这个项只和Φ有关和w无关在处理w子问题时可以当作常数。从公式能直接看出一个有意思的权衡增大β_n可以抬升分子中的RIS反射链路功率但同时分母里噪声泄漏也在增加。分子增加的主导项是β_n的平方和交叉相位项而分母增加是β_n²的线性累加。因为分子还包含直射链路h_d的交叉项所以β_n并非越大越好。这个现象在仿真曲线中会体现为“性能随最大放大倍数先升后降”非常直观。3.2 感知SNR与克拉美罗界的关联感知性能的度量方式有很多种。这里用感知SNR作为最低性能门限更严格的还可以用克拉美罗界CRB来约束角度估计误差。SNR和CRB之间是单调递减关系SNR越高参数估计的CRB越小。在仿真代码里我先用SNR约束指标直观、容易计算。如果你的项目需要输出角度估计的性能可以在拿到最优w和Φ之后再基于Swerling-0目标模型计算CRB不需要改动优化框架。感知SNR表达式重写一下γ_s |α|² |g_t^H Φ G_1 w|² / σ_s²α的模值由雷达方程给出|α|² (λ² σ_RCS) / ((4π)³ d_t² d_r²)其中λ是波长σ_RCS是目标雷达截面积d_t是发射路径总距离d_r是回波路径总距离。在仿真里如果不做绝对功率标定可以直接把|α|²合并为一个归一化增益因子比如设为0.01~0.1代表路径损耗后的回波衰减系数。3.3 优化问题P1的完整表述把通信速率最大化、感知SNR约束、功率约束放在一起得到如下优化问题P1最大化_{w, Φ} log₂(1 γ_c)受约束于γ_s ≥ Γ_s ‖w‖² ‖Φ G_1 w‖² ≤ P_max β_n ∈ [β_min, β_max]θ_n ∈ [0, 2π)对所有n其中Γ_s是感知SNR的最低门限。这个问题有两个非凸来源。第一w和Φ在信道表达式里以乘积形式耦合这不是一个双线性项那么简单——Φ G_1 w展开后是含N个变量乘积的大规模表达式。第二即使固定其中一个变量剩余子问题里的SINR目标函数也带有二次项的比值形式。直接丢给CVX显然不行。3.4 为什么不能直接用凸优化求解我最初想把整个问题直接塞进CVX结果当然是不收敛。非凸优化的实际问题在于CVX要求目标函数和约束都是凸的或可表示为凸形式而波束成形问题的目标是最大化一个带二次项的比值这本身是伪凸的两个变量耦合更是让这个问题的可行域呈现非线性流形结构梯度下降都容易陷入局部最优。标准做法是交替优化AO。它的思路很朴素固定一个变量优化另一个然后反过来不停交替直到目标函数变化量小于阈值。虽然不能保证全局最优但在实际仿真中AO配合SDR通常能得到稳定的局部最优解而且性能显著优于随机相位基准。这就是第4章要展开的算法框架。4. 交替优化方案波束成形与RIS系数怎么解4.1 交替优化框架总览整个AO算法流程如下初始化随机生成RIS反射系数矩阵Φ⁰满足β_n ∈ [β_min, β_max]迭代开始已知Φ求解优化子问题求解发射波束成形向量w已知w求解优化子问题求解RIS反射系数矩阵Φ交替迭代直到目标函数R_c的变化量小于预设阈值ε这个流程看起来很直白但每一步都需要仔细做数学变换。尤其要注意两个子问题的目标函数形式不一样一个关于w是二次约束二次规划的松弛问题另一个关于Φ是相似的但维度不同。4.2 固定Φ优化wSDR方法给定Φ时定义等效信道H_c h_d G_1^H Φ^H h_r ∈ ℂ^{N_t×1}注意这里的H_c已经合并了RIS链路和直射链路。令W w w^H则通信SINR的分子项可以写成|h_eff^H w|² w^H H_c H_c^H w tr(H_c H_c^H W)感知SNR的分子项类似|g_t^H Φ G_1 w|² w^H (G_1^H Φ^H g_t g_t^H Φ G_1) w tr(G_1^H Φ^H g_t g_t^H Φ G_1 W)定义通信信道矩阵 A_c H_c H_c^H感知信道矩阵 A_s G_1^H Φ^H g_t g_t^H Φ G_1。原问题在给定Φ下的子问题变为最大化 tr(A_c W) / (σ_c² σ_r²‖h_r^H Φ‖²)受约束于tr(A_s W) ≥ Γ_s σ_s² / |α|² γ_s_th tr(W) tr(G_1^H Φ^H Φ G_1 W) ≤ P_max W ⪰ 0rank(W) 1目标函数中的分母在子问题里是常数因此最大化比值等效于最大化tr(A_c W)。剩下的问题是非凸的唯一原因就是rank(W) 1约束。用SDR把秩1约束松弛掉得到一个标准的半定规划SDP可以直接用CVX求解。求解得到W后需要从W恢复w。如果W的秩恰好为1主特征向量就是解如果不为1用高斯随机化或主特征值近似。我在代码里采用主特征值近似因为大多数情况下SDR得到的W主特征值已经占据绝对主导误差可以忽略。4.3 固定w优化Φ向量化技巧与SDR固定w时问题复杂一些因为Φ以对角矩阵形式出现在三个位置通信链路、感知链路、RIS放大噪声。处理它的标准技巧是向量化。定义向量 v [φ_1, φ_2, ..., φ_N, 1]^T ∈ ℂ^{N1}其中最后一个元素固定为1。这样可以把h_r^H Φ G_1 w写成一个关于v的线性形式h_r^H Φ G_1 w v^H diag(h_r^H) G_1 w更准确地说令a_c diag(h_r^H) G_1 w ∈ ℂ^N则h_r^H Φ G_1 w a_c^T φ。把a_c扩充为N1维a_c_ext [a_c; h_d^H w]则有h_eff w v^H a_c_ext同理感知链路g_t^H Φ G_1 w可以写成v^H a_s_ext其中a_s_ext [diag(g_t^H) G_1 w; 0]。这个变换的关键在于原来关于Φ的二次型在v空间里变成了关于V v v^H的线性函数。定义V ⪰ 0rank(V) 1对角线约束V[N1, N1] 1。但还需要把β_n的取值范围约束加进去。β_n |φ_n|相位任意所以约束|φ_n| ≤ β_max可以写成V[n,n] ≤ β_max²而|φ_n| ≥ β_min可以写成V[n,n] ≥ β_min²。这个约束在松弛后依然是凸的。感知SNR约束变成v^H a_s_ext a_s_ext^H v ≥ γ_s_th σ_s²也就是tr(a_s_ext a_s_ext^H V) ≥ γ_s_th σ_s²。发射总功率约束中‖Φ G_1 w‖² 这一项可以展开为‖Φ G_1 w‖² φ^H diag(|G_1 w|²) φ这个二次型同样可以写成关于V的线性函数。定义P_ext为对应的(N1)×(N1)扩充矩阵则约束为‖w‖² tr(P_ext V) ≤ P_max目标函数方面需要同时考虑分子和分母。最大化log₂(1γ_c)等效于最大化γ_c。分子是v^H a_c_ext a_c_ext^H v分母是σ_c² σ_r² ‖h_r^H Φ‖²。其中‖h_r^H Φ‖² φ^H diag(|h_r|²) φ tr(Q V)Q是相应的扩充矩阵。所以这个子问题的目标函数是γ_c tr(A_ext V) / (σ_c² σ_r² tr(Q V))这是一个线性-线性分式规划可以用Charnes-Cooper变换处理引入辅助标量t令Ṽ t Vtr(Ṽ) / t 1之类的归一化把分式目标转成线性目标。具体做法是最大化 tr(A_ext Ṽ)受约束于σ_c² t σ_r² tr(Q Ṽ) 1 Ṽ t V 其他约束不变 t ≥ 0注意Ṽ是半正定矩阵。加上SDR松弛掉秩1约束后整个问题是一个凸SDP可以直接用CVX求解。4.4 收敛性判断与复杂度AO的收敛判据通常用相邻两轮目标函数差值的相对变化来判定|R_c^{(k1)} - R_c^{(k)}| / |R_c^{(k)}| ≤ ε其中ε取10⁻³或10⁻⁴。因为每轮AO都在提升通信速率这个序列单调不降且有上限受功率约束所以收敛性有保证。实际代码里我设置最大迭代次数为20通常5~10轮就收敛了。复杂度方面每次迭代需要求解两个SDP。w子问题规模是N_t×N_tΦ子问题规模是(N1)×(N1)。当N_t和N都不大比如4和32时单次迭代在CVX中耗时小于1秒。如果RIS单元数增加到512或者1024SDP规模变大求解时间可能涨到几十秒每轮这时就需要考虑改用MM算法或黎曼流形优化来加速。4.5 关于算法选择的补充SDR是入门最快的方法但不是唯一方案。如果你追求更快的求解速度或者目标函数需要更精细的调整可以考虑MMMajorization-Minimization方法、加权最小均方误差WMMSE方法和流形优化。以我个人的经验在N不超过128时SDR加了CVX已经完全够用但如果你要把代码扩展到更大规模WMMSE的收敛速度和稳定性通常更好。文中主推SDR因为它直观且代码量少适合做基线研究。5. MATLAB关键代码实现拆开看懂才能改得动5.1 参数配置与信道生成先说参数设置。表里列一下我用的一组推荐值这套参数能跑出清晰并且有区分度的曲线。参数符号取值说明基站天线数Nt4常见多天线配置RIS单元数N32足够体现波束成形增益用户天线数11单天线用户最大发射功率P_max30 dBm总辐射功率预算通信噪声方差σ_c²1e-9归一化后约-60dBmRIS放大噪声方差σ_r²0.01σ_c²有源器件噪声RIS最小放大倍数β_min0.1可调范围下限RIS最大放大倍数β_max3核心对比参数感知SNR门限Γ_s10 dB感知性能底线回波衰减系数α²0.1双程路径截面积归一化信道生成代码如下。注意莱斯因子和距离衰减的处理方式这是代码能真实反映系统特性的基础。% 系统参数 Nt 4; % 基站天线数 N 32; % RIS单元数 Pmax_dbm 30; Pmax 10^(Pmax_dbm/10) * 1e-3; % 转换为瓦特 sigma2_c 1e-9; sigma2_r 0.01 * sigma2_c; sigma2_s 1e-9; Beta_max 3; Beta_min 0.1; Gamma_s_lin 10^(10/10); % 感知SNR门限 alpha2 0.1; % 距离与路径损耗 d_bs_user 80; % 基站到用户 d_bs_ris 50; % 基站到RIS d_ris_user 40; % RIS到用户 d_ris_target 60; % RIS到目标感知场景更远 path_loss_bs_user (d_bs_user / 10)^(-2.2); path_loss_bs_ris (d_bs_ris / 10)^(-2.0); path_loss_ris_user (d_ris_user / 10)^(-2.2); path_loss_ris_target (d_ris_target / 10)^(-2.0); % 信道生成 kappa 10^(5/10); % 莱斯因子 5dB G1_los exp(1j * 2 * pi * rand(N, Nt)); % LoS分量 G1_nlos (randn(N, Nt) 1j * randn(N, Nt)) / sqrt(2); G1 sqrt(path_loss_bs_ris) * (sqrt(kappa/(1kappa)) * G1_los sqrt(1/(1kappa)) * G1_nlos); h_d_nlos (randn(Nt, 1) 1j * randn(Nt, 1)) / sqrt(2); h_d sqrt(path_loss_bs_user) * h_d_nlos; h_r_los exp(1j * 2 * pi * rand(N, 1)); h_r_nlos (randn(N, 1) 1j * randn(N, 1)) / sqrt(2); h_r sqrt(path_loss_ris_user) * (sqrt(kappa/(1kappa)) * h_r_los sqrt(1/(1kappa)) * h_r_nlos); g_t sqrt(path_loss_ris_target) * ... (sqrt(kappa/(1kappa)) * exp(1j * 2 * pi * rand(N, 1)) ... sqrt(1/(1kappa)) * (randn(N, 1) 1j * randn(N, 1)) / sqrt(2));这段代码里几个容易被忽略的地方LoS分量用随机相位构成导向矢量反映的是不同路径的相位差异NLoS分量做了功率归一化保证单位方差路径损耗系数在生成前就乘进去。这样得到的信道矩阵在功率上自然带有距离的物理含义优化结果也更贴近实际。完全不做路径损耗的RIS仿真单元数再大也都是空中楼阁。5.2 主动RIS反射系数初始化初始化的方式对最终结果影响不小。最简单的是全1初始化也就是所有单元反射系数都设为1。我实测下来全1初始化会让AO陷入较差的局部最优尤其是当信道包含深衰落时优化器容易卡住。更稳妥的做法是用随机相位初始化模值固定为β_max/2让初始的信道已经有一定程度的随机相干增益。% 随机相位中等幅度初始化 theta_init 2 * pi * rand(N, 1); phi_init (Beta_min (Beta_max - Beta_min) / 2) * exp(1j * theta_init); Phi diag(phi_init);注意初始化时不需要满足感知SNR约束AO迭代会逐步把γ_s拉向门限。如果初始值离门限太远前几轮迭代会先调整RIS来满足感知约束通信速率可能在迭代初期下降然后才回升。这是正常现象不要误以为代码不收敛。5.3 子问题1固定Φ优化w的CVX实现把4.2节的数学推导翻译成代码。关键是构造A_c和A_s矩阵以及把总功率约束写全。function w_opt optimize_w_w_fixed_Phi(Phi, G1, h_d, h_r, g_t, sigma2_c, sigma2_r, sigma2_s, alpha2, Gamma_s_lin, Pmax) Nt length(h_d); N length(h_r); % 等效信道 h_c h_d G1 * Phi * h_r; A_c h_c * h_c; % 感知链路 g_vec g_t * Phi * G1; A_s g_vec * g_vec; % RIS放大噪声泄漏到用户 noise_leak sigma2_r * norm(Phi * h_r)^2; noise_total sigma2_c noise_leak; % SDR求解 cvx_begin sdp quiet variable W(Nt, Nt) hermitian maximize( real(trace(A_c * W)) / noise_total ) subject to real(trace(A_s * W)) Gamma_s_lin * sigma2_s / alpha2; real(trace(W) trace(Phi * G1 * W * G1 * Phi)) Pmax; W hermitian_semidefinite(Nt); cvx_end % 用主特征向量恢复w或高斯随机化此处用主特征分解 [V, D] eig(W); [~, idx] max(diag(D)); w_opt sqrt(max(real(D(idx, idx)), 0)) * V(:, idx); end几个容易写错的地方第一CVX中trace(W)是线性函数但trace(Phi * G1 * W * G1 * Phi)中Phi * G1是常数矩阵W是变量这个表达式在CVX中仍然是线性的没问题。但如果你不小心把Phi写成变量这段代码就直接报错。第二最大化tr(A_c W)除以常数noise_total可以直接把噪声项放在分母也可以把1/noise_total乘到A_c里我习惯后者代码速度略快。第三主特征向量恢复w时为了保证功率约束需要重新归一化w_opt w_opt / norm(w_opt) * sqrt(P_allocated)。如果不归一化得到的w可能超出Pmax约束。我修正一下这个恢复逻辑% 归一化保证总功率约束 w_opt V(:, idx) * sqrt(max(real(D(idx, idx)), 1e-12)); total_power norm(w_opt)^2 norm(Phi * G1 * w_opt)^2; if total_power Pmax w_opt w_opt / sqrt(total_power / Pmax); end5.4 子问题2固定w优化Phi的CVX实现这个子问题复杂一些按4.3节的推导来做。代码里用向量化的方式来构造所有矩阵。function Phi optimize_Phi_fixed_w(w, Phi, G1, h_d, h_r, g_t, sigma2_c, sigma2_r, sigma2_s, alpha2, Gamma_s_lin, Pmax, Beta_min, Beta_max) N length(h_r); % 通信链路向量化 a_c diag(h_r) * G1 * w; a_c_ext [a_c; h_d * w]; A_ext a_c_ext * a_c_ext; % 感知链路向量化 a_s diag(g_t) * G1 * w; a_s_ext [a_s; 0]; As_ext a_s_ext * a_s_ext; % RIS放大噪声对应矩阵 Q ||h_r^H Phi||^2 phi^H diag(|h_r|^2) phi Q diag(abs(h_r).^2); % 扩充到 N1 维 Q_ext blkdiag(Q, 0); % 总功率约束中的 ||Phi G1 w||^2 矩阵 P_ris diag(abs(G1 * w).^2); P_ris_ext blkdiag(P_ris, 0); % CVX 求解 cvx_begin sdp quiet variable V(N1, N1) hermitian variable t nonnegative maximize( real(trace(A_ext * V)) ) subject to % Charnes-Cooper 变换分母归一化 sigma2_c * t sigma2_r * real(trace(Q_ext * V)) 1; % 感知SNR约束 real(trace(As_ext * V)) Gamma_s_lin * sigma2_s / alpha2 * t; % 总功率约束 t * norm(w)^2 real(trace(P_ris_ext * V)) Pmax * t; % 放大系数幅值边界 for n 1:N V(n, n) Beta_min^2 * t; V(n, n) Beta_max^2 * t; end V(N1, N1) t; V hermitian_semidefinite(N1); cvx_end % 由 V 恢复 v if t 1e-12 V_norm V / t; [V_eig, D_eig] eig(V_norm); [~, idx] max(diag(D_eig)); v sqrt(max(real(D_eig(idx, idx)), 0)) * V_eig(:, idx); % 归一化强制最后一个元素为1对应辅助变量 v v / v(end); phi_vec v(1:N); % 把幅值限制在合法区间 beta_vec abs(phi_vec); beta_vec min(beta_vec, Beta_max); beta_vec max(beta_vec, Beta_min); Phi diag(beta_vec .* exp(1j * angle(phi_vec))); else % 如果t太小的退化情况使用当前Phi Phi Phi; end end这个代码段有一个细节值得展开CVX中V(N1, N1) t这一约束对应v的最后一个元素固定为1因为V v v^H所以V(N1,N1) |1|² 1而在Charnes-Cooper变换中V t * v v^H因此V(N1,N1) t。这个约束是保证v的最后一个元素不为0的关键。如果漏掉这个约束优化器可能会利用v最后一位的缩放自由度来操纵目标函数解出来的Phi会有问题。另一个细节是幅值约束。β_n |φ_n| 对应V[n,n] |φ_n|²经过变换后是V[n,n] / t。所以约束写成V[n,n] Beta_min² * t和V[n,n] Beta_max² * t。很多版本的代码会把t漏乘导致约束过紧或过松。5.5 主循环与性能评估主循环就是交替调用两个子问题并在每轮结束后计算通信速率和感知SNR画收敛曲线。% 初始化 Phi init_Phi(N, Beta_min, Beta_max); max_iter 20; epsilon 1e-3; rate_history zeros(max_iter, 1); for iter 1:max_iter w optimize_w_w_fixed_Phi(Phi, G1, h_d, h_r, g_t, sigma2_c, sigma2_r, sigma2_s, alpha2, Gamma_s_lin, Pmax); Phi_new optimize_Phi_fixed_w(w, Phi, G1, h_d, h_r, g_t, sigma2_c, sigma2_r, sigma2_s, alpha2, Gamma_s_lin, Pmax, Beta_min, Beta_max); Phi Phi_new; % 计算当前性能 h_eff h_d G1 * Phi * h_r; sinr_num abs(h_eff * w)^2; sinr_den sigma2_c sigma2_r * norm(Phi * h_r)^2; rate_history(iter) log2(1 sinr_num / sinr_den); % 收敛判断 if iter 1 abs(rate_history(iter) - rate_history(iter-1)) / rate_history(iter-1) epsilon break; end end % 感知SNR输出 g_eff g_t * Phi * G1 * w; g_snr alpha2 * abs(g_eff)^2 / sigma2_s; fprintf(收敛迭代次数: %d\n, iter); fprintf(通信速率: %.4f bps/Hz\n, rate_history(iter)); fprintf(感知SNR: %.2f dB\n, 10*log10(g_snr));这里有一个实际调试中经常会遇到的问题感知SNR约束是≥Γ_s但AO求解后得到的感知SNR可能明显高于门限。这是因为优化器在满足约束的前提下还有多余功率全部分配去提升通信速率了。如果你想精确控制感知SNR等于门限需要把约束改成等式约束或者用拉格朗日乘子做功率分配但在仿真中不等式约束更符合实际系统设计——只要感知达标剩余功率就该用于通信。5.6 一个容易踩的坑CVX中的hermitian_semidefinite写法不同CVX版本的半定约束写法有差异老版本用W hermitian_semidefinite(Nt)新版本用W semidefinite(Nt)。如果你的CVX报Invalid constraint错误先检查这一行。此外对于复数矩阵semidefinite本身会要求矩阵为Hermitian所以不需要再额外写W W。我把两个子函数里的半定约束统一写成W semidefinite(Nt)这是现在的主流写法。后续代码示例我都按这个来。6. 仿真实验设计与结果解读6.1 基线方案没有对比就没有说服力做性能分析时至少要选两到三个基线方案对比才能说明主动RIS的价值。我常用下面这几组无RIS只有基站到用户的直射链路基站不做RIS辅助纯发射波束成形。被动RIS辅助RIS反射系数的模值上限为1即β_max 1退化为被动RIS。用同样的AO框架但约束改为β_n ≤ 1。随机相位RISΦ的对角元素相位随机模值固定为β_max。这组基线用来说明“优化”本身带来的增益而不是“有RIS就有增益”。对比时横坐标通常是发射功率P_max或RIS单元数N纵坐标是通信可达速率或感知SNR。我常用的横坐标是P_max从20 dBm到35 dBm步进1 dB每组做100次独立信道实现取平均。6.2 通信速率随发射功率的变化先看通信速率随发射功率的变化趋势。主动RIS在低功率区间优势最明显因为主动放大直接补偿了路径损耗等于是用分布式放大把发射功率“无损”地搬到了用户方向。随着P_max增大通信速率的提升会变缓原因是RIS放大噪声和接收噪声构成了底噪当信号功率足够大时速率受限于噪声底而不是功率预算这时候再增加P_max的边际收益在下降。对比被动RIS和无RIS被动RIS在低功率区间基本和无RIS持平甚至略差——因为反射链路的双路径损耗让信号经过RIS之后衰减过多直射链路主导RIS只是增加了一条不可控的反射路径。这也是被动RIS在近距离通信场景里经常“无效”的原因。6.3 感知SNR约束对通信速率的影响感知SNR门限Γ_s从0 dB变化到20 dB通信速率会随着门限升高而下降。这个趋势很好理解系统必须把越来越多的功率分给感知目标方向用户能获得的信号功率自然变少。但主动RIS和被动RIS在这个趋势里的下降斜率不一样。被动RIS的速率下降很快因为反射链路增益有限为了满足高感知SNR唯一的办法是在发射端增加感知方向的功率分配这直接抢占了通信功率。主动RIS则多了一个自由度——通过增大RIS放大系数在感知方向构造更强的等效辐射功率不需要牺牲太多基站发射功率。当Γ_s很高时主动RIS的通信速率优势会更加明显。这条规律在码率设计时有参考价值如果感知需求很高主动RIS几乎是必须的。6.4 RIS单元数的影响增大N可以从两个维度提升性能更精细的相位调节能力以及更高的阵列增益。被动RIS的速率随N增加近似线性增长对数域的线性增长因为N个单元的反射信号在目标方向相干叠加。主动RIS由于有放大能力增益更明显但受噪声限制增长速度会放缓。实践中N取32到64时曲线已经能看出明显趋势不需要为了图形好看硬上512单元。我在仿真里用32个单元就能把无RIS、被动RIS、主动RIS三者的差距拉开曲线已经足够有说服力。6.5 主动RIS放大噪声影响的量化我单独做了一组仿真固定P_max和N改变β_max从1到5看通信速率的变化。结果呈倒U形β_max太小时主动增益不足β_max太大时放大噪声把信噪比压垮最优值通常落在2到4之间具体位置取决于σ_r²的相对量级。很多论文喜欢把β_max拉到10甚至20来展示“主动RIS增益巨大”但实际上如果σ_r²不变β_max太大时速率会明显回落。这个倒U形曲线反而比“单调增长”更真实也更能说明主动RIS设计中噪声抑制的重要性。在写论文或者做汇报时把这条曲线放上去审稿人会觉得你对自己的系统有更深的理解。7. 踩坑记录与可复现性建议7.1 CVX安装与求解器选择CVX的安装本身不复杂但安装完之后的求解器选择是个坑。默认情况下CVX会尝试自动选择求解器但SDP问题用SeDuMi和SDPT3都能算速度差异很大。我的经验是SeDuMi在中小规模SDP上速度快SDPT3在高精度场景下更稳。如果你发现CVX求解SDP时经常报“Inaccurate/Solved with reduced precision”先换求解器再试不要急着改模型。在CVX开头加一句cvx_solver sdpt3就能切换。另外CVX的许可问题如果你是学生用免费版即可支持足够大的问题规模。个人项目里不用刻意追求Mosek除非你要跑大规模SDPMosek的速度确实快不少。7.2 主动RIS噪声方差设置错误导致结果失真我在初版代码里把σ_r²设成和σ_c²同一个量级结果主动RIS的速率还不如被动RIS一度怀疑算法错了。后来检查发现是RIS放大噪声功率设置不合理。主动RIS的放大器处理的是经过路径损耗衰减后的信号它放大的是已经非常微弱的信号噪声系数不可能和基站接收机一个水平否则放大没有意义。更合理的假设是σ_r² 0.01σ_c²甚至更低。如果你有实际硬件参数可以按噪声系数公式换算。但在仿真中σ_r²的量级直接影响最优β_max的位置建议做一组σ_r²扫描而不是拍脑袋定值。这个扫描在matlab里就是套一层for循环的事不复杂。7.3 SDR恢复秩1解时的功率归一化SDR求解得到的W*并不是严格秩1的。用主特征向量恢复出的w需要重新计算总功率。如果直接拿主特征向量当波束成形向量总功率可能超出约束也可能远低于P_max。我在第5章的代码里已经加了归一化逻辑这里再强调一次做完特征分解得到w后必须按约束中的总功率项重新归一化。否则后续计算的通信速率和感知SNR都是偏大的因为实际发射功率可能超过了系统预算。7.4 大N条件下矩阵条件数问题当N增大到128以上时diag(h_r) * G1 * w这类计算的数值特性会变差因为h_r和G1中的元素功率经过路径损耗归一化后量级差异可能很大。解决方法是所有的信道矩阵在生成时都做了功率归一化单位是相对瓦特不要让某些链路的增益比其他链路大超过40dB。如果你的信道模型里路径损耗跨度过大建议用dB域压缩或者分段设置路径损耗指数保证矩阵条件数在10⁸以内。否则CVX求解时可能出现精度问题表现为约束看似满足但物理量严重不合理。7.5 收敛曲线的解读和调试如果AO迭代过程中速率没有单调上升先检查是不是感知SNR约束在初始阶段不可行。感知SNR门限如果设得太高超过当前信道条件下的可达上限问题本身没有可行解AO会在迭代中不断震荡。我调试时会在主循环里打印每一轮的感知SNR值如果它始终低于门限说明门限过高要么降低门限要么增加RIS单元数或发射功率。正常情况下前5轮速率上升较快之后进入平台期。如果你看到速率在某个迭代点突然下降大概率是子问题之一没有精确求解CVX返回了“Inaccurate”状态。这时候可以检查CVX的status输出或者在cvx_begin后加上cvx_precision best提高求解精度。7.6 代码扩展思路如何加直达感知路径目前代码里感知链路只考虑了经RIS反射的路径。实际中基站和目标之间可能存在直射路径只需要在感知SNR表达式里增加一项h_s_direct^H w即可。优化结构不变只是A_s矩阵增加一个外积项。如果目标直接视距链路很强RIS的感知辅助增益会被稀释这时候主动RIS的对比优势会变小。这个扩展可以作为一个“悲观”场景对比也是论文里常见的补充实验。总结一下实际体会这套主动RIS辅助ISAC的波束成形代码最核心的收获不是CVX调用本身而是对“放大增益与噪声代价”这对矛盾的理解。被动RIS的优化目标是纯相位对齐而主动RIS必须同时考虑放大倍数与噪声泄漏之间的平衡这直接体现在系统模型、约束条件和最优解的性质上。跑通代码只是一步真正有用的经验是学会看当结果不合理时先怀疑模型里哪一项被忽略了再怀疑是算法不收敛。用我上面的参数设置和调试方法应该能比较顺利地复现出一套能支撑研究方向探索的仿真平台。最后再分享一个小技巧在做参数扫描时把信道实现固定住先跑一次确定性分析看看算法在单组信道下的行为是否合理然后再做蒙特卡洛平均。这样能避免在错误逻辑上浪费大量的仿真时间。本文还有配套的精品资源点击获取
返回列表