简介:这份资源面向无线通信方向的学生、研究人员与工程师,聚焦非正交多址接入(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(f"OFDMA 近用户速率: {rate_near_ofdma:.4f} bps/Hz") print(f"OFDMA 远用户速率: {rate_far_ofdma:.4f} bps/Hz") print(f"OFDMA 和速率: {rate_near_ofdma + rate_far_ofdma:.4f} bps/Hz") print(f"NOMA 近用户速率: {rate_near_noma:.4f} bps/Hz") print(f"NOMA 远用户速率: {rate_far_noma:.4f} bps/Hz") print(f"NOMA 和速率: {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(f"alpha_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|^2,beta取 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 一旦不完美,远用户的实际速率会掉。所以我会画三张图:和速率对比、远用户速率对比、公平性指数对比。公平性指数用 Jain's fairness index,公式是(sum(R_k))^2 / (N * sum(R_k^2)),值越接近 1 越公平。
def jains_fairness(rates): """计算 Jain's 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(f"OFDMA 公平性指数: {jains_fairness(rates_ofdma):.4f}") print(f"NOMA 公平性指数: {jains_fairness(rates_noma):.4f}")这个公平性指数会告诉你一个反直觉的事:NOMA 在和速率占优时,公平性可能反而比 OFDMA 差,因为近用户速率被远用户干扰压得很低。如果你只报和速率,等于只说了半个故事。另一个进阶技巧是做 SNR 扫描时同时扫用户距离比,画一张二维热力图,横轴 SNR、纵轴距离比、颜色表示 NOMA 相对 OFDMA 的增益。这张图能直接看出 NOMA 在哪个区域值得用、哪个区域不值得用,比单条曲线有说服力得多。
最后说个血泪教训:我早期跑对比仿真时,为了图快把蒙特卡洛次数设成 50,结果曲线交叉点每次跑都不一样,被导师问“你这个交叉点是随机的吗”,当场翻车。后来老老实实跑到 5000 次,交叉点稳定了,结论才敢写进报告。所以别省那点计算时间,仿真里的后悔药就是多跑几次。希望帮到你。
本文还有配套的精品资源,点击获取