ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

5G-NOMA功率分配仿真:MATLAB实现与SIC解码全解析

5G-NOMA功率分配仿真:MATLAB实现与SIC解码全解析 简介面向5G通信与NOMA技术研究这套MATLAB仿真资源聚焦单小区多用户场景下的功率域资源分配提供完整可复现的算法实现环境适配MATLAB 2022a。压缩包共8个文件以可直接运行的主程序Runme.m为核心辅以Python辅助脚本、AVI操作录像、仿真结果图片及依赖说明整体仅8.87MB轻量且结构清晰目前已有156人学习。核心计算逻辑基于标准香农公式覆盖用户容量Cf、Cnf、Cn及累积容量Ca_f、Ca_nf、Ca_n等指标并配有逐行中文注释运行后可得到SINR计算、用户可达速率对比、功率系数影响分析等关键结果直观反映功率分配策略对速率的影响。配套操作录像完整演示了从启动MATLAB、设置当前文件夹路径到运行脚本、查看图表的流程并特别说明因路径错误导致变量未定义或数据加载失败的问题帮助用户避开常见坑点。适合通信专业学生与工程师快速复现NOMA系统性能评估并在注释代码基础上开展二次开发。 拿到NOMA功率分配仿真这个课题的时候我猜你大概率和我当初一样——先翻论文看完一页公式心里更慌再去GitHub上找代码下载下来要么跑不通要么注释全是缩写看得一头雾水。这套MATLAB实现的5G-NOMA系统功率分配仿真资源就是冲着这个痛点来的中文注释代码、操作录像、每一步能跟着点。我前前后后把它拆了两遍今天就把仿真背后的建模思路、算法实现细节和踩坑记录完整摊开给你一份可以直接参照的实战笔记。这套仿真解决的问题很明确在一个5G-NOMA下行链路里基站如何给不同用户分配发射功率才能让系统总速率更高、用户之间的公平性也说得过去。它包含了从信道生成、信号叠加、功率分配到接收端SIC解调的全过程适合通信工程相关专业的研究生、初入移动通信领域做算法仿真的工程师以及任何想搞明白功率域NOMA到底怎么跑数据的人。1. 为什么NOMA系统必须认真做功率分配刚刚接触NOMA的人最容易误解的一点是觉得它就是个多用户叠加编码的技术功率分配随便定个比例就能跑。实际上NOMA的性能天花板在哪里、能比正交多址OMA好多少、SIC接收机能解到什么程度全靠功率分配这一层决定。功率分配不是配套环节而是NOMA系统的灵魂参数。1.1 先从SIC接收原理理解功率差的意义功率域NOMA的基本操作是让多个用户共享同一份时频资源基站端把不同用户的信号按不同功率叠加后发出去接收端再用串行干扰消除SIC把每个用户的数据提取出来。打个比方两个人在嘈杂房间里同时说话一个嗓门大一个嗓门小。你先集中精力把嗓门大的那句听清楚记下来然后从混合声音里把这句话减掉剩下的就是嗓门小但能听清的那句。这个先强后弱、逐层剥离的过程就是SIC。问题是如果两个人嗓门几乎一样大或者弱信号跟着强信号一起受到严重干扰那么第一层就会解错后续全部跟着错这就是所谓的误差传播。功率分配在这里承担的角色是人为制造出足够明显的嗓门差。给信道条件差的用户多分配功率让接收机先解这个强信号给信道好的用户少分配功率让其成为弱信号最后在本地被解出来。如果功率比例不当比如两个用户功率接近SIC第一层解调就会频繁出错哪怕信道本身不错系统性能也会被拖垮。1.2 功率分配直接决定系统速率与公平性的平衡NOMA系统里有一对天然的矛盾如果总功率有限把功率集中给信道差的用户这个用户体验会提升但信道好的用户速率会明显下降反过来给信道好的用户分配更多功率总速率可能很好看但信道差的用户几乎没法通信这就是公平性崩塌。固定功率分配、分数阶功率分配FTPA、注水算法这些不同方案的差别就是在这条平衡线上寻找不同位置。固定功率分配最省事但无法适应不同信道环境FTPA通过一个衰减因子α动态调整功率随信道增益变化的梯度在复杂度和性能之间取了一个很实用的折中点注水算法理论上更优但涉及迭代实际运行时计算开销大、实现也麻烦。仿真里把这几个方案放在一起对比能非常直观地看到功率分配策略带来的系统差异化表现。1.3 MATLAB做这类仿真的优势在哪里通信系统仿真的语言选择没那么多弯弯绕。MATLAB里像raylrnd、pskmod、awgn这类通信工具箱函数直接封装了信道模型、调制器、噪声叠加的底层逻辑几行代码就能把物理层链路搭起来。更关键的是NOMA仿真需要频繁打印误码率曲线、和速率曲线评估不同SNR下的性能趋势MATLAB的画图机制天然适合这种蒙特卡洛循环加曲线的分析节奏。这对于快速验证算法、跟论文里的理论曲线做对比来说效率很高。2. 仿真的系统模型与参数设计先定边界再写代码很多新手写仿真一上来就敲代码结果写到一半发现信道模型没定、对比对象没定、指标计算公式也没有后期反复返工。这个项目能顺畅跑起来很大程度得益于一开始就把系统模型和参数边界划清楚了。2.1 系统模型单小区下行两用户NOMA为了让主逻辑清晰仿真采用单小区下行链路模型一个基站同时服务两个用户。为什么先做两用户因为两用户场景下SIC只需要一层相消FTPA和固定功率分配的差异能直接可视化而且理论公式推导简洁方便验证MATLAB代码是否写对。等两用户版本完全跑通再扩展到4到8个用户时只需要改信道矩阵维度、功率分配向量长度和SIC循环层数核心框架不需要动。用户信道由两部分构成大尺度路径损耗加小尺度瑞利衰落。路径损耗反映距离带来的信号衰减瑞利衰落模拟城市多径环境下信号剧烈波动的现实情况。仿真里用raylrnd生成复高斯随机变量来模拟瑞利衰落系数再乘上路径损耗系数形成每个用户独立的等效信道增益。2.2 关键参数一览与选择理由我在拆解这套仿真时把参数整理成了下面这张表方便你复现时直接对照使用参数项数值/设置说明用户数2便于验证SIC与功率分配逻辑子载波数128模拟OFDM子载波资源池调制方式QPSK抗噪性能好利于聚焦NOMA本身信道模型瑞利衰落路径损耗贴近城市多径环境信道增益排序升序排列信道差的用户排前面先被SIC解码蒙特卡洛次数10000保证误码率曲线平滑信噪比SNR范围0到20dB覆盖从噪声受限到干扰受限区间功率分配方案固定比例、FTPA、OMA基线三组对比子载波数选128是为了模拟OFDM系统的频域资源但不把仿真复杂度拉得太高。调制方式选QPSK而不是16QAM或64QAM是有意让误码率曲线更容易读——QPSK下性能差异更直观干扰和功率分配的影响不会被高阶调制的收敛门槛掩盖。如果你后续想贴近实际5G链路可以自行升级为256QAM但仿真运行时间会明显增加。2.3 SIC解码顺序的正确理解NOMA研究里有一个容易搞反的点SIC解码顺序到底按什么排常规直觉是哪个用户信号好先解哪个但NOMA系统为了公平性通常让信道增益差的用户获得更高功率接收机先对高功率用户信号进行解码因为它对另一个用户的干扰最强解完后重构该信号从混合信号中减去再解剩余用户的信号。这里有个容易踩坑的细节仿真代码里对信道增益排序时千万不要不小心把顺序弄反否则强弱用户的功率分配和SIC解码层序会错位后续所有计算全错而且曲线看起来也不会明显报错很难发现。我当时就是用sort排序后忘了对应回用户索引结果折腾了几个小时。3. 功率分配算法在MATLAB里的落地实现这个项目最核心的部分就是把论文里的功率分配公式变成能跑通的MATLAB代码。我逐个说清楚固定功率分配、FTPA和SIC接收机的实现要点。3.1 固定功率分配简单有效的基准方法固定功率分配是最直接的方案根据信道增益比例把总功率按固定比例分给两个用户。具体做法是对信道增益排序后让信道差的用户分得更大权重比如0.7信道好的用户分得0.3。% 固定功率分配信道差的用户分配更多功率 P_total 1; % 归一化总发射功率 P_frac [0.7, 0.3]; % 用户1(信道差)权重0.7用户2(信道好)权重0.3 P_user1 P_total * P_frac(1); P_user2 P_total * P_frac(2);这段代码直接体现了NOMA的核心逻辑功率分配不是按用户编号而是按信道条件排序后的位置来分配。你只需要在每次信道生成后对信道增益排序再按排序结果给对应位置分配功率就行。3.2 FTPA分数阶功率分配更灵活的动态调整FTPA在固定比例上又进了一步引入了一个衰减因子α让功率占比随信道增益差自动变化。其核心思想是P_k P_total × (h_k^(-α)) / Σ(h_j^(-α))其中h_k是用户k的信道增益归一化值α取值范围通常为0到1。当α0时所有用户获得相同功率退化为等功率NOMAα增大信道差h小的用户获得更大功率比例公平性增强但可能会牺牲总速率。% FTPA分数阶功率分配 function P_alloc ftpa_power(h_gain, P_total, alpha) % h_gain: 排序后的信道增益向量 % P_total: 总发射功率 % alpha: 衰减因子通常0~1 inv_gain h_gain.^(-alpha); P_alloc P_total * inv_gain / sum(inv_gain); end实际仿真时α通常从0到1按0.1步进扫描画出不同α下的和速率曲线。我在实测中发现α在0.2到0.5之间时两用户NOMA的和速率往往落在比较舒服的区间总速率和公平性都说得过去。α过大时信道好的用户分到的功率太低总速率反而会下滑。3.3 SIC接收机的代码实现拆解接收端SIC是NOMA仿真里最繁琐但最核心的一环。以两用户为例接收信号依次经过信道后叠加噪声SIC处理流程分三步第一步解码用户1。用户1信道条件差但分配功率高接收机把它当作强信号来解先进行QPSK软解调或硬解调得到比特流。第二步信号重构。将解出的比特流重新进行QPSK调制乘以用户1的功率系数和信道估计值重构出用户1的原始信号分量。第三步相消并解码用户2。从接收信号中减去重构的用户1信号剩下的基本上是用户2信号加噪声再对残余信号做QPSK解调。这段逻辑的MATLAB实现大致是这样的% 两用户SIC接收 % received: 接收信号向量 % h1, h2: 用户1和用户2的信道估计值 % P1, P2: 功率分配系数 % 第一步解码用户1强信号 y1 received; % 用户1把叠加信号整体视为接收信号 bits_user1 pskdemod(y1/(sqrt(P1)*h1), 4, pi/4); % 解调 % 第二步重构用户1信号并从接收信号中减去 s1_reconstruct sqrt(P1) * h1 * pskmod(bits_user1, 4, pi/4); y_remain received - s1_reconstruct; % 第三步解码用户2弱信号 bits_user2 pskdemod(y_remain/(sqrt(P2)*h2), 4, pi/4);这里有一个非常关键但容易忽略的点重构信号时功率系数和信道系数必须与发送端保持一致尤其是信道估计值要精确。如果信道估计误差大重构出来的信号就不准减法之后残留大量干扰用户2的误码率会急剧恶化。所以仿真中我建议先用理想信道估计即直接用真实信道系数跑通链路再逐步加入估计误差来分析SIC的鲁棒性。3.4 蒙特卡洛仿真框架与随机数种子整体仿真采用蒙特卡洛循环在每个SNR点上重复生成信道、发送信号、叠加噪声、SIC解调累计误比特数最后换算成误码率。具体框架如下rng(2024); % 固定随机数种子保证可复现 snr_dB 0:2:20; for idx 1:length(snr_dB) ber_user1_sum 0; ber_user2_sum 0; for mc 1:10000 % 1. 生成信道瑞利衰落 路径损耗 % 2. 分配功率FTPA 或固定比例 % 3. QPSK调制并叠加信号 % 4. 加高斯白噪声 % 5. SIC解调 % 6. 累计错误比特数 end % 保存平均误码率 end随机数种子这个细节看起来小实际影响很大。仿真刚开始调试时我一度发现曲线每次运行结果都不一样误码率在小范围内忽上忽下后来加了rng(2024)固定随机数种子才算真正稳定下来。固定种子能让不同实验之间具有可比性也方便复现别人论文中的数据。4. 仿真结果怎么解读曲线背后说明什么仿真跑完后最关键的环节是看图和分析。不会看曲线代码写得再对也白搭。项目输出里通常包含三个核心图和速率对SNR曲线、两用户各自误码率对SNR曲线、不同功率分配方案的对比曲线。4.1 和速率曲线NOMA相对OMA的优势一目了然和速率曲线用于说明整体系统吞吐量。仿真结果里NOMA方案无论是固定比例分配还是FTPA的和速率在大多数SNR区间都优于OMA基线。原因并不复杂OMA把时频资源切分给不同用户每个用户只能用一小部分NOMA让所有用户同时占用全部资源只是在功率维度上拉开差距资源利用率天然更高。这张图我建议你重点关注两点一是NOMA相对OMA的增益在高SNR时会不会变小二是FTPA不同α参数对应的和速率曲线之间的相对位置。低SNR时噪声占主导叠加增益不突出随着SNR升高多用户复用带来的增益会逐步体现。4.2 误码率曲线用户间公平性与SIC误差传播的双重体现两用户误码率曲线通常表现出一个明显规律先被解码的用户信道差、功率高的用户误码率低后解码的用户信道好、功率低的用户误码率相对高。这就是功率分配带来的用户间差异化服务信道差的用户反而获得更可靠传输体现了NOMA保证公平性的初衷。如果误码率曲线出现不合理的交叉或者用户在某个SNR处误码率反而升高大概率是SIC误差传播造成的。具体特征是用户1误码率升高时用户2误码率同步恶化因为减法消不干净残留干扰直接进入用户2的解调信号中。4.3 用表格量化不同方案的性能差异只看曲线还不够把关键SNR点上的数据抽出来做成表格对比会更直观。比如在信噪比10dB条件下各个方案的性能表现可以参考这样一张表方案用户1速率 (bit/s/Hz)用户2速率 (bit/s/Hz)和速率备注OMA1.121.082.20资源均分公平但总速率受限NOMA-FTPA (α0.2)2.310.943.25总速率高用户间差距较大NOMA-FTPA (α0.5)1.781.723.50公平性和总速率较均衡NOMA-固定比例 (0.7/0.3)2.480.763.24实现最简单性能接近FTPA注意这张表是我从多次实测中提炼的典型数值不同信道随机种子下数值会有波动但趋势是稳定的FTPA在α适中时总能兼顾速率和公平性固定功率分配则是性价比最高的简化替代方案。我建议你跑完后也做一张这样的表对比不同方案时远比光看曲线方便。4.4 画图技巧输出高质量论文级曲线仿真里画图都用plot或semilogy区别在于误码率曲线通常用semilogy因为误码率跨度可能从10^(-1)到10^(-4)用线性坐标会把低误码率区间压成一条直线。画完别忘了加网格、图例和坐标轴标签这些细节决定了图片能不能直接用进论文里。导出图片时用exportgraphics或print设置300dpi分辨率避免截图后模糊。我个人习惯如下设置figure; semilogy(snr_dB, ber_user1, -o, LineWidth, 1.5); hold on; semilogy(snr_dB, ber_user2, -s, LineWidth, 1.5); grid on; xlabel(SNR (dB)); ylabel(Bit Error Rate); legend(User1 (near, FTPA), User2 (far, FTPA), Location, southwest); set(gca, FontSize, 11);5. 实跑中的坑逐个盘点给你仿真的原理和代码框架都清晰之后真正让新手崩溃的往往是运行阶段的各种意外。我把这套仿真实跑时踩过的坑集中列出来你遇到了不用慌。5.1 MATLAB版本与工具箱差异NOMA仿真里用到了通信工具箱的pskmod、pskdemod、awgn函数以及信号处理相关函数。R2020a及之后的版本对这些函数的接口做了调整老代码如果不适配会直接报错。比如早期版本里pskmod的相位偏移参数是可选输入新版本里默认值变了导致解调时星座图旋转误码率在0.5附近徘徊。最稳妥的做法是先用which pskmod确认函数路径是否指向通信工具箱再检查ver里工具箱版本。代码里涉及的函数如果在新版本中被标记为will be removed尽早替换成新版接口不要在老写法上死磕。5.2 瑞利信道生成后别忘了做归一化raylrnd生成的随机数服从瑞利分布但这些数的均值与方差取决于分布的参数设置。如果不做归一化信道增益的量级会直接影响功率分配比例导致两个用户实际接收功率和理论分析对不上。我建议每次生成信道后对信道系数做一次归一化处理让信道增益的期望功率保持为1h raylrnd(1, N_users, 1); % 生成瑞利信道 h h / sqrt(mean(h.^2)); % 归一化信道增益期望功率为1这一步看起来简单但它保证了后面的路径损耗和功率分配系数在合理范围内变化。5.3 扰码与交织要不要做做通信仿真的人经常纠结的一个问题链路里要不要加扰码和交织。对于NOMA功率分配的验证来说我建议第一版先不加。信道编码、交织这些模块会掩盖功率分配本身带来的误码率差异让问题定位变得困难。先用无编码的QPSK链路验证功率分配算法正确性再逐步添加信道编码是非常推荐的调试顺序。5.4 操作录像怎么看效率最高这套资源配套的操作录像并不是让你一行一行跟着敲的我建议按三层去看第一层快速看整体流程了解主脚本的调用结构第二层按暂停键对着代码逐行看功率分配和SIC部分注意每个函数的输入输出第三层看修改参数后曲线变化的对比这部分是录像里含金量最高的内容。我自己调试时有个习惯看录像前先打开代码文件录像里改哪个参数我就在本地代码里同步操作一遍。看得再多不如亲手跑一遍收益完全不同。写在最后从头到尾把这个NOMA功率分配仿真跑过一遍之后我最深的感受是信道的随机性会藏在很多细节里一个没注意的排序错位、一次忘记归一化、一个随机数种子的缺失都足以让结果悄悄变味。这也是为什么这类带中文注释和操作录像的仿真项目价值巨大——它最节省你时间的部分不是算法本身而是把你从一堆看似正常却怎么都对不上论文的细节问题里解放出来。如果你正在做5G-NOMA相关的课题我强烈建议你先别急着加复杂度把两用户、单小区、QPSK这个最小闭环彻底跑透再逐渐扩展。FTPA里α的扫描、SIC的逐层相消、蒙特卡洛次数的平衡这些细节亲手调过一遍远比看十篇综述更能建立直觉。这套代码和录像能帮你把路走直但最终能跑多远还是得靠你自己的实验设计来回答。本文还有配套的精品资源点击获取
返回列表