2026/9/15 0:56:39

功率域NOMA与OFDMA对比:原理、MATLAB仿真与参数调优

功率域NOMA与OFDMA对比:原理、MATLAB仿真与参数调优 简介面向5G/无线通信研究者与通信工程学生针对非正交多址接入NOMA与正交频分多址OFDMA的对比仿真资源。压缩包完整实现两种多址技术的收发流程包含二进制相移键控、四相移键控、八相移键控不同调制方式下的性能测试通过误码率曲线直观比较二者在抗噪声干扰与频谱效率方面的差异。资源共18个文件以m脚本为核心覆盖编码、解码、数据生成、发射机处理等环节辅以fig与png格式的仿真结果图以及mat格式的误码率数据整体仅147KB轻量易用。已有266人学习下载适合希望快速上手多址技术仿真、验证理论分析或开展课程设计的研究者。借助该代码包可省去从零搭建仿真环境的时间直接观察不同参数设置下的系统表现并基于模块化脚本调整算法加深对NOMA功率分配、OFDMA子载波分配及干扰管理等核心要点的理解。1. compare NOMA OFDMA.zip 到底在比什么compare NOMA OFDMA.zip这个压缩包命名在实验室和工程组里经常见到后半段_NOMA_OFDMA_o像下载工具自动改名留下的尾巴前一半则点明了交付物——把 NOMA 与 OFDMA 放在同一套信道、同一套功率预算下做对比仿真。多数人第一反应是找代码跑一遍看谁强谁弱但对比真正的价值不在“谁赢”而在解释一个反直觉结论OFDMA 用正交隔离消除了用户间干扰NOMA 却故意让用户信号叠加、再用串行干扰消除SIC把它解开结果 NOMA 往往在频谱效率和边缘用户速率上更占优。这篇就把 NOMA 与 OFDMA 的对比怎么做、参数怎么设、zip 包怎么复现讲清楚适合通信仿真工程师、协议栈开发者和做无线接入方向的研究生。2. NOMA 与 OFDMA 的原理差异正交隔离与功率域复用2.1 OFDMA 的“正交”本质是带宽换隔离OFDMA 把可用的子载波分成互不重叠的组每个用户只在自己那一组上发送接收端靠子载波正交性把用户信号分离开用户间干扰理论上为零。问题是频谱是一维资源用户数一多单用户分到的子载波就少峰值速率和吞吐量上限就跟着下来。更实际的是为了保证 OFDMA 还能维持正交需要循环前缀对抗多径、需要子载波间隔对齐、需要调度器在时频格上做资源分配这一整套开销都在消耗频谱效率。从香农公式看正交隔离并没有带来容量惊喜。一个用户单独占用 B 带宽时理论上可以达到 log₂(1SNR)两个用户各占 B/2各自速率只有原来的一半总速率仍是单用户容量。也就是说OFDMA 把多用户接入问题变成了资源切分问题系统总吞吐量并没有因为“接入更多用户”而扩大。这也是 OFDMA 被诟病“子载波浪费”的根因小区边缘用户信道差却和中心用户一样只分到固定配额调度器强行保证公平就会牺牲中心用户吞吐量。2.2 功率域 NOMA叠加发送、SIC 逐层拨开NOMA 换了一条路所有用户共用全部频带信号在功率域叠加然后靠功率差和接收机算法区分用户。发送端先把两个用户的符号按功率比叠加起来近端用户分配较小的功率系数 α远端用户分配较大的 1−α合成信号为x sqrt(α)·s_near sqrt(1−α)·s_far这个叠加式有两个关键点。一是总功率归一化α 与 1−α 相加为 1仿真里不会出现功率越叠越大导致 SNR 对不上的问题。二是功率分配必须偏向远端弱用户否则远端用户被近端信号淹没SIC 第一步就撑不住。接收端用 SIC 把“混在一起”的信号逐层拨开。解码顺序固定为先解功率最大的那一层也就是远端用户解完做硬判决再用信道系数和功率系数把这一层重构出来从接收信号中减掉剩下的信号里只有近端用户和噪声按常规方式解调。远端用户把近端信号当作干扰其信干噪比为SINR_far (1−α)·P·|h_far|² / (α·P·|h_far|² N₀)近端用户完成 SIC 后干扰被扣掉信干噪比主要取决于 α·P·|h_near|²/N₀。对比 OFDMA 每个用户只能占用一半带宽NOMA 让两个用户都吃满带宽总和速率自然有提升空间。2.3 用户配对NOMA 增益的前提NOMA 的增益不是天然存在的它依赖“近-远配对”。通常一个近端强用户配一个远端弱用户二者路径损耗差最好在 8 dB 以上。原因在于 SIC 的第一步“解远端用户”依赖功率差如果两个用户信道质量差不多功率分配拉开又有限远端用户解调时残留的近端干扰会不断抬高误码SIC 一步错后面全错。换句话说NOMA 是用“允许干扰 接收机消除干扰”换取频带利用率代价是接收机复杂度上了一个台阶。对比项OFDMA功率域 NOMA用户资源占用互不重叠的子载波组全部频带共享多用户分离方式频域正交功率差 SIC接收机复杂度匹配滤波 / MMSE多级 SIC随用户数线性增加吞吐量瓶颈受带宽切分限制受功率分配与 SIC 误差传播限制公平性调节手段调度器时频资源分配调整 α 与配对策略典型场景LTE、Wi-Fi5G 海量连接、上行免调度候选3. 用 MATLAB 按 zip 包套路搭最小对比框架3.1 仿真参数先定死后面才好调跑 NOMA 与 OFDMA 对比最怕参数不一致。比如 OFDMA 用 64 子载波、NOMA 用全带宽最后吞吐量差异说不清是方案差异还是参数差异。下面的参数表是最小可复现配置两用户、近远配对、平坦瑞利衰落先跑通再扩展。参数设定值说明用户数2近端用户 远端用户调制方式QPSK平均符号能量归一化为 1功率分配因子 α0.3近端 30%远端 70%路径损耗差10 dB近端 0 dB远端 10 dBSNR 范围0 ~ 20 dB步进 2 dB复高斯白噪声蒙特卡洛符号数1e4每个 SNR 点独立生成路径损耗差 10 dB 是 NOMA 能展示增益的下限。如果设成 5 dB仿真曲线会变得很平容易误判“NOMA 不如 OFDMA”。建议第一次跑就用 10 dB 以上跑通后再往 5 dB 收缩看结论何时反转。3.2 发送端与信道叠加编码和归一化瑞利信道% NOMA/OFDMA 对比仿真发送端与信道 clear; clc; rng(2025); numSym 1e4; % 蒙特卡洛符号数 snrDb 0:2:20; % 信噪比区间 alpha 0.3; % 近端用户功率占比远端为 0.7 plNear 0; % 近端路径损耗dB plFar 10; % 远端路径损耗dB pl 10.^([-plNear -plFar]/20); % QPSK偶位作实部、奇位作虚部符号能量归一化为 1 bitsToSym (b) (1-2*b(1:2:end))/sqrt(2) ... 1j*(1-2*b(2:2:end))/sqrt(2); % 发送端构造两个用户各一组随机符号NOMA 叠加成一路 bitsNear randi([0 1], numSym, 1); bitsFar randi([0 1], numSym, 1); symNear bitsToSym(bitsNear); % 近端用户符号 symFar bitsToSym(bitsFar); % 远端用户符号 xNoma sqrt(alpha)*symNear sqrt(1-alpha)*symFar; % 瑞利平坦衰落信道近端强、远端弱 hNear pl(1)*(randn(numSym,1)1j*randn(numSym,1))/sqrt(2); hFar pl(2)*(randn(numSym,1)1j*randn(numSym,1))/sqrt(2);发送端逻辑说明bitsToSym函数的写法把随机比特流的奇数位映射到实部、偶数位映射到虚部符号能量恒为 1。这样xNoma的总功率等于 α (1−α) 1交叉项在统计平均下为 0发射信噪比的定义不会乱。信道使用两个独立瑞利衰落向量pl数组把近端信道幅度保持在 1远端信道幅度衰减到约 0.316对应功率差 10 dB。3.3 接收端远端直解、近端 SIC、OFDMA 无干扰解调constQPSK [(11j) (1-1j) (-11j) (-1-1j)]/sqrt(2); berNomaNear zeros(size(snrDb)); berNomaFar zeros(size(snrDb)); berOfdma zeros(size(snrDb)); rateNoma zeros(size(snrDb)); rateOfdma zeros(size(snrDb)); for k 1:length(snrDb) no 10^(-snrDb(k)/10); nNear sqrt(no/2)*(randn(numSym,1)1j*randn(numSym,1)); nFar sqrt(no/2)*(randn(numSym,1)1j*randn(numSym,1)); % NOMA 远端用户先把近端信号当噪声直接最小欧氏距离判决 yFarAll hFar .* xNoma nFar; distFar abs(yFarAll./hFar - sqrt(1-alpha)*constQPSK); [~, idxFarDec] min(distFar, [], 2); % NOMA 近端用户 SIC重构远端正交信号并从接收信号中扣除 symFarDec constQPSK(idxFarDec); yNearAll hNear .* xNoma nNear; ySic yNearAll - hNear .* sqrt(1-alpha) .* symFarDec; yNear ySic ./ (hNear .* sqrt(alpha)); distNear abs(yNear - constQPSK); [~, idxNearDec] min(distNear, [], 2); % OFDMA 接收两用户各自无干扰解调各占一半带宽 yOfdmaNear hNear .* symNear nNear; yOfdmaFar hFar .* symFar nFar; [~, idxOfdmaNear] min(abs(yOfdmaNear./hNear - constQPSK), [], 2); [~, idxOfdmaFar] min(abs(yOfdmaFar./hFar - constQPSK), [], 2); % 符号错误率统计 [~, idxNearTx] min(abs(symNear - constQPSK), [], 2); [~, idxFarTx] min(abs(symFar - constQPSK), [], 2); berNomaNear(k) mean(idxNearTx ~ idxNearDec); berNomaFar(k) mean(idxFarTx ~ idxFarDec); berOfdma(k) (mean(idxNearTx ~ idxOfdmaNear) ... mean(idxFarTx ~ idxOfdmaFar)) / 2; end接收端逻辑说明远端用户判决的是sqrt(1-alpha)*constQPSK这个星座幅度被功率系数缩放不能拿原始 QPSK 星座点去比。近端用户的 SIC 是把远端判决结果乘回hNear * sqrt(1-alpha)再相减这里用的是近端自己的信道系数因为远端信号到达近端接收机时经历的就是近端信道。OFDMA 参考链路完全不叠加用户信号理想状态下 BER 会低于 NOMA这是正常的NOMA 的收益在频谱效率而不在误码率。3.4 频谱效率计算把带宽差异写进公式% 频谱效率NOMA 全频带OFDMA 每用户只占一半带宽 sinrFar ((1-alpha)*abs(hFar).^2) ./ ... (alpha*abs(hFar).^2 no); sinrNear (alpha*abs(hNear).^2) ./ no; % 理想 SIC无残余干扰 rateNoma(k) mean(log2(1sinrFar) log2(1sinrNear)); rateOfdma(k) mean(0.5*log2(1 abs(hNear).^2/no) ... 0.5*log2(1 abs(hFar).^2/no)); endrateOfdma里每个用户前乘的 0.5 就是正交带宽减半的代价。NOMA 不开这一项两个用户都按完整带宽计算容量这才是 NOMA 相对 OFDMA 吞吐量占优的核心来源。这里sinrNear用了理想 SIC 假设实际硬件通常有 2%~5% 的残余干扰若想更贴近工程可以在sinrNear分母上加一个残差项例如0.03*abs(hNear).^2。4. 仿真结果分析与参数调节alpha、配对和用户数扩展4.1 三种典型现象别急着判“代码 bug”在 α0.3、路径损耗差 10 dB 的配置下SNR10 dB 时 NOMA 双用户总频谱效率大约比 OFDMA 高出 20%~30%近端用户因为分到的功率少BER 略高于 OFDMA 近端远端用户反而因为功率倾斜获得可用的解调门限。会看到三个容易被误读的现象。第一个现象是低 SNR 区段0~4 dBNOMA 优势很小甚至被 OFDMA 反超。原因很简单噪声主导时功率分配带来的信干噪比改善被噪声吃掉SIC 第一步的远端判决错误率也高错误传播会让近端跟着遭殃。第二个现象是 OFDMA 的 BER 曲线明显更“漂亮”尤其近端用户。这是正交隔离的天然优势不能拿单条 BER 曲线下结论必须结合频谱效率一起看。第三个现象是 NOMA 近端 BER 曲线在高 SNR 出现平台或抖动这通常是 SIC 传播误差导致的——远端符号一旦判错重构出来的干扰信号反而翻倍叠加近端信噪比急转直下。4.2 功率分配因子 α一个参数决定公平与吞吐量的天平α 是 NOMA 仿真里最值得反复试的参数。它控制近端和远端的功率占比也间接决定 SIC 的解码余量。下表是固定 SNR10 dB、信道损耗差 10 dB 时的典型趋势。α近端远端功率近端吞吐量远端吞吐量系统总吞吐量适用场景0.20.8低高较高边缘用户优先0.30.7中中高最高默认配置0.40.6高中较高中心用户优先调节时注意一个边界α 不要超过 0.5。超过 0.5 意味着近端用户拿到更多功率SIC 原本“先解大功率远端”的顺序会被颠倒物理意义混乱仿真结果也不再是标准功率域 NOMA。另外 α 的下限也不要太低0.1 会让近端用户几乎不可用系统总吞吐量不升反降。4.3 两用户扩展到三用户SIC 级联的写法三用户 NOMA 是两用户版本的直接推广功率系数满足 α₁ α₂ α₃ 且 α₁α₂α₃1其中 α₃ 最大对应信道最差的远端用户。接收端按功率从大到小依次解码先解用户 3减去再解用户 2减去最后解用户 1。% 三用户叠加用户3功率最大用户1功率最小 xNoma3 sqrt(alpha3)*sym3 sqrt(alpha2)*sym2 sqrt(alpha1)*sym1; % 第 1 级 SIC解用户3重构并扣除 y3 h3 .* xNoma3 n3; [~, idx3] min(abs(y3./h3 - sqrt(alpha3)*constQPSK), [], 2); sym3Dec constQPSK(idx3); residual y3 - h3 .* sqrt(alpha3) .* sym3Dec; % 第 2 级 SIC解用户2扣除后剩用户1 y2 residual; [~, idx2] min(abs(y2./h2 - sqrt(alpha2)*constQPSK), [], 2); sym2Dec constQPSK(idx2); residual residual - h2 .* sqrt(alpha2) .* sym2Dec; % 最后解用户1不再做 SIC [~, idx1] min(abs(residual./h1 - sqrt(alpha1)*constQPSK), [], 2);这段代码的要点是每条 SIC 链路都要用当前用户自己的信道系数去重构上一级信号不能图省事共用同一个h。三用户时 SIC 级联的错误传播会更明显实际系统中通常会为远端用户配置更强的信道编码来兜底纯物理层仿真里则更依赖 α 拉开层级。4.4 常见误用SIC 顺序、功率归一化与均衡方式仿真代码跑出来的结果不对八成卡在下面三个地方。第一是 SIC 顺序搞反从功率最小的用户开始解这一层的信干噪比本身就低判决错误率极高后面全盘崩溃。第二是叠加时忘了对功率系数开方直接用x alpha*symNear (1-alpha)*symFar总功率变成 α²(1−α)²SNR 定义全部错位。第三是在y/h均衡时遇到深衰落信道噪声被极大放大正确做法是改用 MMSE 均衡% MMSE 均衡代替直接除以信道系数抑制噪声放大 eqMMSE conj(h) ./ (abs(h).^2 no); yEq y .* eqMMSE;5. 把 NOMA/OFDMA 仿真收进 zip复现、打包与解压排错5.1 error read zip archive多半是下载截断或路径问题从浏览器或网盘下载的压缩包最容易碰到解压到一半报error read zip archive。常见处理顺序是先看压缩包文件大小是否和页面标注一致小了几百 KB 基本就是下载被截断再用 7-Zip 打开压缩包执行“测试”按钮CRC 报错就重新下载如果文件名带着_NOMA_OFDMA_o这类下载工具追加的尾巴先把文件名改回标准.zip后缀再解压。解压路径也尽量不要出现中文和超长嵌套目录MATLAB 的unzip对这类路径兼容性不太好。5.2 GitHub zip 包在 MATLAB 里跑通的入口从 GitHub 仓库页面下载的 zip解压后目录名通常带分支名比如NOMA_OFDMA_main而且内部往往还有utils/、plot/这类子目录。直接用addpath只添加根目录运行主脚本时子目录里的函数找不到。推荐用genpath递归添加zipDir D:\workspace\NOMA_OFDMA_main; addpath(genpath(zipDir)); cd(zipDir); main_compare;genpath会递归收集所有子目录一条命令解决路径问题。main_compare是主脚本入口如果 zip 包里的主脚本文件叫其他名字先看 README 或用dir列出所有.m文件确认入口。savepath不是必须的把路径写进startup.m反而更干净。5.3 让仿真 zip 可复现的一个实用技巧固定随机种子并附复现说明仿真代码最影响可复现性的变量是随机数。脚本开头固定rng(2025)比在代码里写randn(seed)更符合新版本 MATLAB 的习惯。打包时在 zip 根目录放一个README.txt写清楚三件事仿真环境版本、主脚本入口、关键参数所在行号。这样协作者拿到压缩包后不需要翻代码直接改 α 和 SNR 范围就能复现结果。打包格式推荐直接用 7-Zip 的 ZIP 格式而不是 RARZIP 在 MATLAB 的unzip和各操作系统自带解压工具中兼容性最好如果仿真输出数据超过 4 GB勾选 ZIP64 再压缩。不建议给 zip 加访问密码密码一旦忘记整包数据等于作废对后续复现没有任何好处。本文还有配套的精品资源点击获取