NOMA与ZF结合:QPSK调制MATLAB仿真与BER性能分析
简介这份资源面向无线通信方向的学生与研究人员聚焦5G及未来网络中的非正交多址接入NOMA技术通过MATLAB仿真帮助理解功率域多址与串行干扰消除SIC的核心机制。压缩包共3个文件均为m脚本整体约2KB分别承担NOMA系统零强迫ZF解码主流程、QPSK调制映射以及QPSK软解调输出软信息等任务覆盖从比特流到接收端解码的完整链路。已有244人学习下载适合作为课程设计、毕业设计或算法验证的起步参考。读者可借助脚本观察不同用户功率分配、信噪比与用户数量对误码性能的影响并对比ZF线性接收与SIC解码的差异进而掌握NOMA与QPSK结合时的信号区分思路为后续扩展到更复杂的信道场景与接收算法打下基础。1. NOMA 与 ZF 结合从 QPSK 仿真入手理解功率域多址如果你最近在搜 NOMA、ZF、QPSK 和 MATLAB 仿真这几个词大概率是遇到了这样一个场景老师或项目要求你搭一套下行 NOMA 链路用 QPSK 做调制再在接收端用 ZFZero Forcing迫零做检测最后跑出 BER 曲线。听起来链路不长但真正动手时你会发现功率分配、信道矩阵构造、ZF 均衡的维度对齐、QPSK 星座映射这几件事只要有一处对不上误码率曲线就会直接躺平在 0.5 附近怎么调 SNR 都不动。NOMANon-Orthogonal Multiple Access非正交多址的核心思路是在功率域上让多个用户共享同一时频资源发送端按功率差异叠加信号接收端用 SIC串行干扰消除或线性检测把信号分离出来。ZF 是一种线性检测器通过信道矩阵的伪逆把用户间干扰压到零。把 ZF 用在 NOMA 里本质上是把功率域叠加后的等效信道做一次迫零均衡再逐用户判决。QPSK 则是最适合入门验证的调制方式——星座点少、判决边界清晰出问题时容易定位是功率分配错了还是均衡矩阵算错了。这套仿真适合两类人一是通信工程方向的学生需要快速搭出一个可复现的 NOMA 链路验证 BER 性能二是刚接触 NOMA 的工程师想用最小代价理解功率域 NOMA 和线性检测的配合方式。下面从参数设计到代码实现把这条链路拆开讲清楚。2. NOMA 下行链路与 ZF 检测的数学骨架2.1 功率域 NOMA 的信号叠加模型下行 NOMA 的典型场景是一个基站同时服务多个用户假设两个用户 UE1 和 UE2基站发送的叠加信号可以写成x sqrt(P1) * s1 sqrt(P2) * s2其中 s1 和 s2 分别是两个用户的 QPSK 调制符号P1 和 P2 是分配给两个用户的功率且 P1 P2 P_total。远用户信道条件差的分配更大功率近用户分配更小功率这样远用户可以把近用户的信号当作噪声直接解调近用户则先解远用户再 SIC 消除。接收端用户 k 的接收信号y_k h_k * x n_kh_k 是基站到用户 k 的信道系数n_k 是加性高斯白噪声。这里的关键参数是功率分配比。常见做法是固定总功率按信道增益反比分配比如远用户功率占比 0.7~0.8近用户 0.2~0.3。这个比例直接决定了谁先解调、SIC 能不能成功。2.2 ZF 检测在 NOMA 中的角色当用户数增多或者需要联合检测时可以把多用户接收信号写成矩阵形式y H * x nH 是 N_r × N_t 的信道矩阵这里 N_t 是发送的叠加流数N_r 是接收天线数。ZF 检测的估计值为x_hat pinv(H) * y (H^H * H)^(-1) * H^H * y在 NOMA 场景下如果基站配置多天线或者多个用户联合接收H 的每一列对应一个用户的等效信道。ZF 的作用是把用户间干扰强制置零代价是可能放大噪声——当 H 的条件数很差时pinv(H) 的范数会很大噪声被放大后 BER 反而恶化。这就是为什么 ZF 在 NOMA 里通常要和功率分配配合使用功率分配保证远用户信号足够强ZF 保证近用户不受远用户干扰。2.3 QPSK 调制映射与判决QPSK 每个符号携带 2 bit星座点位于 (±1±1j)/sqrt(2)。MATLAB 里用 pskmod 或自己写映射表都可以。判决时取实部和虚部的符号即可bit_i real(symbol) 0 bit_q imag(symbol) 0注意归一化如果不除以 sqrt(2)符号功率是 2 而不是 1后面算 SNR 时会差 3 dB这个坑后面会细说。2.4 仿真参数设计表参数建议值说明用户数2入门先用两用户验证后再扩展调制方式QPSK每符号 2 bit总功率 P_total1归一化方便对比功率分配比0.8 / 0.2远用户 / 近用户信道模型瑞利衰落h ~ CN(0,1)SNR 范围0:2:20 dB覆盖典型工作区间蒙特卡洛次数1e4 ~ 1e5少于 1e4 曲线毛刺明显接收天线数1 或 22 天线才能体现 ZF 矩阵求逆这张表里的参数不是死的但功率分配比和 SNR 范围建议先按这个跑通再改。3. MATLAB 实现从 QPSK 映射到 ZF 检测的完整链路3.1 主循环框架与参数初始化% NOMA_ZF_QPSK.m % 下行两用户 NOMAQPSK 调制ZF 检测 clear; clc; close all; N 1e5; % 蒙特卡洛符号数 SNR_dB 0:2:20; % SNR 扫描范围 P_total 1; % 总功率归一化 alpha 0.8; % 远用户功率占比 P1 alpha * P_total; % 远用户功率 P2 (1-alpha) * P_total; % 近用户功率 ber_zf zeros(size(SNR_dB)); ber_sic zeros(size(SNR_dB)); for idx 1:length(SNR_dB) snr_lin 10^(SNR_dB(idx)/10); noise_var P_total / snr_lin; % 后续处理 end这段代码定义了仿真主循环的骨架。N 是每个 SNR 点发送的符号数1e5 在普通笔记本上大约跑几十秒如果只做趋势验证 1e4 也够。alpha 是远用户功率占比0.8 意味着远用户拿到 80% 功率这是 NOMA 的典型配置。noise_var 由总功率和 SNR 反推注意这里用的是线性 SNR。3.2 QPSK 调制与功率叠加% 生成两用户比特 bits1 randi([0 1], 2*N, 1); bits2 randi([0 1], 2*N, 1); % QPSK 调制归一化功率为 1 s1 (1-2*bits1(1:2:end)) 1j*(1-2*bits1(2:2:end)); s1 s1 / sqrt(2); s2 (1-2*bits2(1:2:end)) 1j*(1-2*bits2(2:2:end)); s2 s2 / sqrt(2); % 功率域叠加 x sqrt(P1)*s1 sqrt(P2)*s2;QPSK 映射用 (1-2*b) 把 0/1 映射到 1/-1再除以 sqrt(2) 保证平均功率为 1。这一步如果忘了归一化后面噪声功率计算会偏BER 曲线整体左移或右移。叠加时 sqrt(P1) 和 sqrt(P2) 是因为功率是幅度的平方。3.3 信道与 ZF 均衡矩阵构造% 瑞利衰落信道两接收天线 H (randn(2,2) 1j*randn(2,2)) / sqrt(2); % 接收信号 n sqrt(noise_var/2) * (randn(2,N) 1j*randn(2,N)); y H * [x; zeros(1,N)] n; % 简化只发一路叠加信号 % ZF 均衡 W pinv(H); x_hat W * y;这里 H 是 2×2 信道矩阵模拟两接收天线。实际 NOMA 下行中如果基站只发一路叠加信号H 的第二列可以置零或者用单天线模型。ZF 均衡矩阵 W pinv(H) 是核心操作pinv 比 inv 更稳健因为 H 可能接近奇异。x_hat 的第一行就是叠加信号的估计。3.4 逐用户检测与 BER 统计% 远用户直接解调把近用户当噪声 s1_hat x_hat(1,:); bits1_hat zeros(2*N,1); bits1_hat(1:2:end) real(s1_hat) 0; bits1_hat(2:2:end) imag(s1_hat) 0; ber_zf(idx) mean(bits1_hat ~ bits1); % 近用户 SIC先解远用户再消除 s2_hat x_hat(1,:) - sqrt(P1)*s1_hat; bits2_hat zeros(2*N,1); bits2_hat(1:2:end) real(s2_hat) 0; bits2_hat(2:2:end) imag(s2_hat) 0; ber_sic(idx) mean(bits2_hat ~ bits2);远用户检测直接把 ZF 输出做符号判决。近用户先估计远用户符号再从接收信号里减掉得到自己的信号。注意这里 s1_hat 是判决后的符号不是软信息所以 SIC 是硬消除。硬消除在低 SNR 时容易出错传播这是后面避坑章节要讲的重点。3.5 BER 曲线绘制与验证semilogy(SNR_dB, ber_zf, b-o, LineWidth, 1.5); hold on; semilogy(SNR_dB, ber_sic, r-s, LineWidth, 1.5); grid on; xlabel(SNR (dB)); ylabel(BER); legend(远用户 ZF, 近用户 SIC); title(NOMA ZF QPSK BER 曲线);跑完后远用户曲线应该随 SNR 单调下降近用户曲线在低 SNR 可能高于远用户因为 SIC 出错传播高 SNR 后低于远用户。如果两条曲线都贴在 0.5检查功率分配和归一化如果近用户曲线不降检查 SIC 消除时用的 s1_hat 是不是判决前的软符号。4. 避坑与排查NOMA ZF 仿真里最容易翻车的 5 个点4.1 现象BER 曲线始终在 0.5 附近不下降原因QPSK 映射后没有归一化符号功率为 2而噪声功率按总功率 1 计算实际 SNR 比设定值低 3 dB。更隐蔽的情况是功率分配后总功率超过 1导致噪声相对太小判决门限偏移。解决在 QPSK 映射后加 s s / sqrt(2)并在叠加后检查 mean(abs(x).^2) 是否接近 P_total。可以用 assert 做运行时检查。4.2 现象ZF 均衡后近用户 BER 比远用户还高原因SIC 消除时用了硬判决符号低 SNR 下远用户判决错误率高错误传播到近用户。另外如果 H 的条件数很大pinv(H) 会放大噪声近用户信号功率本来就小被噪声淹没。解决低 SNR 区间改用软消除或 MMSE 检测或者对 H 做正则化用 W (HH sigma^2eye(2))\H 代替 pinv。正则化因子取噪声方差能显著改善条件数差的情况。4.3 现象增加接收天线数后 BER 反而变差原因H 矩阵维度变了但发送信号维度没对齐。比如 H 是 4×2x 只有 1 行矩阵乘法维度不匹配MATLAB 会报错或隐式扩展导致错误结果。解决明确发送流数和接收天线数的关系。NOMA 下行如果只发一路叠加信号H 应该是 N_r×1ZF 退化为匹配滤波。只有多流传输时才需要 N_r×N_t 的矩阵求逆。4.4 现象蒙特卡洛次数太少导致曲线抖动严重原因1e3 次仿真在 BER 1e-3 量级只能观察到几个错误统计方差极大。高 SNR 区间错误事件稀少需要更多样本。解决至少用 1e5 个符号或者用重要性采样。如果跑得慢可以只在高 SNR 点增加样本数低 SNR 点减少。4.5 现象功率分配比改变后曲线趋势完全变了原因alpha 从 0.8 改到 0.5 时远用户和近用户的功率差消失NOMA 退化为正交多址SIC 增益消失。另外如果 alpha 太接近 1近用户信号太弱ZF 后也解不出来。解决alpha 建议在 0.7~0.9 之间扫描观察两用户 BER 的交叉点。这个交叉点对应 NOMA 的公平性折中是论文里常说的性能边界。5. 进阶技巧用 MMSE 替代 ZF 并验证鲁棒性ZF 的问题在于噪声放大尤其在信道矩阵条件数差的时候。一个实用的改进是用 MMSE 检测W_mmse (HH noise_vareye(size(H,2))) \ H;和 ZF 的 pinv(H) 相比MMSE 在对角加载了噪声方差相当于在迫零和匹配滤波之间做折中。低 SNR 时偏向匹配滤波高 SNR 时接近 ZF。改一行代码就能对比% ZF W_zf pinv(H); % MMSE W_mmse (H*H noise_var*eye(size(H,2))) \ H;跑完对比两条曲线你会发现 MMSE 在低 SNR 区间有 1~2 dB 增益高 SNR 区间和 ZF 重合。这个增益在 NOMA 近用户身上更明显因为近用户信号弱对噪声放大更敏感。另一个验证习惯是固定随机种子确保每次跑出的曲线可复现rng(42); % 固定种子我一般会在脚本开头设 rng这样调参数时能排除随机性干扰。如果换了种子曲线形状大变说明蒙特卡洛次数不够。最后说一个我踩过的坑早期做 NOMA 仿真时我直接把 ZF 用在两用户叠加信号上忘了远用户和近用户的检测顺序不同。远用户不需要 SIC直接判决就行近用户才需要先解远用户再消除。这个顺序搞反了近用户 BER 会一直很高而且怎么调功率都没用。后来养成习惯在代码里用注释标清楚每个用户的检测流程再也没翻过车。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

go-judge判题机从部署到多语言评测:沙箱与API配置实战指南

go-judge判题机从部署到多语言评测:沙箱与API配置实战指南

简介:围绕 GoJudge 判题机部署与调用的中文实践指南,面向需要使用云服务器搭建 OJ 在线评测系统、但对官方文档深感资料不足的开发者与运维人员。原文结合作者实际搭建经验,整理出直接服务器部署与 Docker 部署两条路线,并补充 go…

2026/9/23 16:32:28 阅读更多 →
分布式存储选型与落地:Ceph、MinIO、JuiceFS实战避坑指南

分布式存储选型与落地:Ceph、MinIO、JuiceFS实战避坑指南

简介:本资源是一份面向互联网与计算机专业学习者、系统架构初学者及企业IT技术人员的分布式存储技术深度解析文档,聚焦大数据时代下海量数据的高效存储与扩展难题。文档系统梳理结构化数据(关系型数据库)的垂直/水平切分策略、非结…

2026/9/24 18:57:51 阅读更多 →
华为路由器交换机VLAN配置实例:VLAN间通信与ACL策略详解

华为路由器交换机VLAN配置实例:VLAN间通信与ACL策略详解

简介:《华为路由器交换机VLAN配置实例.pdf》是一份面向网络初学者和华为设备运维人员的配置案例文档。内容以4台PC、华为R2621路由器与S3026e交换机组成的小型网络为环境,完整演示了VLAN从规划到落地的过程:包括PC的IP与网关地址分配、交换机…

2026/9/23 16:31:28 阅读更多 →

最新新闻

纯电动汽车电平衡计算核心指南:从功率流到工程落地

纯电动汽车电平衡计算核心指南:从功率流到工程落地

简介:纯电动汽车电平衡计算.pdf 是一份面向新能源汽车整车电气设计及研发工程师的专业技术文献,聚焦电平衡这一关键环节,系统讲解整车用电负荷评估、蓄电池选型、DC/DC变换器匹配、熔断丝选择及导线线径计算,并给出夏季雨夜等严苛…

2026/9/24 23:39:28 阅读更多 →
WorkBuddy实战:桌面智能体如何帮你自动化整理本地文件

WorkBuddy实战:桌面智能体如何帮你自动化整理本地文件

第一次看到 WorkBuddy 这个名字的时候,我第一反应是:又一款套壳的 AI 聊天工具。说实话,这类产品这两年见得太多了,换个皮肤、接个大模型 API,就敢说自己是什么“效率神器”。但真正改变我判断的,是我把 Wo…

2026/9/24 23:39:28 阅读更多 →
YOLOv8姿态估计实现深蹲计数:从关键点检测到状态机实战

YOLOv8姿态估计实现深蹲计数:从关键点检测到状态机实战

简介:面向 NVIDIA Jetson 平台的 YOLOv8 姿势估计与运动计数演示项目,聚焦健身场景中的动作自动识别与计数,适合边缘计算、视觉 AI 开发者学习和二次开发。项目基于 YOLOv8-Pose 模型检测人体 17 个关键点,通过关键点连线夹角的阈…

2026/9/24 23:39:28 阅读更多 →
从对话到执行:WorkBuddy企业级办公自动化落地实战与踩坑盘点

从对话到执行:WorkBuddy企业级办公自动化落地实战与踩坑盘点

WorkBuddy这个词,最近在我身边的技术群里出现的频率确实高。最开始我以为又是一个套壳的聊天机器人,真正在自己的办公环境里跑了一圈之后,才发现它和我之前用过的AI助手有本质差异——它不是“回答问题”的,而是“把事办完”的。这…

2026/9/24 23:39:28 阅读更多 →
GD32H759+RT-Thread工控实战:I2C与RTC避坑指南

GD32H759+RT-Thread工控实战:I2C与RTC避坑指南

1. 从两个"看起来最简单"的外设说起在工控板卡上做开发,I2C 和 RTC 大概是那种"平时不出事、出事查半天"的模块。I2C 两根线,RTC 一颗纽扣电池,原理图上一画就完事,但真到 GD32H759 这种高性能 MCU 上跑 RT-T…

2026/9/24 23:39:28 阅读更多 →
x86电脑如何编译ARM程序:交叉编译原理与实操全解析

x86电脑如何编译ARM程序:交叉编译原理与实操全解析

“x86电脑能编译ARM程序”,这个标题我第一眼看到的时候,心里想的是:这不是基础得不能再基础的常识吗?后来发现问的人多了,才意识到很多朋友刚接触嵌入式或者ARM开发时,脑子里一直有个坎儿迈不过去——我用的…

2026/9/24 23:38:28 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →