NOMA与OFDMA仿真对比:功率分配、用户配对与SIC接收机调参指南
发布时间:2026/10/22 3:13:18 锦皓数字建站

简介这份资源面向无线通信方向的学生、研究人员与工程师聚焦非正交多址接入NOMA与正交频分多址OFDMA两种多址技术的对比分析帮助读者理解二者在频谱效率、资源分配、多用户调度与干扰管理上的差异适用于5G及未来通信系统的学习与仿真验证。压缩包共18个文件约147KB以MATLAB脚本.m为主辅以PNG与FIG图形文件及MAT文件涵盖NOMA与OFDMA的编解码、OFDM收发端处理、数据生成、Turbo编解码以及误码率曲线绘制等模块并包含BPSK、4PSK、8PSK不同调制方式下的性能对比图。已有266人学习下载。通过运行与研读这些脚本读者可复现NOMA与OFDMA的BER性能对比实验掌握功率分割、多用户检测与子载波分配的实现思路为优化无线通信系统性能提供可参考的仿真框架与排错依据。1. 从一份名为 compare NOMA OFDMA 的仿真包说起它到底在比什么如果你在通信系统仿真或链路级评估的岗位上待过大概率见过类似compare NOMA OFDMA.zip这样的压缩包——名字里塞满了NOMA、OFDMA、NOMA_OFDMA这些关键词一看就是某个研究者把两种多址方案的对比脚本打包扔了出来。它解决的核心问题很具体在同样的信道条件、同样的功率预算、同样的用户分布下NOMA非正交多址和 OFDMA正交频分多址到底谁在吞吐、谁在公平性、谁在边缘用户速率上更占优。适合谁适合正在做多址接入选型、准备写链路级仿真报告、或者被导师要求“把两种方案跑个对比图出来”的工程师和研究生。别急着解压跑脚本先搞清楚它内部在比什么维度否则你拿到的曲线可能连坐标轴含义都说不清。2. 拆开对比包NOMA 与 OFDMA 的仿真模型怎么搭2.1 两种多址方案的数学骨架差异OFDMA 的逻辑很直白把总带宽切成若干正交子载波每个用户分到一组互不重叠的子载波用户之间在频域上井水不犯河水。它的系统容量下限由子载波分配算法决定经典做法是比例公平调度每个子载波只服务一个用户。NOMA 则反着来同一子载波上叠加多个用户的信号靠功率域区分——远用户分大功率近用户分小功率接收端用 SIC串行干扰消除逐层剥离。这里的关键参数是功率分配因子它直接决定谁被先解、谁被当作干扰。仿真包里通常用alpha或power_ratio表示取值一般在 0.1 到 0.5 之间近用户拿小头远用户拿大头。从信息论角度看OFDMA 的每用户速率是B_k * log2(1 SINR_k)其中B_k是该用户分到的带宽。NOMA 的远用户速率是B * log2(1 P_far * |h_far|^2 / (P_near * |h_near|^2 N0))近用户则要先解远用户再解自己。这个差异导致一个反直觉结论在用户信道增益差异大时NOMA 的和速率可能超过 OFDMA但当两个用户信道条件接近时NOMA 的 SIC 增益几乎消失反而因为功率域叠加引入额外干扰而吃亏。仿真包里的对比曲线通常就是扫用户距离差或信道增益差来展示这个转折点。2.2 用 Python 搭一个最小可复现的对比链路下面这段代码不依赖任何特定压缩包直接复现compare NOMA OFDMA的核心对比逻辑。你可以在本地 Python 环境里跑通再对照压缩包里的脚本看差异。import numpy as np # 系统参数 N_subcarriers 64 # 子载波总数 N_users 2 # 用户数先做两用户对比 P_total 1.0 # 总发射功率归一化 N0 1e-3 # 噪声功率谱密度 B 1.0 # 归一化带宽 # 用户信道增益模拟近用户和远用户 # 近用户距离近增益大远用户距离远增益小 h_near 0.8 0.1j h_far 0.2 0.05j # OFDMA均分带宽各占一半子载波 B_near_ofdma B / 2 B_far_ofdma B / 2 sinr_near_ofdma (P_total/2) * abs(h_near)**2 / N0 sinr_far_ofdma (P_total/2) * abs(h_far)**2 / N0 rate_near_ofdma B_near_ofdma * np.log2(1 sinr_near_ofdma) rate_far_ofdma B_far_ofdma * np.log2(1 sinr_far_ofdma) # NOMA功率域叠加远用户分大功率 alpha_far 0.8 # 远用户功率占比 alpha_near 1 - alpha_far # 远用户先解近用户信号视为干扰 sinr_far_noma alpha_far * P_total * abs(h_far)**2 / (alpha_near * P_total * abs(h_near)**2 N0) rate_far_noma B * np.log2(1 sinr_far_noma) # 近用户后解先剥离远用户 sinr_near_noma alpha_near * P_total * abs(h_near)**2 / N0 rate_near_noma B * np.log2(1 sinr_near_noma) print(fOFDMA 近用户速率: {rate_near_ofdma:.4f} bps/Hz) print(fOFDMA 远用户速率: {rate_far_ofdma:.4f} bps/Hz) print(fOFDMA 和速率: {rate_near_ofdma rate_far_ofdma:.4f} bps/Hz) print(fNOMA 近用户速率: {rate_near_noma:.4f} bps/Hz) print(fNOMA 远用户速率: {rate_far_noma:.4f} bps/Hz) print(fNOMA 和速率: {rate_near_noma rate_far_noma:.4f} bps/Hz)这段代码的逻辑说明OFDMA 部分把总功率和总带宽均分各自计算 SINR 后求速率NOMA 部分先按功率因子分配功率远用户解调时把近用户信号当干扰近用户解调时假设远用户已被完美消除。参数说明alpha_far是核心调节旋钮调大到 0.9 会让远用户速率上升但近用户速率骤降调小到 0.5 则两者趋近NOMA 相对 OFDMA 的优势窗口会收窄。h_near和h_far的模值差决定 NOMA 是否值得用——差得越大NOMA 和速率优势越明显。2.3 压缩包里常见的文件结构与运行入口一个典型的compare NOMA OFDMA仿真包解压后通常包含这几类文件主脚本如main_compare.m或compare_run.py、信道生成函数、功率分配函数、SIC 接收机函数、以及画图脚本。运行入口一般是主脚本它按顺序做四件事初始化参数、循环扫描用户距离或功率因子、调用两种多址方案的计算函数、把结果存成.mat或.csv再绘图。你拿到包后先看主脚本里for循环扫的是什么变量那个变量就是对比实验的自变量。常见坑是主脚本里硬编码了用户数或天线数你想改成四用户得同时改三四个地方漏一处就报维度不匹配。3. 参数怎么设功率分配、用户配对与信道模型的调参逻辑3.1 功率分配因子对 NOMA 增益的敏感度分析功率分配是 NOMA 对比实验里最玄学的部分。固定功率因子跑出来的曲线只能说明一个点真正有说服力的是扫出一族曲线。我一般会设alpha_far从 0.5 扫到 0.95步长 0.05每个点跑 1000 次蒙特卡洛取平均。你会看到一条抛物线和速率在某个中间值达到最大然后下降。这个最大值对应的alpha_far就是当前信道条件下的最优功率分配。OFDMA 那边没有这个旋钮它的“功率分配”退化成子载波分配通常用注水算法或等功率分配。对比时要注意如果 OFDMA 用了注水而 NOMA 只用了固定功率那对比不公平结论会被审稿人质疑。# 扫描功率分配因子观察 NOMA 和速率变化 alpha_far_list np.arange(0.5, 0.96, 0.05) sum_rate_noma [] for af in alpha_far_list: an 1 - af sinr_f af * P_total * abs(h_far)**2 / (an * P_total * abs(h_near)**2 N0) sinr_n an * P_total * abs(h_near)**2 / N0 sum_rate_noma.append(B * np.log2(1 sinr_f) B * np.log2(1 sinr_n)) for af, sr in zip(alpha_far_list, sum_rate_noma): print(falpha_far{af:.2f}, NOMA和速率{sr:.4f} bps/Hz)这段扫描代码的输出会告诉你当alpha_far在 0.7 到 0.85 之间时NOMA 和速率通常高于 OFDMA 的均分结果。但注意这是两用户、单天线、理想 SIC 的情况。一旦引入 SIC 残余误差近用户速率会掉最优alpha_far会往小偏移。3.2 用户配对策略谁和谁配成一对NOMA 的核心优势来自用户信道增益差所以配对策略直接决定性能上限。常见做法有三种随机配对、远近配对、基于信道增益排序的贪心配对。随机配对最省事但增益不稳定远近配对把增益最大和最小的用户绑一起SIC 增益最大贪心配对则遍历所有组合选和速率最高的那一对。仿真包里如果只做了随机配对你跑出来的 NOMA 曲线可能还不如 OFDMA这不是 NOMA 不行是配对没选好。我一般会在对比脚本里加一个配对策略的开关跑三组曲线放同一张图里这样结论才站得住。3.3 信道模型选择瑞利、莱斯还是几何信道对比实验里信道模型的选择经常被忽略但它对结论影响巨大。瑞利信道假设没有直射径适合散射丰富的城区莱斯信道有直射径适合视距场景。如果仿真包用的是瑞利但你的实际场景有视距NOMA 的增益会被高估。更细一点的做法是用几何信道模型把用户坐标、路径损耗、阴影衰落都建进去这样跑出来的用户增益差更接近真实。参数上路径损耗指数一般取 3.0 到 4.0阴影标准差取 6 到 8 dB。这些值改了之后NOMA 和 OFDMA 的交叉点会移动所以写报告时一定要注明信道模型参数。4. 避坑与排查跑对比仿真时最容易翻车的五个地方4.1 现象NOMA 曲线在低 SNR 段反而低于 OFDMA原因低 SNR 时噪声主导NOMA 的功率域叠加让近用户承受了远用户的干扰而 OFDMA 的正交性避免了这种干扰。解决这是正常现象不是代码 bug。对比时应该关注中高 SNR 段或者在低 SNR 段切换回 OFDMA 做自适应多址。如果你在论文里只放低 SNR 曲线审稿人会说你在挑数据。4.2 现象SIC 完美消除假设导致近用户速率虚高原因仿真里通常写sinr_near alpha_near * P * |h_near|^2 / N0分母里没有远用户残余。实际 SIC 有误差传播残余干扰可能占 5% 到 15%。解决在近用户 SINR 分母里加一项beta * alpha_far * P * |h_far|^2beta取 0.05 到 0.15 模拟残余。加了之后你会发现 NOMA 的优势窗口变窄但结论更可信。4.3 现象OFDMA 子载波分配用了穷举导致跑一次要几小时原因子载波分配是组合优化问题穷举复杂度随子载波数和用户数指数增长。解决换成比例公平调度或注水算法复杂度降到多项式级。仿真对比不需要全局最优只需要一个合理的基准。我一般用比例公平它在吞吐和公平性之间平衡得不错跑起来也快。4.4 现象蒙特卡洛次数太少导致曲线毛刺严重原因信道随机生成100 次 realization 的方差很大曲线看起来像锯齿。解决至少跑 1000 次最好 5000 次。如果嫌慢可以用并行计算把每次 realization 分到不同 CPU 核上。Python 里用multiprocessing池MATLAB 里用parfor。跑之前先跑 100 次看看趋势确认代码没大错再上量。4.5 现象压缩包里的脚本路径写死换台机器就报错原因作者用了绝对路径加载数据或保存图片。解决把所有路径改成相对路径或者用os.path.dirname(__file__)动态获取脚本所在目录。另外注意 MATLAB 和 Python 的路径分隔符差异Windows 用反斜杠Linux 用正斜杠跨平台时统一用os.path.join。5. 从对比曲线到可复现结论一个进阶技巧跑完对比仿真你手里会有一堆曲线但怎么从曲线里提炼出可复现、可引用的结论才是区分老手和新手的地方。我的习惯是不只看和速率还要看边缘用户速率和公平性指数。NOMA 经常在和速率上赢 OFDMA但在边缘用户速率上输——因为远用户虽然分了大功率但近用户的干扰还在SIC 一旦不完美远用户的实际速率会掉。所以我会画三张图和速率对比、远用户速率对比、公平性指数对比。公平性指数用 Jains fairness index公式是(sum(R_k))^2 / (N * sum(R_k^2))值越接近 1 越公平。def jains_fairness(rates): 计算 Jains fairness index rates np.array(rates) return (np.sum(rates)**2) / (len(rates) * np.sum(rates**2)) # 对比两种方案在远用户速率上的公平性 rates_ofdma [rate_near_ofdma, rate_far_ofdma] rates_noma [rate_near_noma, rate_far_noma] print(fOFDMA 公平性指数: {jains_fairness(rates_ofdma):.4f}) print(fNOMA 公平性指数: {jains_fairness(rates_noma):.4f})这个公平性指数会告诉你一个反直觉的事NOMA 在和速率占优时公平性可能反而比 OFDMA 差因为近用户速率被远用户干扰压得很低。如果你只报和速率等于只说了半个故事。另一个进阶技巧是做 SNR 扫描时同时扫用户距离比画一张二维热力图横轴 SNR、纵轴距离比、颜色表示 NOMA 相对 OFDMA 的增益。这张图能直接看出 NOMA 在哪个区域值得用、哪个区域不值得用比单条曲线有说服力得多。最后说个血泪教训我早期跑对比仿真时为了图快把蒙特卡洛次数设成 50结果曲线交叉点每次跑都不一样被导师问“你这个交叉点是随机的吗”当场翻车。后来老老实实跑到 5000 次交叉点稳定了结论才敢写进报告。所以别省那点计算时间仿真里的后悔药就是多跑几次。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。