ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

OTFS-NOMA双域资源分配联合优化:从原理到复现实践

OTFS-NOMA双域资源分配联合优化:从原理到复现实践 简介面向通信工程研究人员、研究生及无线通信系统优化工程师这是一份基于OTFS-NOMA的双域资源分配优化论文复现资源聚焦高速用户(HSU)与低速用户(LSU)共存场景下的系统总速率最大化问题。资源以单个PDF文件共1个文件328KB呈现不仅梳理了论文的数学模型还提供了可运行的Python代码和详细解释核心包括信号转换、信道建模、接收信号处理与SINR推导。算法层面采用交替优化框架子载波分配用Jonker-Volgenant算法求解功率分配用注水算法迭代直至收敛。资源特别适合需要评估OTFS-NOMA相对传统OFDMA性能优势的研究者代码采用模块化设计通过修改M、N、用户数等参数即可深入探索系统特性。目前已有187人学习兼具理论推导、代码实现与仿真验证价值是理解双域OTFS-NOMA资源分配机制的一份实用参考资料。 做无线通信算法复现有一段时间了这次花了两周时间把一篇OTFS-NOMA双域资源分配优化的论文完整跑通又把代码整理成了可以直接改参数验证的工程。先说结论OTFS正交时频空间调制在处理高多普勒频移上比OFDM稳健得多NOMA非正交多址接入又能明显提升频谱效率两者叠加之后资源分配不再是在单一维度上做文章而是要在时延-多普勒域格点和功率域之间做联合优化。复杂度确实上来了但换来的是高速与低速用户共存场景下系统总速率的实打实提升。这篇文章就是完整的复现笔记包含系统建模思路、优化问题推导、代码结构讲解和踩坑记录适合正在啃相关论文、准备做仿真验证的研究生以及初入通信物理层或资源调度方向的工程师参考。1. 项目背景与为什么选OTFS-NOMA组合1.1 高速移动场景下OFDM的瓶颈与OTFS的切入点大家熟悉的OFDM把数据调制在时频域的子载波上这种设计在低速场景下很成熟但一旦用户跑起来比如高铁车速300 km/h或者是车联网场景里的高移动性车端多普勒频移就会显著破坏子载波之间的正交性。子载波间隔一旦被多普勒扩展挤压ICI子载波间干扰就会让解调性能严重下降。单纯增大子载波间隔能缓解这个问题但会浪费频谱。OTFS的做法不一样它把信息符号直接映射到时延-多普勒域再通过二维辛傅里叶变换ISFFT/SFFT转换到时频域发射。时延-多普勒域信道的核心特点是稀疏且随时间缓慢变化每条路径的能量集中在一个时延格点和一个多普勒格点上所以信道估计和均衡反而更直观。简单类比OFDM像在波动的水面上写字浪一打字就花OTFS像在固定的坐标纸上写字水面的波动被整体建模成坐标偏移反而能逆回去修正。这就是它在高多普勒场景下更稳的原因。1.2 NOMA在资源分配里扮演的角色NOMA的核心是让多个用户共享同一份时频资源靠功率域或码域的差异来区分。功率域NOMA最直接基站把两个用户的信号做功率叠加后发射接收端用SIC串行干扰消除逐级解码。信道好的用户先解出信道差的用户的信号并从接收信号里减掉再解自己的信号信道差的用户直接把对方信号当干扰。在高速与低速用户共存的场景里接入NOMA的价值很明确高速用户占用的多普勒资源很宽泛低速用户则集中在低多普勒区域如果沿用正交多址两者必须各占一块资源相互隔离而NOMA允许它们叠加在同一个时延-多普勒格点块上用功率来区分频谱利用率一下就上去了。但要拿到这个增益功率怎么配、资源格点怎么指派就是我们需要优化的核心问题。1.3 双域资源分配到底指哪两个域很多第一次接触双域的读者会困惑。在这类工作的语境里双域通常指时延-多普勒域和功率域。时延-多普勒域这一层做的是资源格点块的指派决定哪个用户对使用哪些格点资源功率域这一层做的是NOMA叠加功率的分配决定同一块资源里两个用户各自分到多少功率。这两层不是独立关系。给高速用户分配了格点块就意味着该块内的多普勒扩展要由OTFS自身的结构来吸收而功率分多了又会影响SIC的解码顺序和弱用户的信干噪比。分开优化往往只能得到次优解所以论文里一般用交替迭代的方式把配对、功率分配和多普勒域资源比例放在一个整体框架里做联合优化目标就是系统总速率最大化。这也是我在复现时最花时间的地方。2. 系统建模与仿真参数设计2.1 OTFS帧结构与信道参数OTFS帧结构可以理解为在时延-多普勒域划分出一个 M × N 的二维网格。M对应时延维N对应多普勒维。发射端通过ISFFT把网格上的调制符号映射到时频域再经过海森堡变换形成时域信号接收端做逆过程。复现时最核心的信道模型仍然是在时延-多普勒域里用若干条路径的叠加来近似。仿真参数我参考了车联网和高速铁路最常见的配置载波频率5.9 GHz子载波间隔15 kHzOTFS子载波数M128OTFS符号数N32系统带宽1.92 MHz。最大多普勒频移可以这样算( f_d v \cdot f_c / c )车速300 km/h时约83.3 m/s算出来f_d约1638 Hz。把它除以子载波间隔15 kHz归一化多普勒指数大约0.109。这个值在OFDM里已经会对子载波正交性产生明显影响但在OTFS的时延-多普勒表示里不过是把能量从一个多普勒格点扩散到几个相邻格点非常容易追踪和均衡。2.2 用户分组与NOMA配对模型用户模型上我设置了8个用户4个高速、4个低速。高速用户速度在120~300 km/h之间低速用户在5~30 km/h之间。每个用户对由一个高速用户和一个低速用户组成共享一个时延-多普勒格点块通过功率域NOMA叠加。关于强弱用户的定义必须说清楚这里不是按移动速度分强弱而是按当前时隙的等效信道增益分。信道增益高的用户作为SIC强用户信道增益低的作为弱用户。高速用户在物理上移动快但在特定时刻或特定资源格点上信道增益不一定就比低速用户差。配对的目标是让同一格点块内的两个用户信道增益差异尽量大因为NOMA的功率域收益正是来自信道差异。具体参数上我给每个用户生成独立的时延-多普勒信道每条路径包含随机时延、多普勒偏移和复增益再根据速度对多普勒偏移赋值。仿真总功率归一化噪声功率按带宽计算噪声功率谱密度取-174 dBm/Hz。2.3 速率表达式与优化目标在功率域NOMA的理想SIC假设下一个格点块内两个用户的速率可以写成弱用户信道增益低R_v log2(1 P_v * |h_v|^2 / (P_u * |h_v|^2 sigma^2))强用户SIC后无干扰R_u log2(1 P_u * |h_u|^2 / sigma^2)这里 P_u 是强用户功率P_v 是弱用户功率满足 P_u P_v P_block。系统的总速率就是所有格点块内用户速率之和。优化目标是在总功率约束、每个格点块功率约束、用户最小速率约束下最大化这个总和。值得注意的一点是弱用户速率公式中分母里的 P_u * |h_v|^2 是来自强用户的NOMA叠加干扰。很多初学复现的朋友会漏掉这一项把它写成只有噪声的速率公式那结果会离谱地偏高。我在调试时就踩过一次后面在常见问题里会详细说。3. 优化问题求解从非凸到可解3.1 问题形态与拆解思路直接看这个优化问题里面有整数变量格点块指派给哪个用户对、连续变量各用户功率、块间功率比例目标函数是log2(1SINR)的求和约束带乘积耦合整体是非凸优化问题不可能用简单的凸优化工具一键求解。我复现时采取的是工程上常用的三层拆解第一层做用户配对第二层在给定配对下做块内NOMA功率寻优第三层做块间总功率分配。三层交替迭代到收敛。这么做的好处是每一层都有高效解法不会把复杂度拖到不可控。3.2 用户配对让信道差异说话用户配对的做法有两种思路。最简单的贪心法是把所有用户的等效信道增益排序最大的和最小的配成一对次大的和次小的配成一对依次类推。这样每一对里面的信道差异最大NOMA的功率分配收益也最大。更精细的做法是用匈牙利算法求解一个最大化配对总速率的指派问题但代价是需要先估计每个候选配对的速率矩阵计算量大一些。我在工程里先用排序配对跑通全流程再换上匈牙利算法对比。实验结果里匈牙利算法相对排序法有5%~8%的额外增益但在用户数量不大8个用户配对成4对的情况下这个差距完全可以用计算复杂度优势弥补。所以最终主代码保留了排序配对把匈牙利算法作为可选扩展放在注释里。3.3 块内NOMA功率分配一维搜索就够了给定一个配对和该格点块的总功率P_block块内NOMA功率分配其实只需要一个一维变量。因为两个用户功率之和固定强用户功率 P_u P_block - P_v所以只要搜索 P_v 在0到P_block之间的取值找出使两个用户速率之和最大化的分配即可。这里我用的是黄金分割搜索简单稳定不会像梯度下降一样卡在不好的初始点。关键代码结构如下function [Pu, Pv, R_total] noma_power_search(h_u, h_v, sigma2, P_block) % h_u: 强用户等效信道增益 |h|^2 % h_v: 弱用户等效信道增益 |h|^2 % sigma2: 噪声功率 % P_block: 当前格点块总功率 obj (Pv) noma_sum_rate(P_block - Pv, Pv, h_u, h_v, sigma2); [Pv_opt, R_max_neg] fminbnd((x) -obj(x), 0, P_block); Pv Pv_opt; Pu P_block - Pv_opt; R_total -R_max_neg; end function R noma_sum_rate(Pu, Pv, h_u, h_v, sigma2) R_v log2(1 Pv * h_v / (Pu * h_v sigma2)); % 弱用户强用户信号算干扰 R_u log2(1 Pu * h_u / sigma2); % 强用户SIC后无干扰 R R_u R_v; end这段代码里最容易被忽略的是fminbnd的负号问题MATLAB的fminbnd默认做极小化而我们要找的是极大值所以取负后求解。另外速率函数的分子分母都要严格对应NOMA解码顺序一旦强用户和弱用户信道的变量放错位置结果就会对不上论文。3.4 块间功率分配与整体迭代策略完成块内NOMA分配后还要把有限的系统总功率分配到各个格点块。这一步可以用注水算法也可以用拉格朗日乘子加二分搜索。注水算法的思想是等效信道增益高的格点块多分功率增益低的少分直到每个块满足功率噪声/增益相等的停机条件。我的主循环伪代码如下for iter 1:max_iter % 1) 更新配对前几次迭代可以每轮都做收敛后间隔做 pairs noma_pairing(channel_gains); % 2) 固定配对块内NOMA功率搜索 for b 1:num_blocks [Pu(b), Pv(b)] noma_power_search(h_u_b, h_v_b, sigma2, P_block_est(b)); end % 3) 块间总功率注水分配 P_block_new rb_water_filling(eff_gain_rb, P_total, sigma2); % 4) 收敛判断 R_total sum(R_pair_all); if abs(R_total - R_prev) / R_prev 1e-3 break; end end实际操作中如果块内搜索和块间注水都做得很激进容易出现振荡不收敛的情况。我的经验是块间功率更新时加一个松弛因子比如 P_block_new 0.7 * P_block_new 0.3 * P_block_old迭代稳定性会好很多。这个细节在论文里通常是看不到的但对复现的收敛速度非常关键。4. 代码实现与核心模块解读4.1 工程结构一个主脚本加四个模块整个复现工程我用MATLAB写的文件结构非常清晰main_otfs_noma.m % 主脚本参数设置、循环、画图 channel_dd_gen.m % OTFS时延-多普勒域信道生成 noma_pairing.m % 用户配对 noma_power_search.m % 块内NOMA功率优化 rb_water_filling.m % 块间总功率注水如果不用MATLAB用Python加NumPy/SciPy也能等价实现只需要把fminbnd换成scipy.optimize.minimize_scalar即可。我建议先跑通MATLAB版本因为论文附带的代码风格大多也是MATLAB对照比较不容易出错。4.2 OTFS信道生成代码与格点对齐要点信道生成是整个复现最底层、也最容易出错的地方。核心逻辑是对每条路径的时延和多普勒做量化取整映射到时延-多普勒格点上function h_dd channel_dd_gen(prm) % prm.M: 时延维子载波数 % prm.N: 多普勒维符号数 % prm.P: 路径数 % prm.tau: 各路径时延(s) % prm.nu: 各路径多普勒偏移(Hz) % prm.g: 各路径复增益 h_dd zeros(prm.M, prm.N); for p 1:prm.P l_p round(prm.tau(p) * prm.M * prm.delta_f); k_p round(prm.nu(p) * prm.N * prm.T_otfs); % 时延和多普勒维都有循环移位性质必须取模 l_idx mod(l_p, prm.M) 1; k_idx mod(k_p, prm.N) 1; h_dd(l_idx, k_idx) h_dd(l_idx, k_idx) prm.g(p); end end这里最关键的坑是取模方向。多普勒频移有正有负负频差在取模后要落到N维网格的后半段所以必须先乘N*T_otfs再取整最后mod N。如果漏了负数处理高速用户的多普勒成分会全部错位仿真总速率会明显偏低而且很难排查。4.3 主循环和收敛控制主脚本里还有一个必须收藏的经验不要在一开始就把信道模型做得很复杂。我先把信道简化为只有一条主路径验证整条优化链路能跑出符合直觉的结果才逐步增加路径数和多普勒扩散。这样一旦结果不对能立刻知道是信道生成的问题还是优化算法的问题。调试时我习惯先固定随机种子保证每次跑的结果可复现。随机种子不一致会导致不同轮次的信道差异太大比较算法优劣时非常痛苦。等所有模块调通后再放开随机种子做Monte-Carlo平均这样论文里的每个点都能拿到置信区间。4.4 结果验证为什么必须加OMA基线复现论文必须和基线对比不然数字没有意义。我的代码里加了两种基线一种是正交多址OMA每个用户独享一个格点块不做叠加另一种是NOMA但采用等功率分配不经过优化。优化算法跑出来的总速率要和这两个基线比才能说明双域优化确实带来了增益。在我的参数配置下OTFS-NOMA优化相对OMA基线大约有15%~30%的总速率提升相对NOMA等功率基线提升了8%左右。如果某组参数下收益为负首先要检查是不是信道配对逻辑出了问题其次检查弱用户的干扰项是否被错误省掉。5. 复现中的坑与参数调试实录5.1 常见问题速查表我把复现过程中遇到的高频问题整理成了表格方便大家排错。问题现象可能原因解决办法总速率随迭代次数振荡块间功率更新太激进加松弛因子取新旧值加权高速用户速率反而异常高多普勒格点取模方向错误检查mod k_p确认负频偏落在N维后半段NOMA结果不如OMA弱用户干扰项写漏弱用户分母必须包含强用户功率项配对后总速率变化很小配对与功率分配只做了一次未交替迭代增加循环次数前几轮每轮都更新配对收敛速度极慢初始功率分配离最优太远先用等功率初始化再进入注水迭代增加路径数后优化结果发散信道增益动态范围过大对信道增益做归一化处理5.2 信道随机性与Monte-Carlo仿真另一个容易被忽视的点是单次信道实现的结果波动很大。高速用户速度从120 km/h变到300 km/h多普勒覆盖范围完全不同同一套优化算法可能在某次信道实现下增益明显另一次却一般。只跑一次就下结论没有意义。我最终是用500次独立信道实现做平均每个点大概耗时十几分钟。如果想快速验证算法逻辑可以先用50次平均确定趋势正确后再放大到500次。5.3 一个关于参数初始化的实用经验最后分享一个调试小技巧在跑完整优化之前先把所有用户的功率初始化为等功率跑一次普通的NOMA速率计算打印每条链路的分项速率。这一步能快速暴露信道生成层的问题。我见过有同事直接把优化循环跑起来结果总速率低得离谱查了两天发现是信道生成函数里的mod取模拿错了维度。还有一种常见情况是fminbnd搜索区间设成[0, P_block]但NOMA在边界处可能出现弱用户功率为0这时速率公式有定义但没意义因为退化成单用户传输。这个边界其实可以接受它代表优化算法自动选择了不启用NOMA叠加。我在输出结果时会把这种边界情况单独标记出来方便分析在哪些信道条件下NOMA确实无增益。代码工程整理完后我又把配对算法、功率搜索、注水分配三部分独立做了单元测试输入一组固定信道对比手算的简单case确认数值一致后才开始跑大规模仿真。这种习惯帮我省掉了后面大量的返工时间。复制这套代码时建议也按这个顺序来先信道、再配对、再功率、最后联调每一步都有明确的中间结果可以核对。本文还有配套的精品资源点击获取
返回列表