ARTICLE DETAIL

资讯详情

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

5G NOMA用户配对MATLAB仿真:从原理到避坑指南

5G NOMA用户配对MATLAB仿真:从原理到避坑指南 简介这份资源聚焦5G网络中NOMA非正交多址接入的用户配对问题面向通信工程专业学生、无线通信研究者及需要做链路级仿真的工程师。内容围绕功率域复用下的强弱用户配对策略展开涵盖信道状态信息获取、用户分类、配对算法设计、功率分配以及基于SIC的信号解码与性能评估等关键环节适合具备一定MATLAB基础、希望深入理解NOMA机制并动手复现仿真的读者。资源包共15个文件包含7个m脚本、5个pdf文献和3张png示意图压缩包约27.11MB脚本覆盖2用户、4用户、8用户及12用户分组等多种配对仿真场景pdf则提供NOMA与5G综述、速率公平性配对等理论支撑图片用于直观对比NOMA与OMA方案。目前已有236人学习下载。借助这些代码与文献读者可快速搭建仿真环境对比不同配对与功率分配策略在误码率、吞吐量和公平性上的表现并在此基础上调整参数、验证新算法为课程设计或科研入门提供可复用的参考。1. 从一次链路仿真翻车说起NOMA 用户配对到底在配什么做 5G 链路级仿真的人多半在 MATLAB 里搭过这样一个场景一个基站若干用户功率域非正交多址NOMA把两个甚至更多用户叠在同一时频资源上靠功率差异和串行干扰消除SIC在接收端分开。听起来很美频谱效率翻倍。可真正跑起来误码率曲线经常比正交多址OMA还难看这时候问题往往不在调制编码而在用户配对——谁和谁叠在一起直接决定 SIC 能不能解出来。NOMA 用户配对要解决的核心问题就一句话在候选用户集合里按什么规则两两或多用户组合让叠加后的和速率最大、同时保证弱用户不被强用户彻底淹没。它牵扯到信道增益排序、功率分配、SIC 解码顺序三件事任何一件没对齐仿真就翻车。这篇笔记面向正在用 MATLAB 做 5G NOMA 链路仿真、想跑通配对策略并看到增益的工程师和学生从配对准则讲到可复现的代码再到那些让人抓狂的坑。2. NOMA 配对的信道增益排序与功率分配原理2.1 为什么配对前必须先给用户排个序功率域 NOMA 的物理基础是同一资源块上多个用户的信号按不同功率叠加发射接收端按功率从大到小依次解码先解强用户把它重构出来减掉再解弱用户。这里有个容易被忽略的前提——功率大小和信道增益是反着来的。信道条件差的用户弱用户离基站远、路损大需要分配更大功率才能保证它解调时信干噪比够用信道条件好的用户强用户分配小功率因为它本身增益高小功率也能解出来。所以配对的第一步永远是计算每个用户的等效信道增益然后排序。常见做法是用大尺度衰落加小尺度衰落的合成增益% 假设 N 个用户基站到用户的距离 d (米)载频 fc (Hz) % 计算路损 (dB)采用 3GPP 城市宏站模型简化式 function g channel_gain(d, fc) % 路损模型: PL 128.1 37.6*log10(d_km) d_km d / 1000; PL_dB 128.1 37.6 * log10(d_km); % 加对数正态阴影衰落标准差 8 dB shadow_dB 8 * randn(size(d)); % 小尺度瑞利衰落功率增益 (指数分布) small_scale exprnd(1, size(d)); % 总增益 10^(-(PLshadow)/10) * 小尺度 g 10.^(-(PL_dB shadow_dB)/10) .* small_scale; end这段代码里128.1 37.6*log10(d_km)是 3GPP 38.901 里城市宏站的经典路损公式d_km是公里数别传成米否则路损直接差 60 dB仿真结果全废。阴影衰落用 8 dB 标准差的对数正态小尺度用指数分布模拟瑞利功率增益。算出来的g越大代表信道越好用户越“强”。排序之后配对策略才有依据。最经典的是远近配对把增益最大的和增益最小的配一对次大的和次小的配一对。这样做的理由是增益差异越大SIC 越容易把两个用户分开和速率也越高。2.2 功率分配配对定了功率怎么切配对确定后下一个问题是给这一对用户分功率。NOMA 里常用的是固定功率分配和分数功率分配。固定分配简单粗暴比如强用户占 20% 功率、弱用户占 80%适合快速验证。分数功率分配则根据信道增益动态调整% 分数功率分配: 弱用户功率占比 alpha % 约束: 强用户功率 p_strong (1-alpha)*P_total % 弱用户功率 p_weak alpha*P_total % alpha 由信道增益比决定 function [p_strong, p_weak] frac_power(g_strong, g_weak, P_total) % 增益比弱用户增益低比值小于 1 ratio g_weak / g_strong; % 分数因子常见取 0.5~0.8越大越偏向弱用户 beta 0.6; alpha ratio^beta; % 限制 alpha 范围避免极端分配 alpha min(max(alpha, 0.5), 0.95); p_weak alpha * P_total; p_strong (1 - alpha) * P_total; endbeta是分数因子控制功率倾斜程度。beta越大弱用户分到的功率越多但强用户可能因为功率太小而解调失败。我一般从 0.6 起步跑几组看和速率曲线再微调。alpha的上下限 0.5 和 0.95 是血泪经验——低于 0.5 弱用户基本没救高于 0.95 强用户直接掉线。功率分配和配对是耦合的换了配对方式最优功率分配也会变。所以仿真时通常固定一种功率分配策略对比不同配对算法这样结论才干净。3. 在 MATLAB 里跑通 NOMA 用户配对的最小仿真3.1 搭一个可复现的单小区链路级仿真框架要验证配对算法不需要一上来就上完整的 5G 工具链。一个最小可用的链路级仿真包含用户位置生成、信道增益计算、配对、功率分配、SIC 接收、和速率统计。下面这个框架我反复用过改改参数就能跑。% NOMA 用户配对最小仿真框架 clear; rng(42); % 固定随机种子保证可复现 N 20; % 用户数 P_total 1; % 总发射功率归一化 noise_power 1e-3; % 噪声功率 fc 3.5e9; % 载频 3.5 GHz % 1. 生成用户位置: 半径 50~500 米均匀分布 r 50 450 * rand(N, 1); theta 2 * pi * rand(N, 1); d r; % 距离 % 2. 计算信道增益 g channel_gain(d, fc); % 3. 按增益排序降序 [g_sorted, idx] sort(g, descend); % 4. 远近配对: 第 i 个和第 N-i1 个配对 pairs zeros(N/2, 2); for i 1:N/2 pairs(i, :) [idx(i), idx(N - i 1)]; end % 5. 对每对做功率分配并计算和速率 sum_rate 0; for i 1:N/2 u1 pairs(i, 1); % 强用户 u2 pairs(i, 2); % 弱用户 [p1, p2] frac_power(g(u1), g(u2), P_total); % 强用户先解把弱用户当干扰 sinr1 p1 * g(u1) / (p2 * g(u1) noise_power); % 弱用户后解强用户已被 SIC 消除 sinr2 p2 * g(u2) / noise_power; r1 log2(1 sinr1); r2 log2(1 sinr2); sum_rate sum_rate r1 r2; end fprintf(远近配对和速率: %.4f bps/Hz\n, sum_rate);这段代码的关键在 SIC 的建模强用户解调时弱用户信号是干扰所以分母有p2*g(u1)弱用户解调时强用户已经被减掉分母只剩噪声。这个顺序不能反反了和速率会算错。rng(42)固定种子是为了让每次跑出来的用户位置一样方便对比不同配对算法。3.2 三种配对策略的对比实现光跑远近配对看不出好坏得有个对照。下面实现三种常见策略直接替换上面的配对部分即可。% 策略一: 随机配对 perm_idx idx(randperm(N)); pairs_rand reshape(perm_idx, 2, []); % 策略二: 远近配对 (前面已实现) % pairs_near_far ... % 策略三: 增益差最大化配对 % 贪心: 每次选增益差最大的一对 remaining idx; pairs_greedy zeros(N/2, 2); for i 1:N/2 best_diff -inf; best_pair [0 0]; for a 1:length(remaining) for b a1:length(remaining) diff abs(g(remaining(a)) - g(remaining(b))); if diff best_diff best_diff diff; best_pair [remaining(a), remaining(b)]; end end end pairs_greedy(i, :) best_pair; remaining(remaining best_pair(1)) []; remaining(remaining best_pair(2)) []; end随机配对是下界用来确认配对确实有用远近配对是经典基线增益差最大化是贪心上界复杂度 O(N^3)用户数少时能用。跑完对比三者和速率通常远近配对能比随机配对高 15%~30%增益差最大化再高几个百分点但复杂度上去了。实际系统里用户数几十上百贪心不现实远近配对是性价比最高的选择。提示对比时务必固定用户位置和信道实现只换配对策略否则随机性会淹没配对带来的差异。4. NOMA 用户配对仿真中的避坑与排查4.1 和速率不升反降先查 SIC 解码顺序现象换了配对策略和速率反而比 OMA 低。原因SIC 解码顺序和功率分配不匹配。强用户分了大功率弱用户分了小功率接收端却先解弱用户干扰爆炸。解决确认功率分配后接收端永远先解功率大的那个用户。在代码里检查sinr1和sinr2的计算强用户的分母必须包含弱用户干扰项。4.2 弱用户误码率始终为 1检查功率下限现象弱用户 BER 曲线贴在 0.5 不动。原因alpha被限幅到 0.5 以下或者信道增益计算时距离单位搞错导致弱用户功率实际小得可怜。解决打印每对用户的p_weak和g_weak确认p_weak * g_weak / noise_power至少大于解调门限QPSK 约 5 dB。距离单位统一用米路损公式里再转公里。4.3 每次跑结果都不一样随机种子没固定现象同一套参数两次运行和速率差 20%。原因rand和randn没固定种子用户位置和衰落每次都在变。解决仿真开头加rng(42)对比算法时只改配对逻辑其他随机量全部冻结。如果要做蒙特卡洛就固定种子后循环多次取平均而不是每次换种子。4.4 用户数为奇数时配对数组越界现象N21时报索引超出矩阵维度。原因远近配对假设用户数偶数N/2不是整数。解决奇数时丢弃增益最差的那个用户或者让它单独走 OMA。代码里加N N - mod(N, 2)先规整。4.5 和速率量纲混乱bps/Hz 和 bps 混用现象和速率数值大得离谱或小得离谱。原因log2(1sinr)出来的是 bps/Hz如果又乘了带宽量纲就重复了。解决统一用 bps/Hz 做算法对比最后需要绝对速率时再乘带宽。噪声功率归一化后P_total1对应的是功率比不是瓦特。5. 把配对从两用户推到多用户与动态场景两用户配对跑通后真正的挑战是多用户 NOMA 和动态配对。多用户场景下一个资源块叠三个以上用户SIC 要逐级消除配对组合数从 C(N,2) 变成 C(N,K)穷举不现实。我一般用分组配对先按增益分成强、中、弱三组每组取一个组成一个 NOMA 簇簇内按增益降序做 SIC。这样复杂度降到 O(N)和速率损失可控。动态场景则要考虑用户移动带来的增益变化。配对不是一帧定终身每隔几个时隙要重配。重配太频繁信令开销大太慢配对失配。我的习惯是每 10 个时隙重配一次用滑动窗口平均增益代替瞬时增益避免快衰落导致配对抖动。验证配对算法是否真的有效别只看和速率一条曲线。我通常同时看三个指标和速率整体效率、弱用户中断概率公平性、SIC 残留误差实现可行性。三者一起看才能判断一个配对策略是不是既快又稳。下面这张表是我对比几种策略时的记录模板配对策略和速率 (bps/Hz)弱用户中断率复杂度随机配对3.20.18O(N)远近配对4.10.06O(N log N)增益差贪心4.40.04O(N^3)分组配对3.90.07O(N)从表里能看出远近配对在效率和复杂度之间平衡最好分组配对适合用户数大的场景。贪心虽然和速率最高但 N100 时根本跑不动。最后一个具体技巧调试配对算法时先把噪声设成极小比如 1e-6让系统进入干扰受限区这时候配对好坏差异最明显。等配对逻辑验证无误再把噪声调回正常值看实际性能。这个习惯帮我省了无数次在噪声里捞信号的功夫。做仿真别急着要漂亮曲线先把每个中间变量打印出来核对配对这种事错一个索引整条曲线都是玄学。希望帮到你。本文还有配套的精品资源点击获取
返回列表