QPSK在AWGN信道下的MATLAB误码率仿真与3dB偏差排查

QPSK在AWGN信道下的MATLAB误码率仿真与3dB偏差排查 简介本资源为一份面向通信工程、电子信息类专业学生及数字通信入门学习者的MATLAB仿真文档围绕QPSK调制在加性白高斯噪声AWGN信道下的性能展开适合课程设计、实验报告撰写与通信原理自学参考。压缩包内仅含1个doc文档体积约404KB正文系统梳理了QPSK的四相相位映射与复基带数学表达并完整给出信号生成、调制、噪声注入、匹配滤波、相干解调、误码率统计到BER-SNR曲线绘制的仿真链路同时列出randi、qpsk、awgn、biterr等关键函数的调用思路与循环扫描不同信噪比的实现框架。读者可据此复现误码率曲线直观理解QPSK在高斯噪声环境中的抗噪能力并为实际通信系统设计提供理论依据。目前已有661人学习便于快速上手并对照修改参数开展拓展实验。1. 从一条不下降的误码率曲线说起QPSK 在 AWGN 信道下的 MATLAB 仿真有人把 QPSK 在 AWGN 信道下的 MATLAB 仿真跑完Eb/N0 从 0 dB 扫到 12 dB理论曲线已经掉到 1e-6实测却卡在 1e-3 附近不再下降也有人曲线形状完全正确整条却比教科书右移了 3 dB。这两种现象几乎占掉通信原理课程设计和毕设里 QPSK 仿真的绝大部分返工时间。问题基本不在调制公式而集中在三处符号能量有没有归一化、awgn() 里填的到底是 SNR 还是 Eb/N0、比特拆分与合并的配对顺序是否一致。这类资源一般会先给 M-PSK 信号波形的正交展开和相干解调推导再配一套代码输出误码率曲线、时域波形和星座图、眼图。对做课程设计的人是现成的骨架对已经工作的人是把链路预算里那几个 dB 对齐的校准工具。下面按建模、加噪、判决、看图排错的顺序拆一遍。2. QPSK 星座映射与 I/Q 支路建模2.1 从 M-PSK 通式收敛到四个星座点M-PSK 的带通表达式是 s_m(t) g(t)·cos(2πf_c t 2π(m−1)/M)m 1,2,…,Mg(t) 为脉冲成形波形。把余弦展开后每个波形都能写成两个标准正交基的线性组合f₁(t) √(2/ε_g)·g(t)cos2πf_c tf₂(t) −√(2/ε_g)·g(t)sin2πf_c t。于是信号向量 s_m [√ε_g·cos(2π(m−1)/M), −√ε_g·sin(2π(m−1)/M)]全部符号能量相同都等于 ε_g。M 4 时相位取 0、π/2、π、3π/2四个点均匀落在半径为 √ε_g 的圆上相邻两点相差 90°。文档里还提到 π/4-QPSK 这个变形在每个符号间隔的载波相位上额外叠加 π/4 相移让相位跳变不经过原点包络起伏更小符号同步也容易做。它的星座仍是正方形只是整体转了 45°接收端做相位判决时要注意这个偏移量。2.2 Gray 映射与 Es 1 的归一化映射关系直接决定误比特率和误符号率的换算系数工程上默认用 Gray 映射相邻星座点只差一个比特双比特 b₁b₂I 支路电平Q 支路电平归一化复符号相位0 011(1 j)/√245°0 11−1(1 − j)/√2−45°1 1−1−1(−1 − j)/√2−135°1 0−11(−1 j)/√2135°Gray 映射的价值在于噪声把符号推到最近邻点时通常只错一个比特所以误比特率约等于误符号率除以每符号比特数 k。这个近似在后面的理论曲线对照里会直接用到。归一化必须在建模阶段就定死。若 I/Q 直接取 ±1符号能量 Es 2除以 √2 之后 Es 1对应 Eb Es/log₂4 0.5。漏掉这一步后面算出的噪声方差会跟着错整条曲线平移 10log₁₀(2) ≈ 3.01 dB。这是曲线形状对、位置偏 3 dB最常见的第一个来源。2.3 手写调制器不依赖任何工具箱%% QPSK 调制比特流 - 复基带符号Es 1Gray 映射 Nbits 1e5; % 总比特数 Nbits Nbits - mod(Nbits, 2); % 向下取偶奇数比特无法配对 bits randi([0 1], Nbits, 1); % 生成随机二进制序列 bI bits(1:2:end); % 奇数位置比特 - 同相 I 支路 bQ bits(2:2:end); % 偶数位置比特 - 正交 Q 支路 % 双极性映射比特 0 - 1比特 1 - -1除以 sqrt(2) 做能量归一化 I (1 - 2*bI) / sqrt(2); Q (1 - 2*bQ) / sqrt(2); sym I 1j*Q; % 复基带 QPSK 符号Es |sym|^2 1这段代码的逻辑说明randi生成列向量便于后续向量化运算1:2:end与2:2:end决定了比特到 I/Q 的分配方式这个索引在接收端合并时必须以完全相同的顺序还原否则会出现高信噪比下的误码平台。参数上Nbits要按目标误码率反推测 1e-4 量级至少准备 1e6 比特1 - 2*b完成 0/1 到 1/−1 的映射/sqrt(2)把 Es 归到 1。整个调制过程在等效基带上完成不出现载波运算量比真带通仿真小一个数量级。3. AWGN 信道注入与 Eb/N0 换算3.1 加性白高斯噪声的两条实现路径AWGN 信道的两个正交噪声分量 n_c、n_s 都是零均值高斯过程且互不相关方差均为 N₀/2。对复基带信号加噪等价于在实部、虚部各加一路独立高斯噪声。手写写法是sigma*(randn 1j*randn)其中单维标准差 sigma √(1/(2·Es/N0))Es 已归一化为 1。写成这种形式的好处是噪声功率完全确定结果可复现。用 MATLAB 的awgn()更方便但它的snr参数含义是每样点符号信噪比在采样率等于符号率时就是 Es/N0。而教科书横轴是 Eb/N0两者差 10log₁₀(k) 3.01 dB。直接把 Eb/N0 填进awgn(x, EbN0, measured)等于噪声加多了 3 dB曲线整体右移——这是第二个偏 3 dB 的来源。3.2 SNR、Es/N0、Eb/N0 的换算关系参数含义与 Eb/N0 的关系QPSK常见误用Eb/N0每比特能量与噪声功率谱密度之比基准直接填进 awgn 的 snr 参数Es/N0每符号能量与噪声功率谱密度之比Eb/N0 3.01 dB与 SNR 混用SNR信号功率与噪声功率之比采样率 符号率时等于 Es/N0过采样时漏加 10log₁₀(Fs/Rs)sigma复噪声每维标准差√(1/(2·Es/N0))忘记开方或漏掉因子 2过采样场景要额外注意若每个符号采 8 个点噪声带宽随之扩大awgn的 snr 与符号级 Es/N0 之间还差 10log₁₀(8) ≈ 9 dB。带成型滤波的仿真必须把这一项补回去。3.3 三种加噪写法的等价验证%% 同一组符号三种加噪方式应当得到一致的噪声功率 EbN0dB 6; % 目标每比特信噪比 k 2; % QPSK 每符号 2 比特 EsN0dB EbN0dB 10*log10(k); % 折算成 Es/N0 9.01 dB EsN0 10^(EsN0dB/10); % 方式一手写复高斯噪声Es 1 时每维方差为 1/(2*EsN0) n1 sqrt(1/(2*EsN0)) * (randn(size(sym)) 1j*randn(size(sym))); r1 sym n1; % 方式二awgn,measured 会先估计输入信号功率再按 snr 加噪 r2 awgn(sym, EsN0dB, measured); % 方式三显式给定信号功率避免有限块长带来的功率估计偏差 r3 awgn(sym, EsN0dB, 0); % 第三个参数 0 dBW 即信号功率 1 W fprintf(实测噪声功率: %.4f / %.4f / %.4f\n, ... var(r1-sym), var(r2-sym), var(r3-sym));参数说明measured会在每次调用时重新估计输入功率块长较短或高信噪比时估计偏差明显实测噪声功率会偏离理论值直接给出信号功率方式三则完全确定适合做可复现的曲线。EsN0dB与EbN0dB的换算写死在代码里扫点时只改 Eb/N0 一个变量避免两处不同步。4. 相干解调、判决门限与误码统计4.1 相干解调就是取实部虚部的符号接收信号与两个正交载波做相关后输出落到 I/Q 平面上的点判决就是把复符号的实部和虚部各自与门限 0 比较real(r) 0判为比特 1imag(r) 0同样判为 1。因为星座关于原点对称且 Es 已归一化0 就是最优门限不需要额外计算。还原比特时最容易出错的地方是配对顺序。调制端用1:2:end取 I、2:2:end取 Q解调端必须原样写回如果图省事用reshape(bits, 2, []).再取列得到的配对顺序会变高信噪比下误码率会卡在一个平台上不再下降。4.2 扫 SNR、算误码、叠理论曲线EbN0dB_list 0:2:12; % 横轴扫描点 ber zeros(size(EbN0dB_list)); for ii 1:numel(EbN0dB_list) EbN0dB EbN0dB_list(ii); EsN0dB EbN0dB 10*log10(2); % QPSK: Es/N0 Eb/N0 3.01 dB sigma sqrt(1/(2*10^(EsN0dB/10))); r sym sigma*(randn(size(sym)) 1j*randn(size(sym))); bIhat real(r) 0; % I 支路硬判决 bQhat imag(r) 0; % Q 支路硬判决 bitsHat zeros(Nbits, 1); bitsHat(1:2:end) bIhat; % 合并顺序必须与调制端一致 bitsHat(2:2:end) bQhat; ber(ii) sum(bits ~ bitsHat) / Nbits; % 等价于 biterr end EbN0_lin 10.^(EbN0dB_list/10); theory 0.5*erfc(sqrt(EbN0_lin)); % Q(sqrt(2*Eb/N0))Gray 编码 QPSK semilogy(EbN0dB_list, ber, o-); hold on; semilogy(EbN0dB_list, theory, k--); grid on; xlabel(E_b/N_0 (dB)); ylabel(BER); legend(仿真,理论);逻辑说明sigma由 Es/N0 直接算出不调用任何工具箱省去biterr和qfunc的依赖。理论值用0.5*erfc(sqrt(Eb/N0))这正是 Q(√(2Eb/N0)) 的等价写法Gray 编码的 QPSK 与 BPSK 在这一项上完全相同。若两条曲线在高信噪比处分离优先检查配对顺序和归一化其次看是否漏了 Es/N0 到 Eb/N0 的 3.01 dB。4.3 蒙特卡洛仿真到底能测到多低目标 BER建议每点比特数预计观测错误数1e-2≥ 1e4约 1001e-3≥ 1e5约 1001e-4≥ 1e6约 1001e-5≥ 1e7约 100经验规则是让每点至少积累 100 个错误比特误码率估计的相对标准差才落到 10% 以内。纯蒙特卡洛掉到 1e-5 以下就很吃力常规做法是曲线只画到 1e-4更低的部分用理论式或半解析法补。5. 星座图、眼图与波形图的排错用法5.1 三张图各自能看出什么星座图看判决裕量scatterplot(r)之后应看到四个清晰团簇落在 ±45° 方向团簇半径就是噪声标准差。团簇糊成一片说明噪声过大或 SNR 单位错四个点整体转了 45°说明映射用了 π/4 偏移而判决门限没跟着转。眼图看定时eyediagram(real(r), samplesPerSym)需要过采样信号反映的是 I 支路的码间干扰和采样点位置。眼睛张开度最大处才是最佳采样时刻用measured模式加噪但没做过采样时眼图会退化成一个点和一条噪声带看不出任何东西。时域波形看包络QPSK 是恒包络调制不加成型滤波时若看到幅度明显起伏多半是 I/Q 两路增益不一致或符号对齐错了位。5.2 症状到原因的对照表现象最可能的原因检查位置曲线形状对、整体右移 3 dBEb/N0 与 Es/N0 混用或漏归一化sigma 计算式、awgn 的 snr 参数高 SNR 处误码率不再下降比特配对顺序与调制端不一致1:2:end与2:2:end的合并星座图整体旋转 45°用了 π/4-QPSK 映射判决门限是否跟着旋转眼图完全闭合没做过采样或没加成型滤波采样率与符号率的比值噪声功率估计每次略有不同measured在短块上的估计偏差改用固定信号功率5.3 一行代码锁定配对顺序错误配对顺序的问题不需要靠读代码发现直接在两个数组上打索引对比就行% 假设调制端保存了每比特对应的符号序号和支路标记 idxTx [(1:2:Nbits)., (2:2:Nbits).]; % 第 n 行是第 n 个符号的 I/Q 比特索引 idxRx [(1:2:Nbits)., (2:2:Nbits).]; % 解调端若换成 reshape此处会不一致 assert(isequal(idxTx, idxRx), 比特配对索引不一致检查 reshape 的维度顺序);把这段断言放在调制和解调之间任何一次重构导致的配对错位都会在仿真开始前直接报错而不是等到扫到 10 dB 才看到一个平底的误码率平台。扫点前顺手把idxTx、idxRx和sigma三个量disp出来一次运行就能覆盖绝大多数返工场景。本文还有配套的精品资源点击获取