NOMA-OFDMA仿真详解:用户配对、功率分配与SIC实现
简介面向无线通信系统研究与教学场景MATLAB仿真资源包聚焦NOMA非正交多址接入与OFDMA正交频分多址的原理对比与融合分析适合通信专业学生、科研人员以及需要快速搭建多址接入仿真环境的开发者。压缩包共13个文件包含11个M脚本、1个MAT数据文件及1个ZIP子包M脚本覆盖数据生成、NOMA/OFDMA编解码、OFDM收发链路、Turbo编解码与误码率绘图等模块MAT文件保存了可直接读取的BER结果整体仅156KB轻量便于移植运行。目前已有381人学习下载。借助完整可运行的代码读者能直观比较两种多址技术在频谱效率与复杂度上的差异也可基于NOMA-OFDMA融合模块继续研究功率分配、用户配对和干扰管理等关键问题。运行主程序可快速生成系统误码率对比曲线便于逐段调试与结果复现无论用于演示NOMA在密集用户下的容量增益还是对比OFDMA在低实现复杂度上的优势这套仿真代码都提供了可量化的实验载体适合作为课程设计或论文验证的参考。1. NOMA-OFDMA-SIM.zip这个仿真包到底能帮你验证什么打开 NOMA-OFDMA-SIM.zip 之前先想清楚你是只想要一条比 OFDMA 高几个百分点的吞吐量曲线还是想把功率域 NOMA 与 OFDMA 的整套资源分配逻辑落到可复现的代码上。这个压缩包的命名里“SIM”基本可以推断是 Simulation 的缩写说明它不针对某块商用芯片而是面向多用户下行链路的仿真验证环境。它解决的问题是如何让多个用户在同一个 OFDMA 子信道上叠加发送、再用 SIC 区分解调以及用户配对和功率分配参数怎么影响频谱效率。适合正在做 5G-Advanced 候选技术预研的工程师也适合刚上手多址仿真的研究生。下文按我自己复盘这个题目的顺序从系统模型、跑通流程、算法细节到避坑一条条讲清楚。2. NOMA-OFDMA 仿真系统模型从 OFDMA 子信道到功率域叠加OFDMA 本身是正交的每个子信道独占用户小区内干扰为零。NOMA 打破了这种正交性允许两个用户在同一个子信道上做功率域叠加。为什么值得这么改OFDMA 对信道好的用户给高 MCS对信道差的用户只能给低 MCS公平性差。NOMA 把强用户和弱用户叠加在一处功率向弱用户倾斜强用户用 SIC 先解自己频谱效率能在多用户分集和公平性之间找到更好的折衷。落到仿真模型上就产生了三个绕不开的问题子信道怎么切用户怎么配对功率怎么分2.1 子信道划分与用户配对为什么建议 K2N系统带宽 B 分成 N 个子信道每个子信道带宽 Δf B/N。仿真里 N 一般取 8~16因为后面要跑几千次蒙特卡洛子信道太多计算量会失控。OFDMA 中一个子信道只服务一个用户NOMA-OFDMA 中一个子信道同时服务 U 个用户U 通常取 2因为 3 个以上用户的 SIC 复杂度会陡增干扰累积也更严重。这里可以列出一组让我少走弯路的默认参数参数含义典型值B系统带宽10 MHzN子信道数8Δf子信道带宽1.25 MHzK总用户数16U每子信道叠加用户数2用户数 K 与子信道数 N 的关系是配对的起点。如果 KN每个子信道只能分到一个用户没有配对自由度NOMA 变成无意义的“单用户自叠加”。所以至少要满足 K≥2N排序配对才有可操作空间。当 K16、N8 时正好每一对强用户和弱用户占一个子信道当 K2N比如 24 个用户、8 个子信道就需要先从信道增益里选出一批“适合配对”的候选不然会出现用户被重复分配的问题这个我在后面的避坑章节会专门展开。2.2 SIC 顺序先于代码两条速率公式写清 NOMA 的增益来源以两用户为例设子信道 n 上两个用户的等效信道增益分别是 h_s 和 h_w且 |h_s|² |h_w|²。基站把子信道总功率 P_sub 中的 a 比例分给弱用户剩下的 1-a 给强用户a 一般大于 0.5。接收端 SIC 的顺序是先解强用户。强用户信道条件好即使功率低也能扛住弱用户信号带来的同频干扰解出强用户后重构并减去它的信号再解弱用户此时弱用户不再受强用户干扰。这个顺序千万不要凭直觉写成“功率大的先解”。如果先解弱用户弱用户要面对强用户的高功率干扰基本解不出来强用户又会因为干扰没被消除而速率被压系统总速率会明显低于 OFDMA。用信噪比公式来看就非常直观SINR_s (1-a)·P_sub·|h_s|² / (a·P_sub·|h_s|² N0·Δf)SINR_w a·P_sub·|h_w|² / (N0·Δf)速率就是对每个用户作用 Δf·log2(1SINR)。注意强用户 SINR 的分母里必须有弱用户功率项这是 NOMA 与 OFDMA 的本质区别弱用户 SINR 的分母如果出现强用户干扰项说明 SIC 没有在接收端真正消除干扰。审查别人代码时这两条公式就是判断实现是否正确的试金石。2.3 信道生成参数路径损耗、阴影衰落与噪声归一化的复数信道路径信道建模可以分两层大尺度决定哪些用户是强用户、哪些是弱用户小尺度决定频率选择性衰落。如果只做吞吐量仿真其实不需要生成真实时域波形用等效功率增益就够了。我的习惯是先生成每个用户到基站的距离 d单位 km然后按类 3GPP UMa 的路损模型算路径损耗PL(dB) 128.1 37.6·log10(max(d, 0.01))阴影衰落取对数正态分布标准差 8dB。小尺度衰落用瑞利衰落每个子信道独立生成。关键在于把噪声功率折算进信道增益这样后面计算 SINR 时所有分母里的噪声项都可以简化为 1代码干净很多。对应函数可以这么写function h generateChannel(cfg, d) % d: 用户与基站距离单位 km % 返回每个用户在所有子信道上的等效信道增益已按噪声功率归一化 N0 10^((cfg.noisePsd cfg.noiseFigure)/10) * 1e-3; % W/Hz PL 128.1 37.6 * log10(max(d, 0.01)); % 路径损耗 dB shadow db2pow(cfg.shadowStd * randn(size(d))); % 对数正态阴影衰落 hLarge db2pow(-PL) .* shadow; % 大尺度功率增益 small (randn(length(d), cfg.numSubchannels) 1i*randn(length(d), cfg.numSubchannels)) / sqrt(2); h hLarge .* abs(small).^2 / (N0 * cfg.subchannelBw); % 等效归一化增益 end这段代码里有个很实用的技巧噪声功率是 N0·Δf所以信道增益统一除以它之后速率计算中的噪声项就变成 1。randn 生成的复数衰落幅度取模平方后平均功率为 1不会额外抬高或压低信道。cfg.noisePsd 是 -174dBm/Hzcfg.noiseFigure 是接收机噪声系数默认 7dB。如果只写 -174 而忘记加噪声系数最终 SNR 会虚高 7dB整条吞吐量曲线都会往上飘属于看起来漂亮的错误。还有两个细节值得养成习惯dBm 转瓦要用 10^((dBm-30)/10)不要用 0.001 直接乘距离 d 要限制最小值避免距离接近 0 时路损因子趋向负无穷。这两个小点看着不起眼后面会引出两个典型翻车现场。3. 跑通压缩包里的最小仿真流程入口脚本、参数表与输出的三张图拿到压缩包后不建议直接 F5。这类包的入口不一定是你想象中的 main.m也可能是 run_simulation.m 或 test_example.m。先花五分钟确认入口和依赖比对着报错信息猜函数强得多。3.1 没有 README 时的切入顺序依赖分析比直接 F5 可靠解压后先把文件列表过一遍。如果里面有 README先读没有就找 main 脚本。不需要把每个 .m 文件都打开那是把黑匣子当透明盒子的冲动最后通常会花一整晚看别人的变量命名。MATLAB 里可以用依赖分析命令一次性摸清结构[fileList, productList] matlab.codetools.requiredFilesAndProducts(main.m)run 之前先看 productList 里有没有授权受限的工具箱。如果压缩包是早期论文代码很可能依赖 Communications Toolbox 或 Signal Processing Toolbox而你的 MATLAB 只装了基础包。遇到这种情况不要急着删函数先看能不能用等价的内建函数替换。这类 NOMA-OFDMA 仿真包大多是准静态系统级仿真不是逐符号的链路级仿真。具体表现是主循环里没有 qammod、awgn 这类物理层波形函数而是直接对信道增益和功率做速率计算。这样一轮蒙特卡洛很快几千次信道实现只要几十秒。打开主脚本后如果发现全是 for 循环和 log2基本就能确认是这种类型。3.2 主入口与 cfg 参数表先把 8 个关键参数定下来参数集中在一个结构体里是这类工程最常见的组织方式。我会把初始化代码单独放成一个函数避免参数散落在不同脚本里改。一份可用的 cfg 初始化长这样% loadConfig.m % NOMA-OFDMA 下行链路仿真配置 cfg.numSubchannels 8; % 子信道数 N cfg.numUsers 16; % 用户数 K cfg.usersPerSubchannel 2; % 叠加用户数 U cfg.totalPower 43; % 基站总功率 dBm cfg.bandwidth 10e6; % 系统带宽 Hz cfg.subchannelBw cfg.bandwidth / cfg.numSubchannels; % 子信道带宽 cfg.noisePsd -174; % 噪声谱密度 dBm/Hz cfg.noiseFigure 7; % 接收机噪声系数 dB cfg.pathLossExp 3.76; % 路径损耗指数 cfg.shadowStd 8; % 阴影衰落标准差 dB cfg.numRealizations 5000; % 蒙特卡洛次数 cfg.alphaFTPA 0.4; % FTPA 功率分配因子 cfg.pairingMethod Sorted; % 用户配对方法这里把 numUsers 设成 16刚好是 numSubchannels 的两倍是跑通配对逻辑最简单的情况。totalPower 单位是 dBm后面转瓦时统一用 10^((cfg.totalPower-30)/10)。噪声功率谱密度同样要转瓦注意和噪声系数叠加。usersPerSubchannel 目前只支持 2这也是两用户 NOMA 的标准配置。先把这些参数固定再谈调算法参数没固定就频繁改配对策略很容易让问题混在一起。3.3 主循环与两用户收发函数一次蒙特卡洛实现怎么写主循环的骨架并不复杂关键是分层清晰。用户位置可以在蒙特卡洛循环外生成循环内只随机小尺度衰落这样能单独观察衰落随机性对系统的影响%% 主仿真循环 rng(2025); userDist 50 450 * rand(cfg.numUsers, 1); % 50~500 m sumRate zeros(cfg.numRealizations, 1); ueRate zeros(cfg.numRealizations, cfg.numUsers); for iter 1:cfg.numRealizations h generateChannel(cfg, userDist); % 等效信道增益KxN [pairs, hPairs] pairUsers(h, cfg.pairingMethod); % 子信道上的配对结果 [sumRate(iter), ueRate(iter,:)] processOneFrame(cfg, h, pairs, hPairs); end avgSE mean(sumRate) / (cfg.bandwidth/1e6); fprintf(Average SE %.2f bit/s/Hz\n, avgSE);主循环里 pairUsers 返回两个东西用户索引对和每个子信道上两个用户实际的信道增益。processOneFrame 负责做功率分配并计算本帧所有用户的速率这样当你想换配对策略或者换功率分配算法时不需要动主循环。rng(2025) 固定随机种子保证同一份代码在不同时间跑出的曲线一致这在调参和画论文图时非常关键。两用户收发函数是整套仿真的核心可以直接复用function [rateStrong, rateWeak] nomaTwoUserRate(hStrong, hWeak, Psub, alpha, cfg) % hStrong/hWeak: 强用户和弱用户的等效信道增益 % alpha: 弱用户获得功率比例 Pw alpha * Psub; % 弱用户功率 Ps (1 - alpha) * Psub; % 强用户功率 % SIC: 先解强用户弱用户信号作为干扰 sinrStrong (Ps * hStrong) / (Pw * hStrong 1); % SIC 后弱用户没有强用户干扰 sinrWeak (Pw * hWeak) / 1; rateStrong cfg.subchannelBw * log2(1 sinrStrong); rateWeak cfg.subchannelBw * log2(1 sinrWeak); end因为信道增益已经按噪声功率归一化所以分母里的噪声项是 1。Psub 是某个子信道上的总功率等于 10^((cfg.totalPower-30)/10) 除以 N。这段代码写清楚后NOMA-OFDMA 仿真的一半工程量已经完成了。剩下的一半都在配对策略和功率分配算法上。3.4 跑完先看三张图吞吐量、弱用户 CDF 和中断曲线只打印一个平均频谱效率无法判断 NOMA 是否真的在改善边缘用户。我一般会在仿真输出里强制画三张图第一张是平均频谱效率随 K 的变化NOMA 和 OFDMA 各一条曲线看增益是否随着用户数增加而扩大第二张是弱用户速率的 CDF重点看低速率段的累积概率是否小于 OFDMA 基线第三张是中断概率对目标速率或总功率的曲线用来评估系统在最不利条件下的表现。如果第一张图里 NOMA 没有优势不要急着怀疑配对算法。先回 nomaTwoUserRate 检查 SIC 顺序和干扰项如果前两张图全部正常再开始改动 α 或配对策略。这个排查顺序能替你省掉很多无效调参。4. NOMA-OFDMA 资源分配实现用户配对、FTPA 功率分配与 SIC 细节配对、功率分配、SIC 是 NOMA-OFDMA 仿真的三根支柱。前面的章节把基准流程跑通了这一章把每个支柱在代码里应该长什么样、参数边界在哪里一次说透。4.1 最强-最弱配对与信道差异门限配对代码里的一对一约束最常使用的配对策略是“最强-最弱”配对把所有用户按信道增益降序排列前 N 个和后 N 个一一组合。这样每个子信道都有比较大的信道差异SIC 效果最明显。一个简化的实现如下function [pairs, hPair] pairUsersStrongWeak(h, cfg) % h: 等效信道增益K×N % 这里按用户在所有子信道上的平均增益排序简化实现 K size(h, 1); N cfg.numSubchannels; avgGain mean(h, 2); [~, idx] sort(avgGain, descend); pairs zeros(N, 2); hPair zeros(N, 2); for n 1:N strongUser idx(n); weakUser idx(K - n 1); if strongUser weakUser error(pairing conflict: 同一用户被重复分配); end pairs(n, :) [strongUser, weakUser]; % 实测中子信道的频选衰落可能让强弱关系翻转 if h(strongUser, n) h(weakUser, n) pairs(n, :) [weakUser, strongUser]; end hPair(n, 1) h(pairs(n,1), n); hPair(n, 2) h(pairs(n,2), n); end end这段代码里avgGain 用所有子信道平均是为了先确定一个全局排序实际系统里更严格的做法是逐子信道调度每个子信道独立选择该信道上最强的用户和该信道上最弱的用户。两种方式在 K2N 时结果相近在 K2N 时会明显不同。注意我的实现里加了强用户和弱用户信道比较的保护逻辑因为频选衰落可能让某个子信道上“预设的强用户”实际增益变差这时要交换两者顺序否则后续 SIC 公式里 hStrong 和 hWeak 会错位。另一个容易忽略的点是信道差异门限。如果一对用户的增益差小于 3dBNOMA 带来的收益很小反而因为功率分配牺牲强用户。这时可以退回 OFDMA把强用户独占子信道弱用户等待下一轮或者去别的子信道。代码里我一般用一个if hStrong / hWeak threshold的分支来做这个退化判断threshold 建议取值 2 到 3线性值约 3~5dB。4.2 FTPA 功率分配因子 α0.3~0.6 的经验边界与注水法对比FTPA 是 Fractional Transmit Power Allocation 的缩写也是这类仿真包里最常见的功率分配方案。在同一子信道内它让信道越差的用户分到越多功率但又不至于完全倒向弱用户。常见公式是a_w (h_w^(-α)) / (h_s^(-α) h_w^(-α))这里的 α 是分数阶功率控制因子。α0 时两端功率相等α 越大功率越向弱用户倾斜。对应代码很短function alphaWeak ftpaAlpha(hStrong, hWeak, alpha) gammaS hStrong^(-alpha); gammaW hWeak^(-alpha); alphaWeak gammaW / (gammaS gammaW); % 弱用户功率比例通常 0.5 end因为 h_w 小于 h_s取负指数后 gammaW 大于 gammaS所以 alphaWeak 一定大于 0.5符合“弱用户多分功率”的预期。我一般把 α 控制在 0.3~0.6。0.4 是很多论文的默认值曲线比较平滑。如果 α 调到 0.9弱用户功率比例会接近 1强用户几乎拿不到功率SIC 里强用户解调勉强能过但速率被功率压得很低总吞吐量会掉得很难看。有同行喜欢用注水法做功率分配的上界。两用户场景下注水分配存在闭式解比穷搜快很多。但注水法不一定自动保证弱用户公平性有时结果与 FTPA 很接近。如果你想确认压缩包里的功率分配模块是否最优可以用一个 0.05 步长的穷举搜索对每个 α 从 0.1 扫到 0.9取总速率最优的那一个。这个搜索只在子信道级别做规模不大适合做法则验证。4.3 SIC 在速率仿真中的落地先解强用户还是先解弱用户第一次接触 NOMA 的人很容易被“功率大的先解”这个直觉带偏。功率域 NOMA 的 SIC 顺序按信道增益排序不按功率排序。原因是强用户信道条件好、抗干扰能力强先解强用户可以把它对弱用户的干扰彻底消掉如果反过来先解弱用户弱用户要面对强用户的高功率干扰几乎不可能正确解出。在速率仿真里SIC 落地就是上一章那个 nomaTwoUserRate 函数。强用户 SINR 的分母必须包含弱用户的功率项弱用户 SINR 的分母只能有噪声这两个不对称结构是正确 SIC 的全部体现。如果做符号级仿真还需要在这样的 SINR 计算之外加上调制符号叠加发射、星座判决、减干扰重构那套流程。很多压缩包不做符号级因为系统级仿真要跑几千次信道实现逐符号复杂度太高。这里还有一个需要区分的问题如果做的是误码率仿真SIC 第一个用户的解调错误会传播到第二个用户误码率层级的仿真要把这个错误传播建出来。速率仿真通常假设 SIC 理想即只要 SINR 达到门限就能无错误解调。两者不要混着用否则一边用香农容量公式、一边叠加符号判决噪声结果会自相矛盾。4.4 公平性指标Jain 指数与边缘速率同时看NOMA 的卖点是兼顾频谱效率和公平性所以只统计总吞吐量永远不够。仿真记录下每个用户的平均速率之后计算 Jain 公平指数J (sum R_i)² / (K · sum R_i²)J 越接近 1 越公平。除了 Jain 指数我还会看 5% 边缘速率也就是所有用户速率按从低到高排在第 5 百分位的那个值。这个指标比 Jain 指数更贴近实际感知。调功率分配时总吞吐量与边缘速率通常互为代价你给弱用户更多功率边缘速率上去了强用户速率下来总吞吐量可能持平甚至下降。所以我习惯把平均频谱效率、Jain 指数、5% 边缘速率三个指标放在一张结果表里横向比较只看其中一个容易得出偏激结论。5. 避坑/常见问题NOMA-OFDMA 仿真里最容易翻车的几个点这里列了五条我实际跑 NOMA-OFDMA 仿真时踩过的坑每条按现象、原因、解决写清楚。很多问题不是压缩包本身有 bug而是把模型假设和代码实现画等号时漏掉了边界条件。这些记录也可以当作调试 checklist下次曲线不对时一条条对照。5.1 SIC 解码顺序写反总吞吐量反而低于 OFDMA 基线现象NOMA 的总速率曲线在几乎所有 SNR 点都低于 OFDMA尤其弱用户速率特别差和论文里的结论完全相反。原因接收端把弱用户当第一解调对象弱用户一开始就要面对强用户的高功率干扰根本解不干净后面强用户又因为干扰没被消除而速率被压形成双重损失。解决回到 nomaTwoUserRate检查强用户 SINR 分母有没有包含弱用户功率项弱用户分母是否只有噪声。正确顺序是强用户先解、弱用户后解。代码里命名最好用 hStrong/hWeak不要用 h1/h2减少把自己绕进去的概率。5.2 用户配对出现重复用户一个用户被分到多个子信道现象某些用户速率异常高而另一些用户速率始终为 0系统总速率高得不合理但单用户速率分布歪歪扭扭。原因排序配对时如果直接用 idx(n) 和 idx(K-n1)当 K 与 2N 不是严格相等时同一个用户可能在一对里当强用户在另一对里又当弱用户。尤其 K 大于 2N 时前 N 个强用户和后 N 个弱用户的集合如果重叠索引就冲突了。解决在配对循环里维护一个已分配用户标记位发现 strongUser 或 weakUser 已被占用时沿着排序索引继续向后找未分配用户。最简单的第一步是把 cfg.numUsers 强制设成 2*cfg.numSubchannels跑通后再放开。代码里的 error 检测可以帮你尽早暴露冲突而不是让结果以错误的方式默默保存。5.3 FTPA 的 α 设成 0.9弱用户速率没有变好反而拖垮强用户现象把 α 从 0.4 提到 0.9 后弱用户速率曲线并没有明显上升总吞吐量反而掉了好几个百分点曲线出现断崖。原因弱用户拿走过高功率后强用户分到的功率太少但强用户在 SIC 过程中依然要承受弱用户功率的干扰等于两边都变差。性价比不划算。解决α 按 0.3~0.6 搜索不要直接取极端值。如果要看 α 的影响画出“总速率-α”和“弱用户 5% 速率-α”两条曲线取一个折中点。如果弱用户速率依然不够优先换配对策略或做更细粒度的调度而不是继续拉高 α。5.4 噪声功率没按子信道带宽折算SNR 虚高让曲线全部上翘现象横坐标 SNR 到 30dB 以上速率仍贴着上限增长明显超过香农限OFDMA 基线也奇高全图都不合理。原因代码里噪声功率用了噪声谱密度 N0而不是 N0×Δf。系统带宽 10MHz、子信道带宽 1.25MHz差了一个数量级等价于把噪声看小了。解决在 generateChannel 里除以 cfg.subchannelBw或者在速率计算里把噪声功率写成 N0*cfg.subchannelBw。再检查 dBm 到 W 的换算用 10^((dBm-30)/10)。这两个位置校对之后SNR 坐标下的速率曲线才会落到正常范围。5.5 OFDMA 基线不公平OFDMA 不做用户分集导致对比失真现象NOMA 比 OFDMA 高出 20% 以上但换了一版用户位置或随机种子后优势又缩到 3%结论不稳定。原因基线 OFDMA 如果只是把子信道按顺序固定给用户就没有利用多用户分集效应。NOMA 这边有全局配对和调度优势是配对、功率分配、调度三个机制叠加出来的不是 NOMA 本身独有。解决给 OFDMA 基线也做子信道级动态调度每个子信道分配给该子信道增益最高的用户更严格的做法是用比例公平权重做子信道调度。保持基线公平后NOMA 相对 OFDMA 的增益通常会落在 5%~15%这个区间才具备参考价值。我在参数扫描前一定会先把基线校正否则后面所有结论都是空中楼阁。这五条基本覆盖了我初跑这类模型时遇到的大部分故障。把它们过一遍再改算法比在错误模型上叠新方法有效得多。6. 进阶技巧把静态仿真扩展成动态调度与学习基线当静态蒙特卡洛曲线稳定之后下一步通常是往动态调度走。所谓动态就是把“一次信道实现算一帧速率”变成“一个时间轴上的事件驱动循环”每个时隙有老用户离开、新用户到达用户速率按移动平均更新。这个改动并不需要重写前面的代码因为 pairUsers 和 nomaTwoUserRate 是可以直接复用的外面套一层时间循环就行for t 1:cfg.numTTI updateUserSet(cfg, userCache, t); [pairs, hPair] scheduleAndPair(cfg, userCache); [sumRate(t), ueRate(t,:)] processOneFrame(cfg, userCache, pairs, hPair); endscheduleAndPair 的核心是比例公平优先级计算每个用户的权重等于当前可达速率除以过去平均吞吐量然后针对每个子信道选权重最高的用户作为强用户再选一个信道最弱的低权重用户作为弱用户。这样 NOMA 的配对不再是简单的“最强-最弱”而是会随业务变化动态调整也更贴近 5G 调度器的真实行为。如果你之后想接强化学习这个动态环境正好可以作为训练环境和评估基线。我自己在这个项目上吃过一个亏有一版参数让平均吞吐量曲线特别好看正准备庆祝结果翻看弱用户 5% 边缘速率时发现它比 OFDMA 还低不少。原因是功率分配把所有好处都给了中间用户边缘用户反而不如原来。从那以后无论仿真结果多漂亮我都固定把平均频谱效率、Jain 指数、5% 边缘速率三个指标同时摆在输出表里缺一个都不算通过。这样的习惯在调 NOMA 参数时尤其重要因为它会让你清楚地看到每一次看似“优化”的调整到底牺牲了谁。如果你手上正好是这样一份 NOMA-OFDMA 仿真包我建议按上面的顺序把系统模型、入口脚本、配对和功率分配跑通再对照避坑清单检查一遍最后再做动态扩展。这套路走完后你对功率域 NOMA 和 OFDMA 之间关系的理解会比跑十个默认示例深得多。希望帮到你。本文还有配套的精品资源点击获取