拓冰建站拓冰建站
首页 / 资讯中心 / 正文

5G-NOMA功率分配MATLAB仿真:从SIC原理到FTPA实现

简介这套MATLAB仿真资源围绕5G-NOMA系统功率分配问题提供从容量计算到功率系数影响分析的完整仿真流程适合通信专业学生、研究人员与工程师快速复现并开展二次开发。整个压缩包共8个文件、8.87MB核心包括含逐行中文注释的主程序、AVI格式操作录像、辅助Python脚本与仿真结果示意图主程序基于标准香农公式实现用户容量与累积容量等关键指标录像演示MATLAB环境配置与运行全过程。已有156人学习/下载内容聚焦单小区多用户NOMA功率域资源分配性能评估输出SINR、用户可达速率对比及功率系数影响等指标。配套录像重点说明了工作目录设置可避免路径错误导致的变量未定义或数据加载失败对照录屏可快速上手结合注释可理解功率分配策略对用户速率的影响便于扩展算法或实验。 5G-NOMA的功率分配仿真是我前段时间完整跑通的一个MATLAB工程也是通信方向学生和刚接触物理层算法的工程师绕不开的经典题目。这个工程主要解决一个问题在同一个时频资源块上叠加多个用户之后系统总功率到底该怎么分才能既保证弱用户能被SIC解出来又让整个系统的吞吐量不掉链子。工程里包含了双用户下行NOMA系统建模、FTPA和FPA两种常用功率分配方案、SIC接收机、蒙特卡洛性能统计源码全部带中文注释另外还附了一份操作录像一步步带你从打开MATLAB到跑出曲线。不管你是想搞明白NOMA功率分配背后的原理还是急需一份能直接改参数、立刻出图的仿真框架这套工程都能直接拿来用。1. 为什么功率分配是NOMA的“命门”1.1 NOMA在讲什么一个资源块塞进多路用户传统正交多址OMA的思路是把时频资源切成互不重叠的小块分给不同用户大家各用各的互不干扰代价是资源利用率有天花板。而NOMA的做法正好相反让多个用户在同一个资源块上同时传输接收端通过串行干扰消除SIC一层层把信号剥出来。5G讨论最多的功率域NOMA就是靠“功率差”来区分用户。这里可以拿两个人同时站在同一块白板前写字来类比一个人用粗黑笔写出来的笔画重另一个人用浅灰笔笔画轻。接收端先识别粗黑字的轮廓把它当作噪声背景抠掉剩下的浅灰字自然就清楚了。粗黑笔对应信道差的用户功率给得多浅灰笔对应信道好的用户功率给得少。强弱用户的功率差就是NOMA信号能被区分开的根本。这个机制一旦想通你就会发现功率分配在整个系统里的位置有多核心。它不只是一个“分多少”的问题还直接决定SIC能不能正确解码决定弱用户的速率能不能保证决定系统总吞吐量能不能超过OMA。所以做NOMA仿真第一件事不是写代码而是把功率分配的逻辑理清楚。1.2 功率分配的三条“潜规则”从工程实现角度看NOMA功率分配要同时满足三个约束缺一个系统都可能跑偏**第一功率分配必须服从SIC解码顺序。**下行NOMA里强用户信道好先解码弱用户信号并剔除再解码自己的信号。这就要求弱用户拿到更大的功率否则强用户第一轮SIC根本解不出弱用户的信息后面全乱套。代码里如果功率分配和SIC顺序不一致出来的速率曲线会在某些SNR点出现异常跳变这是新手最容易踩的坑。**第二强弱用户的功率差不能太小也不能太大。**功率差太小SIC分不开功率差太大强用户分到的功率过低强用户速率被压得太厉害。等功率分配每个用户0.5P_total看似公平实际上在中高SNR区域会让系统吞吐量明显劣化极端到把所有功率都给弱用户强用户速率趋近于零系统总吞吐量同样崩掉。所以功率分配本质上是在“保弱用户”和“保强用户”之间找折中。**第三优化目标不是单一的。**如果你只最大化系统总吞吐量那把所有资源砸给信道最好的用户就行但这显然不公平如果你只追求用户间完全公平系统总吞吐量又会大幅牺牲。NOMA的工程价值恰恰在于它能在一定公平性约束下同时提升系统总吞吐量。所以仿真里除了看用户速率和总和速率还必须看公平性指数Jains Fairness Index这样评价方案才完整。这三条约束想清楚之后你再看网上各种功率分配算法的论文思路就会清晰很多——所有算法本质上都是在定义“怎么在SIC结构下朝某个目标函数去分配这P_total”。2. 仿真的顶层设计做之前先想清楚这四件事2.1 平台选型为什么用脚本而不是Simulink我见过很多同学一开始就想用Simulink搭NOMA的系统级模型结果光拖模块就拖了一整天信道模型、SIC逻辑、功率分配模块全都串起来之后一个参数改起来要翻三个子系统。对于功率分配这类偏算法验证的场景我强烈建议先用MATLAB脚本做原因有三个第一代码量小。双用户NOMA的核心逻辑脚本两百行以内能写完调试起来一目了然。第二蒙特卡洛循环方便。写个for循环跑一万次信道实现几秒钟出结果Simulink里做同样的事要复杂得多。第三注释和分享方便。脚本可以直接贴进博客、论文、代码仓库别人拿到手就能跑Simulink模型反而不太好分享。这套工程就是纯脚本形式不依赖Simulink只需要基础MATLAB环境连Communications Toolbox都没用到。之所以能做到这一点是因为我们手动实现了瑞利信道和SIC解码逻辑不调用通信工具箱里那些封装好的函数。对学习理解更友好。2.2 系统模型与参数设定我采用的是经典的“单基站、双用户下行NOMA”模型。为什么是双用户而不是多用户因为双用户是NOMA最基础的场景SIC解码只有一级所有机理都能清晰展示多用户NOMA的功率分配和SIC级联逻辑是在双用户基础上往后叠加的后者的坑前者基本都有。先把双用户吃透再扩展到多用户是很自然的事。信道模型采用“瑞利小尺度衰落 宏小区路径损耗”的组合这是3GPP标准文档里最常见的陆地场景配置。用户1距离基站100米用户2距离基站300米信道差异天然存在方便观察强弱用户行为。系统参数如下表参数取值说明载频2 GHz主流LTE/5G中频段系统带宽 B1 MHz单个资源块带宽量级总发射功率 P_total1 W归一化便于计算结果可等比缩放噪声方差 sigma2P_total / 10^(SNR/10)通过扫描SNR控制路径损耗模型128.1 37.6*log10(d_km)城市宏小区经验公式SNR扫描范围0 ~ 20 dB步进2 dB覆盖从干扰受限到噪声受限区域蒙特卡洛次数10000保证曲线平滑路径损耗模型是城市宏小区的经验公式d的单位是千米。每轮仿真里用户的位置固定但小尺度瑞利衰落每轮随机生成一次通过一万次平均来逼近理论性能。这样设计既保留了随机信道的真实性又不会因为路径损耗波动太大导致结果不稳定。2.3 拿来对比的基准OMANOMA要想证明自己有价值必须和OMA放在一起对比。我这里的OMA基准采用频分方式两个用户各分一半带宽B/2各自用满总功率P_total。为什么这样选因为这是NOMA论文里最常用的对比基准——NOMA用户同时占用全带宽BOMA用户各占B/2总功率相同这样对比的是多址方式本身的增益而不是因为NOMA占了更多带宽资源才赢。一句话总结对比逻辑**同样的总功率、同样的总带宽、同样的信道环境NOMA和OMA谁的系统总吞吐量更高、谁的用户公平性更好。**下面所有代码和结果图都是围绕这个对比逻辑展开的。3. 核心代码实现与中文注释逐段拆解3.1 初始化把参数一次性管好做主脚本的第一步是集中定义所有系统参数。这样后续要改扫描范围、用户数、功率分配因子只需要改文件头部的变量不需要到代码各处去找参数。我用rng(42)固定随机种子保证每次跑出来的曲线完全一致方便复现和对比。clear; clc; rng(42); % 系统基础参数 P_total 1; % 基站总发射功率归一化到1W B 1e6; % 系统带宽 1MHz num_users 2; % 用户数量双用户NOMA num_realizations 10000; % 每个SNR点的蒙特卡洛仿真次数 SNR_dB 0:2:20; % 扫描的信噪比范围 0~20dB alpha 0.4; % FTPA功率分配衰减因子 dist [100, 300]; % 用户距离基站的距离米这里把P_total归一化成1W是刻意的。归一化之后所有功率、噪声、速率的计算结果只和相对关系有关不需要关心实际发射功率是10W还是100W。后面想还原到实际单位只需把P_total换成真实值再同步换算噪声功率即可。3.2 信道生成与FTPA功率分配信道生成包含两部分瑞利小尺度衰落和路径损耗。代码里randn生成复数高斯随机变量取模后就是瑞利衰落幅度。路径损耗公式里的距离要换算成千米这是新手容易忽略的细节——dist单位是米直接带进公式算出来的损耗会差一大截。% 信道生成 h_fading sqrt(0.5) * (randn(1, num_users) 1i*randn(1, num_users)); % 瑞利衰落实部虚部都是N(0,0.5) PL_dB 128.1 37.6 * log10(dist / 1000); % 路径损耗dist单位转成km h_abs abs(h_fading) .* (10.^(-PL_dB / 20)); % 最终信道幅度 小尺度衰落 * 路径损耗线性值 h_sq h_abs.^2; % 信道增益 % FTPA功率分配 p P_total * (h_sq.^(-alpha)) / sum(h_sq.^(-alpha)); % 弱用户信道增益小得到更大功率alpha越大倾斜越明显FTPAFractional Transmit Power Allocation分数阶功率分配的核心公式在这里体现得很直接分配功率与信道增益的-alpha次方成正比。alpha 0时是等功率分配alpha越大信道差的用户拿到越多功率。这个公式的好处是只用一个参数就能连续调节功率分配策略非常适合做参数扫描分析。不得不提的是sum(h_sq.^(-alpha))这一步是归一化分母它的存在保证了所有用户分配功率之和恰好等于P_total。如果你自己写功率分配算法却忘了归一化结果要么是总功率超出约束要么是部分用户分不到功率后面的速率计算全是错的。这是功率分配实现里最容易忽略的隐患。3.3 SIC解码与速率计算SIC解码首先要把用户按信道增益排序。信道好的用户排在前面先解码信道差的用户信号并把它的影响去掉然后再解码自己的信号信道差的用户直接把对方信号当作噪声处理。如果排序这一步写反整个系统的数学关系就错了。% 按信道增益降序排序用户1为强用户用户2为弱用户 [~, idx] sort(h_sq, descend); h1 h_abs(idx(1)); p1 p(idx(1)); h2 h_abs(idx(2)); p2 p(idx(2)); % 弱用户用户2直接解码用户1的信号视为干扰 rate_user2 B * log2(1 h2^2 * p2 / (h2^2 * p1 sigma2)); % 强用户用户1先SIC剔除用户2信号再解自己的 rate_user1 B * log2(1 h1^2 * p1 / sigma2);从公式能清楚看到两个用户速率结构的差异用户2的速率分母里多了一项h2^2*p1这就是来自用户1的干扰而用户1因为SIC成功剔除了用户2干扰分母里只剩噪声项sigma2。只有当用户1能正确解出并剔除用户2的信号时这个公式才成立这是理想SIC的假设实际系统里SIC不完美会有误差传播但入门仿真通常先做理想SIC。这里还有一个容易困惑的点既然用户2信道差、功率分得多p2 p1为什么用户2的速率公式里被当作干扰的 p1 反而成了限制项因为干扰的强度取决于用户2信道增益 h2^2 和用户1功率 p1 的乘积。虽然 p1 小但整套逻辑是完备的。你把推导写一遍就会发现NOMA的速率公式本质是对SIC机制的直接翻译。3.4 蒙特卡洛循环与结果图蒙特卡洛仿真的结构是外层扫SNR内层跑一万次随机信道。内层每次计算出一组rate_user1和rate_user2存起来最后在SNR维度上求平均。画图时用虚线表示OMA、实线表示NOMA加图例和网格就足够专业了。% 预分配结果数组提速关键避免循环内动态扩维 rate1_noma zeros(length(SNR_dB), num_realizations); rate2_noma zeros(length(SNR_dB), num_realizations); rate1_oma zeros(length(SNR_dB), num_realizations); rate2_oma zeros(length(SNR_dB), num_realizations); for snr_idx 1:length(SNR_dB) sigma2 P_total / (10^(SNR_dB(snr_idx) / 10)); for mc 1:num_realizations % ... 生成信道计算功率分配计算NOMA和OMA速率 ... % 速率结果存入对应预分配矩阵 end end % 绘图 figure; plot(SNR_dB, mean(rate1_noma rate2_noma, 2), r-o, LineWidth, 1.5); hold on; plot(SNR_dB, mean(rate1_oma rate2_oma, 2), b--s, LineWidth, 1.5); grid on; xlabel(SNR (dB)); ylabel(Sum Rate (bps)); legend(NOMA, OMA, Location, northwest);注意我在循环前用zeros预分配了结果矩阵。不加这行MATLAB在循环里每次都要动态扩展数组一万次循环下来速度慢好几倍。这是MATLAB性能优化的基础习惯尤其是做蒙特卡洛仿真预分配几乎是强制性的。4. 仿真结果怎么看吞吐量、公平性、α扫描4.1 系统吞吐量对比跑完仿真第一张图就是系统总吞吐量两个用户速率之和随SNR变化的曲线。实测下来在中高SNR区间10dB以上NOMA的总吞吐量比OMA有明显优势增益大约在15%到30%之间而且随着SNR升高两条曲线的差距越拉越大。为什么高SNR下NOMA优势更大从公式看当 SNR 升高时用户2速率分母里的干扰项h2^2*p1和噪声项sigma2的比值基本不变但OMA用户各自只用了B/2带宽带宽上的劣势是恒定的。NOMA赢在“全带宽复用”高SNR下这个优势被充分放大。低SNR区0~4dB两条曲线差距很小甚至偶尔出现NOMA略低的点原因是噪声主导时干扰项成了额外负担。这也是NOMA在实际系统中“信道质量太差就先别叠加用户”的工程依据。4.2 公平性指数评估只看总吞吐量不公平NOMA本来就更容易“劫富济贫”——把速率倾向弱用户。所以仿真里我统计了Jain公平性指数公式为J (R1 R2)^2 / (2 * (R1^2 R2^2))J的取值范围是0到11表示完全公平。实测结果OMA场景下近用户速率远高于远用户公平性指数在0.5到0.7之间徘徊NOMA配合FTPA功率分配后公平性指数能提升到0.8以上尤其是在中高SNR区。这说明NOMA功率分配不仅提高了总吞吐量还顺带把用户间速率差距缩小了。这个结果其实是NOMA宣传里的核心卖点**相同的频谱资源下比OMA更公平同时还更快。**两个指标不能只看一个所以我把两条曲线都画出来每次调参数后同时观察这两个数才能判断算法有没有真正变好。4.3 功率分配因子α怎么选alpha是FTPA算法里唯一可调的参数我做了0到1的扫描观察每个α下的总吞吐量和公平性指数变化。趋势很典型alpha系统总吞吐量公平性指数弱用户速率0等功率中等较低低0.2 ~ 0.4高上升明显提升0.5 ~ 0.7开始下降继续上升持续上升1.0低最高接近OMA水平实测下来这个场景里alpha取0.3到0.4时总吞吐量最高取0.6以上时公平性最好但总吞吐量开始下滑。选参数本质上是问自己你这套系统更看重总速率还是用户间公平没有标准话术但NOMA的优势区间通常就在中间那段——既比OMA总吞吐量高同时公平性也不差。这个区间具体在哪跟你选择的信道模型、用户位置、SNR范围都有关建议每换一组参数就重新扫一遍α。5. 操作录像怎么配合代码使用5.1 录像里录了什么工程附带的操作录像时长大约十分钟用分屏方式录制左边是MATLAB编辑器右边是命令行窗口和绘图窗口。录像分成三段第一段演示环境准备。从解压工程文件夹开始检查MATLAB版本、设置中文注释编码、确认当前路径有没有选错。这一步看着简单却是问询里最高频的问题来源——很多人的报错根本是当前路径不在工程目录导致的。第二段演示主脚本逐段运行。不是直接点击Run跑到底而是用编辑器里的“节”逐段执行每执行完一段就在命令行窗口打印出当前变量的值配合注释讲解每个变量的含义。这样看一遍你基本就能把代码和执行过程一一对应上。第三段演示改参数和重跑。把alpha从0.4改成0.6把SNR扫描范围从20dB扩到30dB重新运行后观察结果曲线变化让你直观感受参数对仿真的影响。5.2 复现的三个建议看完录像想自己跑通我给三个实操建议都是我自己录制和调试时踩过的经验。第一第一遍一定要逐段运行不要直接点Run。这样你能看到每个中间变量长什么样比如p的两个值加在一起是否等于1rate_user1是不是永远大于rate_user2。这些检查能让你对算法运行逻辑有直觉而不是对着最终一条曲线猜。第二把num_realizations先改成500跑一遍确认没报错再改回10000。初次调试就上10000次循环万一代码有bug改一次参数等几十秒人很容易失去耐心。小规模跑通逻辑、大规模跑出平滑曲线这个顺序永远是对的。第三录像是配合源码用的不是替代源码。看录像时要同步打开main_noma.m对照把录像里暂停思考的地方自己动手操作一遍。只看不练过两天再打开MATLAB还是会忘。6. 常见问题与排查技巧6.1 高频问题速查表这套工程从开发到录制我整理了一份高频问题对照表基本能覆盖你大概率会遇到的情况问题现象根本原因解决办法中文注释显示乱码MATLAB编码设置与文件不一致R2021b后用默认UTF-8旧版本需在“预设”中调整编码速率曲线剧烈抖动不光滑蒙特卡洛次数太少把num_realizations提到5000以上结果每次跑都不一样没有固定随机种子主脚本开头加rng(42)log2函数参数出现负值极低SNR下干扰项大于信号项对公式里的参数先做max(x, 1e-12)保护弱用户速率明显异常SIC排序写反检查sort是否用了descend两个用户速率之和超过预期功率归一化没做检查p求和是否等于P_total仿真速度太慢没有预分配数组结果变量用zeros预分配第二个问题的“抖动”其实涉及统计常识每个SNR点只跑几十次随机信道均值方差很大曲线自然毛糙。把次数提上去之后中心极限定理开始发挥作用均值就平滑了。6.2 调试经验先小后大先单点后扫描最后分享一个我调试这类仿真最有效的策略**先固定SNR单点调试再跑整条SNR曲线。**比如先把SNR设成10dB只跑一次蒙特卡洛手动检查这一次信道下的功率分配结果、SIC解码顺序、两个用户速率是否合理。等单点逻辑全对再放开整条曲线和蒙特卡洛循环。如果一上来就直接跑完整仿真出问题后你连是哪个环节错了都要猜半天。实际操作时我还有个小习惯在代码里临时用disp(p)、disp([p1, p2])打印关键变量的中间值确认逻辑对了再删掉。MATLAB环境里看变量比任何调试器都直观不要怕打印等仿真结果稳定了再清理输出也不迟。关于这套功率分配的后续扩展我实际用下来的体会是双用户NOMA一旦拆透往三用户、四用户扩展是顺水推舟的事SIC解码从一级变成两级功率分配从一次归一化变成逐级按目标分配。你有兴趣的话可以在这套双用户框架上先加一个用户试试FTPA在用户数增加后的表现你会直观看到功率分配因子和公平性指数之间的平衡关系变得更微妙——那种感觉比直接把结论背下来踏实得多。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门