简介本资源是一套面向通信工程专业学生、5G算法研究者及MATLAB仿真实践者的NOMA用户配对完整仿真方案聚焦5G网络中非正交多址接入的关键技术难点——如何在功率域复用场景下实现高效、公平的强弱用户配对。压缩包共15个文件含7个核心MATLAB脚本如2/4/8用户配对仿真、FTPC功率分配实现、5份权威PDF文献涵盖NOMA综述、最优配对公平性研究及VTC教程以及3张原理示意图NOMA vs OMA对比、两种配对方案结构图总大小27.11MB代码模块化、文献体系化、图表直观化便于理论学习与代码复现同步推进。已有236人学习下载读者可直接运行.m文件复现信道建模、强弱分类、贪婪配对、SIC解码及BER/吞吐量评估全流程并结合PDF深入理解算法设计依据与性能边界是开展5G NOMA课题研究或课程设计的高实用性入门套件。1. 为什么在5G网络仿真里NOMA用户配对不能靠“随机凑对”或“距离最近”——MATLAB实现必须直面信道异构性与SIC残余干扰在某高校通信实验室的5G物理层仿真项目中一位A同学最初用MATLAB写NOMA系统时直接把用户按路径损耗排序后两两配对最强信号用户和最弱信号用户一组。结果BER曲线在SNR15dB时突然跳变误码率比OFDMA还高3个数量级。后来发现问题不在编码或调制而在于配对逻辑本身——它完全忽略了多径衰落的瞬时相关性、用户间信道增益比α₁/α₂的动态边界以及最关键的接收端串行干扰消除SIC失败后残留的干扰功率会随配对策略指数级放大。这不是参数调优能解决的玄学问题而是配对决策必须嵌入信道状态信息CSI反馈闭环的硬约束。本文聚焦MATLAB环境下可复现、可验证、可嵌入完整链路的NOMA用户配对方案覆盖从信道建模、配对准则设计、SIC可行性预判到MATLAB函数封装的全链路。适合正在做5G NR物理层仿真的工程师、研究生以及需要将NOMA模块集成进更大规模网络仿真平台的开发者。你不需要懂3GPP协议细节但需熟悉MATLAB基础矩阵运算和通信工具箱常用函数。2. 构建符合3GPP TR 38.901的5G信道模型先让配对有据可依再谈算法NOMA用户配对不是数学游戏它的输入必须是真实反映5G部署场景的信道响应。随便生成两列高斯白噪声当信道系数后续所有配对结果都是空中楼阁。我们采用分步构建法在MATLAB中落地TR 38.901定义的UMiUrban Microcell场景重点控制三个可验证维度大尺度衰落LSF、小尺度衰落SSF和空间相关性。2.1 大尺度衰落建模路径损耗阴影衰落必须解耦路径损耗决定用户平均接收功率层级是配对的底层锚点阴影衰落则引入慢变随机性影响配对稳定性。MATLAB中不推荐直接用raylrnd或lognrnd拼接而应严格按TR 38.901公式分层生成% 参数设定UMi场景载波频率2.6GHz基站天线高度25m用户高度1.5m fc 2.6e9; % 载波频率 h_BS 25; h_UT 1.5; d2d rand(1, N_users) * 100 10; % 用户到基站距离10~110米 % 路径损耗PLdB按UMi LOS/NLOS混合模型 PL_LOS 32.4 21*log10(d2d) 20*log10(fc/1e9); PL_NLOS 38.4 27.4*log10(d2d) 20*log10(fc/1e9); % LOS概率按TR 38.901 Table 7.4.1-1计算 P_LOS min(18/d2d, 1) .* (1 - exp(-d2d/36)) exp(-d2d/36); is_LOS rand(1, N_users) P_LOS; PL_dB is_LOS .* PL_LOS (~is_LOS) .* PL_NLOS; % 阴影衰落LOS为4dB标准差NLOS为6dB服从对数正态分布 sigma_shadow is_LOS * 4 (~is_LOS) * 6; shadow_dB sigma_shadow .* randn(1, N_users); % 最终大尺度衰落系数线性域用于后续小尺度乘积 LSF_linear 10.^(-(PL_dB shadow_dB)/10);逻辑说明这段代码输出LSF_linear是1×N_users向量每个元素代表该用户的大尺度衰落增益0~1之间。关键点在于①P_LOS计算必须用min(18/d2d, 1)而非简单阈值否则近距用户NLOS概率反超LOS② 阴影衰落标准差必须按LOS/NLOS区分混用会导致配对结果在城区密集部署下严重失真③ 所有dB值转换必须用10.^(-x/10)用exp(-x/10)是典型翻车操作。2.2 小尺度衰落建模用Clustered Delay LineCDL模型生成空间相关信道TR 38.901要求小尺度衰落必须体现多径簇Cluster结构和角度扩展AS。MATLAB通信工具箱nrCDLChannel虽支持但其输出为复数时域响应不利于后续配对计算。我们改用参数化建模手动构造CDL核心参数并生成信道冲激响应% CDL-B模型参数UMi中等延迟扩展 numClusters 12; clusterPowers_dB [-1.0, -1.5, -2.5, -3.0, -3.5, -4.0, ... -4.5, -5.0, -5.5, -6.0, -6.5, -7.0]; % 各簇功率 clusterDelays_ns [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330]; AS_deg 10; % 角度扩展10度 % 为每个用户生成独立但空间相关的信道响应 H_SS zeros(N_users, 12); % 每行一个用户每列一个簇 for u 1:N_users % 每簇内生成多个子径模拟角度扩展 for c 1:numClusters % 子径数按AS和天线阵列配置确定此处简化为每簇3径 for s 1:3 % 子径相位服从均匀分布幅度服从瑞利 phase 2*pi*rand; amp sqrt(-log(rand)); % 瑞利包络 % 加权叠加到该簇延迟位置单位ns → 样本索引 delay_idx round(clusterDelays_ns(c) / (1e9 * Ts)); H_SS(u, c) H_SS(u, c) amp * exp(1j*phase); end % 施加簇功率权重 H_SS(u, c) H_SS(u, c) * 10^(clusterPowers_dB(c)/20); end end % 合并大尺度与小尺度H_total LSF_linear * H_SS注意转置 H_total diag(LSF_linear) * H_SS; % N_users × 12 矩阵参数说明H_total是N_users行、12列的复数矩阵每行代表一个用户的12簇信道响应。关键设计意图①diag(LSF_linear)确保大尺度衰落与小尺度衰落解耦避免因路径损耗主导导致弱用户信道被错误放大② 每簇内多子径模拟角度扩展比单径瑞利模型更贴近实测MIMO信道③Ts为采样周期需与系统带宽匹配如100MHz带宽对应Ts10ns此处需根据实际仿真设置。此模型输出可直接用于计算用户间信道增益比是配对算法的唯一可信输入源。3. NOMA用户配对三大主流准则从理论推导到MATLAB函数封装配对不是选美是优化。所有准则本质都在平衡两个矛盾目标最大化用户间信道增益差异利于SIC分离同时保障弱用户最低信干噪比SINR门限。我们对比三种工业界与学术界均验证有效的准则并给出MATLAB可直接调用的函数。3.1 增益差最大化准则Gain Difference Maximization, GDM最直观的准则配对用户i和j使|α_i - α_j|最大。但需注意α是归一化功率系数非原始信道增益。MATLAB实现必须先完成功率归一化function [pairs, gain_diffs] gdm_pairing(H_total, N_pairs) % 输入H_total - N_users × N_clusters 复数信道矩阵 % 输出pairs - N_pairs × 2 矩阵每行一个配对用户索引gain_diffs - 对应增益差 N_users size(H_total, 1); % 计算每个用户的等效信道增益考虑所有簇取模平方和 channel_gains sum(abs(H_total).^2, 2); % N_users × 1 % 归一化使所有用户增益和为1模拟功率分配约束 alpha channel_gains / sum(channel_gains); % 生成所有可能配对组合避免重复ij [ui, uj] meshgrid(1:N_users, 1:N_users); valid_pairs ui uj; pair_indices [ui(valid_pairs), uj(valid_pairs)]; % 所有ij组合 % 计算每对的增益差绝对值 diffs abs(alpha(pair_indices(:,1)) - alpha(pair_indices(:,2))); % 取前N_pairs个最大差值的配对 [~, idx_sorted] sort(diffs, descend); pairs pair_indices(idx_sorted(1:N_pairs), :); gain_diffs diffs(idx_sorted(1:N_pairs)); end逻辑说明该函数返回pairs为整数索引矩阵例如[3,7; 1,9]表示第3与第7用户配对、第1与第9用户配对。关键点①channel_gains必须用sum(abs(H_total).^2, 2)计算总功率而非只取第一簇或最大值② 归一化alpha是配对前提否则强用户天然压制弱用户配对失去意义③meshgrid生成全组合后筛选ij避免(i,j)与(j,i)重复计算提升效率。3.2 SINR可行域准则SINR Feasibility Region, SFRGDM只看差异不保底线。SFR准则强制要求配对后弱用户经SIC解调后的SINR必须≥γ_min如0dB。这需要预估SIC性能。MATLAB中采用经典SIC残余干扰模型function [pairs_sfr, feasible_flags] sfr_pairing(H_total, gamma_min_dB, N_pairs) N_users size(H_total, 1); channel_gains sum(abs(H_total).^2, 2); alpha channel_gains / sum(channel_gains); gamma_min 10^(gamma_min_dB/10); % 转换为线性 % 预设SIC成功率模型残余干扰功率 β * 强用户功率β为SIC不完美因子 beta 0.05; % 典型值5%残余干扰 pairs_sfr []; feasible_flags false(N_pairs, 1); count 0; % 按alpha降序排列用户强→弱 [~, idx_sorted] sort(alpha, descend); users_sorted idx_sorted; % 贪心配对最强用户与满足SINR约束的最弱用户配对 for i 1:2:N_users-1 % 步长为2避免单用户剩余 if count N_pairs, break; end strong_idx users_sorted(i); weak_idx users_sorted(i1); % 计算弱用户SINR分子弱用户功率分母强用户残余干扰噪声 sinr_weak alpha(weak_idx) / (beta * alpha(strong_idx) 1e-6); % 1e-6防零除 if sinr_weak gamma_min count count 1; pairs_sfr(count, :) [strong_idx, weak_idx]; feasible_flags(count) true; end end % 若未满N_pairs补充其他可行配对 if count N_pairs % 遍历剩余组合找可行解 [ui, uj] meshgrid(1:N_users, 1:N_users); valid ui uj; all_pairs [ui(valid), uj(valid)]; for p 1:size(all_pairs,1) if count N_pairs, break; end i1 all_pairs(p,1); i2 all_pairs(p,2); % 判定谁强谁弱 if alpha(i1) alpha(i2) strong i1; weak i2; else strong i2; weak i1; end sinr_weak alpha(weak) / (beta * alpha(strong) 1e-6); if sinr_weak gamma_min ~ismember([strong,weak], pairs_sfr, rows) count count 1; pairs_sfr(count, :) [strong, weak]; feasible_flags(count) true; end end end end参数说明beta0.05是SIC硬件性能的关键表征实际中需根据ADC位数、均衡器复杂度标定。若仿真目标是评估SIC算法本身beta应作为变量扫描若评估配对策略则固定为典型值。gamma_min_dB建议设为0~3dB过低导致配对过于宽松过高则无解。4. 配对后必须做的三件事SIC顺序校验、功率分配验证、误码率基线测试配对完成不等于任务结束。很多MATLAB仿真在此处翻车配对函数返回了结果但后续链路直接套用理想功率分配导致BER曲线完全失真。以下是必须串联执行的验证步骤。4.1 SIC解调顺序自动判定谁先解、谁后解由信道增益说了算NOMA接收端必须按信道增益从强到弱顺序SIC。配对函数只给出用户ID不指定解调顺序。MATLAB中需实时判定function sic_order determine_sic_order(pairs, alpha) % 输入pairs - K×2配对矩阵alpha - N_users×1归一化增益向量 K size(pairs, 1); sic_order zeros(K, 2); for k 1:K u1 pairs(k,1); u2 pairs(k,2); if alpha(u1) alpha(u2) sic_order(k,:) [u1, u2]; % 第一列为强用户第二列为弱用户 else sic_order(k,:) [u2, u1]; end end end % 调用示例 % alpha sum(abs(H_total).^2, 2) / sum(sum(abs(H_total).^2, 2)); % sic_seq determine_sic_order(pairs, alpha);逻辑说明sic_order每行形如[strong_user_id, weak_user_id]这是后续功率分配和BER计算的强制输入。若忽略此步直接假设配对中第一个ID为强用户当用户信道发生快衰落时SIC顺序错误将导致弱用户解调完全失败BER飙升。4.2 功率分配必须与配对联动基于注水法的MATLAB实现配对后同一资源块RB上两个用户的功率不能随意分配。需满足① 总功率守恒② 弱用户SINR达标③ 强用户自身SINR足够解调。我们采用改进注水法在MATLAB中求解最优功率分配function [p_strong, p_weak] water_filling_power(pairs, alpha, sic_order, gamma_min, P_total) % 输入sic_order已按强→弱排序gamma_min为弱用户SINR门限P_total为RB总功率 K size(pairs, 1); p_strong zeros(K, 1); p_weak zeros(K, 1); for k 1:K u_s sic_order(k,1); u_w sic_order(k,2); a_s alpha(u_s); a_w alpha(u_w); % 注水法求解p_w需满足 a_w * p_w / (a_s * p_s N0) gamma_min % 且 p_s p_w P_total/K 均分RB总功率 p_rb P_total / K; % 解不等式p_w gamma_min * (a_s * (p_rb - p_w) N0) / a_w % 整理得p_w * (a_w gamma_min * a_s) gamma_min * a_s * p_rb gamma_min * N0 % 设N0 1归一化噪声功率 N0 1; denominator a_w gamma_min * a_s; numerator gamma_min * a_s * p_rb gamma_min * N0; p_weak(k) max(0, numerator / denominator); p_weak(k) min(p_weak(k), p_rb); % 不超过RB功率 p_strong(k) p_rb - p_weak(k); end end参数说明P_total是整个系统带宽总发射功率P_total/K是每个配对占用的RB功率。N01是归一化处理实际仿真中需根据噪声系数、带宽计算真实N0如N0 10^(-174/10) * BW。此函数输出p_strong和p_weak是K×1向量直接驱动后续QAM调制与叠加。5. 避坑指南NOMA用户配对在MATLAB中五个血泪经验总结配对看似简单实则处处是坑。以下五条均来自某跨平台系统联调中的真实故障每一条都曾导致整周仿真停滞。5.1 现象配对结果每次运行都不一样且BER波动极大原因信道建模中使用了未固定的随机种子。rand、randn、randperm等函数在每次MATLAB会话中产生不同序列导致信道矩阵、配对组合、甚至SIC顺序全随机。解决在脚本开头统一设置种子且对不同随机源分别设种rng(42, twister); % 主随机流 channels_rng RandStream(mt19937ar,Seed,12345); % 信道专用流 RandStream.setGlobalStream(channels_rng);5.2 现象SIC解调后弱用户BER为1强用户正常原因配对函数返回的用户索引未与sic_order函数输入的alpha向量对齐。常见错误是alpha基于旧信道矩阵计算而配对基于新信道或alpha未归一化。解决强制在配对前重新计算alpha并用assert校验alpha sum(abs(H_total).^2, 2); alpha alpha / sum(alpha); assert(all(alpha 0 alpha 1), Alpha not normalized or invalid!);5.3 现象增加用户数后配对函数报错Out of memory原因meshgrid生成全组合时内存爆炸。N100用户时组合数达4950尚可接受N1000时达5e5meshgrid直接崩溃。解决改用迭代法不生成全矩阵% 替代方案随机采样1000个组合而非全部 num_samples min(1000, N_users*(N_users-1)/2); sample_pairs zeros(num_samples, 2); for s 1:num_samples sample_pairs(s,:) randperm(N_users, 2); end5.4 现象在UMaUrban Macro场景下配对效果比UMi还差原因UMa场景路径损耗公式与UMi不同含基站天线高度项但代码中未切换模型仍用UMi公式计算PL_dB导致大尺度衰落失真配对依据错误。解决封装场景选择开关严格按TR 38.901 Table 7.4.1-1实现switch scenario case UMi PL_LOS 32.4 21*log10(d2d) 20*log10(fc/1e9); case UMa PL_LOS 32.4 36.7*log10(d2d) 20*log10(fc/1e9) - 13.82*log10(h_BS); end5.5 现象BER曲线在高SNR区出现平台无法突破1e-5原因SIC残余干扰模型beta设为常数但实际中beta随SNR升高而降低高信噪比下SIC更准。固定beta导致高SNR时残余干扰被高估弱用户SINR计算偏保守功率分配过度倾斜。解决将beta设为SNR函数例如beta 0.1 ./ (1 0.05*SNR_lin)并在循环中动态更新。6. 进阶技巧用配对稳定性指标量化算法鲁棒性替代主观“看起来不错”配对算法好不好不能只看某次快照下的BER。真正有价值的评估是看它在信道时变下的稳定性。我们定义一个MATLAB可计算的配对稳定性指标Pairing Stability Index, PSI6.1 PSI定义与MATLAB计算流程PSI衡量同一组用户在连续T个信道快拍中被配对在一起的频率。值越接近1说明配对策略越鲁棒。计算分三步生成T个独立信道快拍用前述CDL模型保持大尺度衰落LSF不变仅刷新小尺度SSF对每个快拍运行配对算法记录所有配对组合统计每对用户共现次数归一化为PSI矩阵。function PSI_matrix compute_psi_stability(H_LSF, T, pairing_func, varargin) % H_LSF: 1×N_users 大尺度衰落向量固定 % T: 快拍数建议T≥50 % pairing_func: 函数句柄如 gdm_pairing N_users length(H_LSF); % 初始化共现计数矩阵 co_occurrence zeros(N_users, N_users); for t 1:T % 仅刷新小尺度衰落 H_SS_t generate_cdl_ss(N_users, 12); % 自定义函数生成新SSF H_total_t diag(H_LSF) * H_SS_t; % 大尺度×新小尺度 % 运行配对 [pairs, ~] pairing_func(H_total_t, floor(N_users/2), varargin{:}); % 更新共现矩阵无向图i-j与j-i同计 for p 1:size(pairs,1) i pairs(p,1); j pairs(p,2); co_occurrence(i,j) co_occurrence(i,j) 1; co_occurrence(j,i) co_occurrence(j,i) 1; end end % PSI_matrix(i,j) 共现次数 / T PSI_matrix co_occurrence / T; end6.2 如何用PSI指导算法选型一张表说清配对准则PSI均值UMi, T100PSI标准差解读GDM0.620.28高差异带来高波动强用户易“跳槽”配对对象SFR0.850.12SINR约束锁定了可行配对集稳定性显著提升基于机器学习的配对LSTM预测0.910.07利用历史信道趋势提前规避不稳定组合实践建议在项目初期用PSI快速筛掉不稳定的配对方案。例如若某准则PSI均值0.7即使单次BER漂亮也应放弃——它在真实时变信道中大概率失效。我一般会在最终报告中附上PSI热力图横纵轴为用户ID颜色深浅表示共现频率比一堆BER曲线更有说服力。希望帮到你。本文还有配套的精品资源点击获取