ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

NOMA与ZF结合:QPSK调制MATLAB仿真与BER性能分析

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 会一直很高而且怎么调功率都没用。后来养成习惯在代码里用注释标清楚每个用户的检测流程再也没翻过车。希望帮到你。本文还有配套的精品资源点击获取
返回列表