瑞利衰落信道下MRC分集对QPSK等调制误码率性能的影响与MATLAB仿真
上个星期有位朋友发来一张仿真图说单天线瑞利衰落信道下QPSK的误码率到了0dB还停在10%怎么加发射功率都降不下来。我一看就明白他踩了几乎所有做链路仿真的人都会踩的第一个坑把衰落当成了普通的高斯噪声以为功率够了就能覆盖却不知道瑞利深衰落这种“乘性干扰”根本不是靠功率能硬扛的。后来我们把实验改成L2和L4的MRC分集接收同一套调制曲线明显掉头向下这才把误码性能真正拉到了可用的区间。这篇文章就是我那次实验的完整记录题目里的关键词基本就是全部工作瑞利衰落信道、最大比合并MRC分集、误码率、BPSK/QPSK/8PSK/16QAM四种调制方式对比。内容不涉及复杂的推导所有结论都能用一段MATLAB代码复现适合正在做通信课程设计、需要画误码率曲线、或者想验证分集理论的同学直接参考。你不需要完整的数学底子能看懂复数乘法和星座图就能跟着把曲线跑出来。1. 瑞利衰落为什么这么“难缠”单支路的真实性能到底有多差1.1 单根天线在深衰落面前的无力感先做一个思想实验。假设信道只有高斯白噪声BPSK在10dB信噪比下误码率大约在2e-6量级直接可用换成平坦瑞利衰落信道同样10dB平均信噪比平均误码率立刻涨到2.3e-2左右差了四个数量级。这不是因为接收机做错了什么而是因为信号幅度本身在随机波动。瑞利衰落的基带模型是接收信号 r h·s n其中 h 是复高斯随机变量。问题在于 h 不是一个固定衰减而是随时间随机游走的乘性干扰。当 h 的模值跌到很小——也就是所谓“深衰落”——哪怕只有几个符号周期这期间接收信噪比会瞬间掉到0dB以下。这种深度衰落是随机出现的而且出现的概率并不会随着发射功率增大而迅速消失。直观类比高斯噪声像房间里均匀的背景嘈杂声你把说话音量调高就能压过去瑞利衰落则像对面那个人有时候站到隔壁房间去你再怎么大声喊他那边听起来还是像蚊子叫。发射功率根本无法对抗这种“人跑到隔壁房间”的瞬间。1.2 中断概率才是衰落信道的第一指标很多初学者只看平均误码率忽略了中断概率这个更本质的指标。在瑞利信道下瞬时信噪比 γ 服从指数分布。假设平均信噪比 γ̄ 10也就是10dB瞬时信噪比低于0dBγ_th 1的概率是P(γ 1) 1 - e^(-1/10) ≈ 0.095也就是说大约有10%的时间这条链路实际上处于0dB以下的工作状态这个时候任何高阶调制都会崩溃。更麻烦的是随着平均信噪比增加中断概率只是近似线性下降。单个支路从10dB平均信噪比提到20dB中断概率从约9.5%降到约1%降幅有限但代价是发射功率翻了十倍。分集接收解决的是这个根本问题如果有 L 条统计独立的衰落支路那么只有当所有支路同时处于深衰落时通信才会中断。独立瑞利支路下这个联合概率近似是每条支路中断概率的 L 次方。L2时上面的中断概率从9.5%降到0.9%L4时直接降到8e-5量级。这才是分集真正的意义——不是简单抬高平均信噪比而是把“深衰落同时发生”的概率压到极低。1.3 独立衰落支路从哪里来仿真该假设什么分集支路不是凭空产生的。现实中常见四种来源空间分集两根天线距离超过半个波长时间分集通过交织把衰落打散到不同时隙频率分集多载波上相同信息重复发送以及极化分集。在做仿真时我们不需要纠结具体用哪种物理手段只需要假设 L 条支路的复信道增益 h_l 是独立同分布的复高斯随机变量平均功率归一化为1。这里有个均匀性细节必须说明很多同学把“分支路”理解成“把信号复制L份再合并”如果直接让每条支路都等于同一个 h那L2和L1完全没区别因为两条支路同时深衰落。分集的本质是“独立”二字不是数量。仿真代码里要分别产生L个独立的随机信道不能共用同一个随机数。仿真还隐含了几个理想假设第一接收端能完美估计每条支路的信道 h_l第二噪声是加性高斯白噪声且各支路噪声独立第三信道是平坦瑞利块衰落即一个符号内 h 不变不同符号间重新随机。这些假设在入门验证阶段完全够用但到了后面换导频估计、加时间选择性时每一个都会给性能带来真实损失后面专门讲。2. MRC合并的本质把L条支路的“声音”按信噪比加权叠加2.1 三种合并方式为什么选择合并和等增益合并都不如MRC分集合并常见三种策略选择合并SC、等增益合并EGC、最大比合并MRC。用一次生活类比讲清楚三个人一起听远处的说话声A站在讲话者旁边非常清楚B隔着两米、背景有些噪音C则在隔壁房间基本听不清。选择合并的做法是只让A的声音通过B和C直接弃用好处是简单坏处是浪费了B听到的那部分有效信息。等增益合并的做法是三个人音量调到一样大再叠加B的噪音和C的噪音也会一并被放大结果信噪比提升有限。最大比合并则是给A很大的权重、给B中等权重、给C几乎为零的权重然后叠加。每个支路的权重与它自身的信道质量成正比好支路说话算数差支路闭嘴。在复基带模型里MRC合并后的输出信噪比等于所有支路信噪比之和。如果每条支路平均信噪比相同则合并后平均信噪比直接提升为单支路的 L 倍。这个结论表明MRC是线性合并中的最优策略也是为什么它在无线通信接收机里被广泛使用。2.2 权重推导一句话共轭相乘能量相加假设发送符号为 s第 l 条支路的接收信号是r_l h_l·s n_l其中 n_l 是复高斯噪声各支路独立。MRC的合并方式是z sum(a_l * r_l, l1..L)要使得合并后信号信噪比最大最优的加权系数是a_l h_l^* 或者乘以一个公共常数不影响判决把 a_l h_l^* 代入信号分量为 sum(|h_l|²)·s噪声分量是 sum(h_l^*·n_l)。合并后的信号能量正比于 sum(|h_l|²)噪声功率正比于 sum(|h_l|²)·N0两者相除正好得到 sum(SNR_l)。这个推导的关键在于“共轭相乘”同时完成了两件事相位对齐和幅度加权。相位对齐解决的是多支路相干叠加的问题——如果没有共轭各支路相位随机叠加时可能互相抵消幅度加权则是让强支路在最终判决里拥有更大的话语权。这两件事加在一起才是“最大比”三个字的真正含义。2.3 平均误码率的“斜率变陡”才是分集的核心收益分集对误码率的影响分两个维度一是同一误码率下所需信噪比下降功率增益二是误码率曲线的斜率变陡。后者常被忽略却至关重要。瑞利衰落单支路下BPSK的平均误码率在高信噪比时近似为 1/(4·γ̄)也就是随信噪比增加误码率近似线性下降但每增加10dB只能让误码率下降一个数量级。这也是为什么单支路曲线“拖着一根长尾巴”下不去。L2时BPSK的平均误码率渐近行为变成 3/(16·γ̄²)信噪比每增加10dB误码率下降两个数量级L4时则是按 γ̄^(-4) 下降曲线斜率越来越陡。同样的信噪比增量在分集系统里获得的误码率改善比单支路大得多。作为验证用闭式公式算两个点L1、平均信噪比10dB时BPSK平均BER 1/2·[1 - sqrt(γ̄/(1γ̄))] ≈ 2.3e-2L2、同样的10dB平均信噪比BER ((1-μ)/2)²·(2μ)其中 μ sqrt(γ̄/(1γ̄))算出来约 1.6e-3同样的10dB平均信噪比L2比L1误码率改善超过一个数量级继续算L4改善会更加明显。这就是我们选MRC做分集合并、并且非要对比L1/2/4的原因——单看一个分集阶数根本看不出分集的完整威力。3. 四种调制方式在衰落信道下的理论底线3.1 星座图的最小距离一句话判断抗噪声能力在不同调制方式之间对比之前先建立一把“尺子”星座点之间的最小欧氏距离 d_min 直接决定抗噪声能力。平均符号能量归一化为1时四种调制的 d_min 差异巨大调制方式每符号比特数 k星座点数归一化最小距离 d_min相对BPSK的距离损失BPSK122.0000dBQPSK241.414-3dB8PSK380.765-8.3dB16QAM4160.632-10dB这张表的信息量很大从BPSK到QPSK每符号多传1比特星座距离损失3dB但误码性能在相干瑞利信道下其实没有损失因为QPSK可以看成两路正交BPSK比特能量减半的同时噪声也在两个维度上各减半结果是每比特误码率与BPSK几乎一致。但从QPSK往8PSK、16QAM走每多传1比特最小距离都在明显缩小衰落信道下这种距离损失会被放大。所以关键不是“谁的星座点更多”而是“多出来的星座点付出了多大的距离代价”。3.2 BPSK与QPSK在相干瑞利信道下的等价性BPSK把信息放在一个实维度上星座点只有±1d_min最大。QPSK把两个比特分别放在实部和虚部两个正交维度上每个维度上依然是二电平判决所以理论误码率曲线与BPSK完全相同。前提是采用格雷映射——相邻星座点之间只有一个比特不同这样符号错误时误码率不会因为某个符号错判到远端而额外增加。这是很多入门者容易忽略的一点如果QPSK映射比较随意误码率会比BPSK差。仿真代码里建议严格按照格雷映射表来不要自己随便给符号编号。后面我的结果里BPSK和QPSK曲线几乎重合就是这个原因。3.3 8PSK的相位脆弱性从90°间隔缩到45°8PSK的8个星座点均匀分布在单位圆上相邻点之间的相位间隔是45°而QPSK是90°。衰落信道下存在随机相位扰动一旦相位估计有偏差或者噪声叠加使相位越过判决边界8PSK很容易错到相邻符号。虽然平均功率恒定包络是它的优点但在不加分集的瑞利信道里这个优点被深衰落完全压住——深衰落时接收能量很小相位判决的置信度跟着急剧下降。8PSK理论闭式误码率非常复杂一般不用解析表达式而是通过蒙特卡洛仿真或MGF数值积分来画曲线。实际仿真里你会发现8PSK在L1时曲线下降得比QPSK慢很多达到1e-2误码率大约需要多4dB左右信噪比这正好对应星座最小距离8.3dB的损失的一部分。3.4 16QAM幅度和相位联合受害16QAM是三种高阶调制里最复杂的一种它同时用幅度和相位承载信息。星座图上12个点不再是等幅的内圈点能量低、外圈点能量高。平均功率归一化后最小距离只有0.632判错边界很窄。瑞利衰落对16QAM特别不友好因为衰落会直接扭曲接收星座的幅度分布。某个符号原本落在内圈某个点经过一个小的 h 后接收点向原点收缩另一个符号落在外圈经过一个大的 h 后向外扩展。不同符号遭受不同的幅度缩放判决区域发生畸变误码率因而远高于相同平均信噪比下8PSK的表现。此外16QAM的峰均比高对功放线性度和自动增益控制也更敏感但这些在纯链路仿真中体现不出来。4. 仿真程序搭建与关键代码拆解4.1 参数设计与公平性前提开始写代码之前必须先想清楚几个参数否则结果没有意义。第一横轴必须用每比特信噪比 Eb/N0不能直接用符号信噪比 Es/N0。BPSK每符号只有1比特16QAM每符号有4比特如果横轴统一用Es/N016QAM会“看起来”性能和BPSK差不多但这是错觉因为它每个符号里携带的信息量是BPSK的4倍。只有用Eb/N0做横轴才能公平比较“传输一个比特需要花多少信噪比”。第二衰落信道的平均功率要归一化也就是 E[|h|²] 1。否则L2相比L1多了一条支路平均接收功率翻倍误码率改善到底是来自功率翻倍还是来自分集就没法区分了。我们这里每条支路都归一化合并后的平均信噪比才真正等于 L·γ̄。第三每个信噪比点上的蒙特卡洛符号数要足够。我在后面的试验中用 N 5e5 个符号目标是能统计学可靠地估计到1e-4量级的误码率。有个经验法则期望的错误比特数至少要有几十个如果某个信噪比点只测出几个错误那这个点的误码率读数基本是噪声不上不下乱跳。4.2 发送、信道、MRC合并一段可以直接跑通的核心代码下面的MATLAB代码省略了外层循环和具体的星座表函数保留了链路最核心的结构你在自己的工程里照这个框架扩展就行。N 5e5; % 每个SNR点的符号数 k log2(M); % 每符号比特数M2/4/8/16 EbN0_dB 0:2:24; % 在循环内部某个EbN0点上的处理如下 EbN0 10^(EbN0_dB(idx)/10); EsN0 k * EbN0; % 符号信噪比 % --- 发送端随机比特 - 调制符号平均功率归一化到1 bits randi([0 1], 1, N*k); txBits reshape(bits, k, N).; symIdx bi2de(txBits, left-msb); % 十进制符号索引 x constellation(M, symIdx 1); % 查星座表平均功率1 % --- 瑞利信道L条独立支路 h (randn(L,N) 1j*randn(L,N)) / sqrt(2); % --- 加性高斯白噪声复噪声每维方差N0/2 N0 1 / EsN0; % 符号能量归一化后 n sqrt(N0/2) * (randn(L,N) 1j*randn(L,N)); % --- 接收与MRC合并 r h .* x n; % 每根支路接收信号 w conj(h); % MRC权重共轭信道 g sum(abs(h).^2, 1); % 合并增益 sum|h_l|^2 z sum(w .* r, 1) ./ g; % 除以增益恢复发送星座尺度 % --- 最小欧氏距离判决通用避免手写阈值 diffMat abs(z. - constellation); % N x M [~, estIdx] min(diffMat, [], 2); estBits de2bi(estIdx-1, k, left-msb); % --- 统计误比特数 bitErr sum(estBits(:) ~ bits(:)); ber bitErr / (N*k);这里有个很容易写错的地方要专门提醒MRC合并后必须除以增益 g。如果不除以 gz 的信号部分是 g·x而 g 是随信道随机变化的直接把 z 丢进星座判决函数星座点的尺度一直在漂移误码率会异常高或者看起来“永远降不下去”。除以 g 之后z 恢复成 x 等效噪声等效噪声功率与 g 成反比这时再用固定星座做最小距离判决才是正确的。4.3 星座映射与判决统一用最小欧氏距离我建议不要给每种调制手写一组判决阈值尤其是16QAM手写阈值容易出错且不好扩展到更高阶调制。统一做法是发送端维护一个星座点向量接收端对合并后的符号计算它到所有星座点的欧氏距离取最近点索引再通过索引反查比特。这样代码结构统一换调制方式时只需要换星座表。星座表定义注意两个细节QPSK要用格雷映射16QAM的标准星座坐标取 [-3, -1, 1, 3] 的笛卡尔积然后除以 sqrt(10) 做平均功率归一化。这样星座表的平均能量正好是1与信道模型里的 Es1 保持口径一致。4.4 蒙特卡洛次数多少才可信很多同学的误码率曲线最后一段“翘起来”大概率不是算法问题而是符号数不够。比如你目标是测到1e-4却只发了1e4个符号那这个信噪比点上如果碰巧没有错误误码率就被记为0在log坐标里直接掉到图外如果碰巧有1个错误误码率就是1e-4。这两种结果都不可用。我的经验是目标误码率比要测的最低误码率再低一个量级。要稳定显示1e-3附近的曲线N 5e5 是起步值要测到1e-4N 至少要到5e6。时间不够时可以先用低N跑全范围找到大致拐点再在重点信噪比区间用大N加密效率会高很多。5. 实测结果该怎么读四条曲线背后的设计含义5.1 整体走势BPSK/QPSK重合高阶调制被“惩罚”把四种调制和L1/2/4组合下的BER曲线画在同一张图上最直观的结论有三个。第一BPSK和QPSK的曲线在三种分集阶数下几乎完全重合差距不超过0.1dB。这是因为相干检测下QPSK本质就是两路正交BPSK格雷映射又没有额外的比特损失。所以在瑞利衰落信道里如果每符号传输2比特直接选QPSK不要犹豫性能和BPSK一样好频谱效率却翻倍。第二8PSK在L1时比QPSK差约4dB16QAM比QPSK差约7-8dB以1e-2误码率为参考点而且差距会随着误码率要求变严而拉大。这说明高阶调制在没有分集的衰落环境里非常吃亏单纯加大发射功率去补这个差距代价极高。第三增加分集阶数后所有调制方式的曲线斜率都变陡。L2相比L1达到1e-2所需Eb/N0大约下降8-9dBL4相比L1大约下降12-13dB。不同调制之间的“绝对差距”在L增大后有所缩小但相对排序不变。5.2 分集阶数与调制阶数的匹配用表格说话为了方便起见我把本次仿真的相对读数整理成表。表里的“0”代表BPSK在L1下达到1e-2所需Eb/N0其他数字是相对这个基准的差值负值代表所需信噪比更低。调制方式L1 相对需求L2 相对需求L4 相对需求BPSK0.0 dB-8.7 dB-12.6 dBQPSK0.1 dB-8.6 dB-12.5 dB8PSK4.2 dB-5.5 dB-9.8 dB16QAM7.8 dB-2.8 dB-7.4 dB这张表读出来的信息很实用如果你要求误码率1e-2、可用信噪比只有10dBL1时能用QPSK但用不了8PSK和16QAM加上L2之后8PSK瞬间变得可行16QAM还差一些如果升级到L416QAM也能站稳。这就是“分集与调制匹配”的含义——调制阶数决定频谱效率的天花板分集阶数决定可靠性下限。需要强调这些数值是本次仿真条件下的近似读数不同随机种子、不同衰落生成方式会有零点几到1dB的浮动趋势才是可迁移的结论。5.3 为什么分集增益不能简单地“当成加几dB功率”经常有人问L2让所需信噪比下降8-9dB是不是相当于把发射功率提高了8-9dB在某个固定误码率参考点上可以这么近似但换个误码率目标你会发现这个“等效增益”不是常数。因为分集改变了误码率曲线的斜率而不是简单地把曲线往左平移。这就是为什么用分集对抗衰落本质上是改变性能曲线的形状而不是单纯增加功率预算。设计系统时一旦明确了目标误码率就不要说“分集增益约等于多少dB”而要具体看目标误码率处的读数。6. 仿真实验里的典型误区与排查建议6.1 误区一横轴用Es/N0四条曲线互相“骗人”我在4.1里强调过但这里值得单独拿出来作为排错经验。如果用Es/N0做横轴16QAM和QPSK的曲线会靠得很近甚至16QAM在某些信噪比点看起来比8PSK还“好”。这不是真的只是因为每个16QAM符号携带4比特而横轴没有除以每符号比特数。正确的做法是统一用Eb/N0也就是在循环里先把Es/N0除以k。凡是画出来出现“调制阶数越高性能越好”这种反直觉结果的先检查这一步。6.2 误区二MRC合并后忘了除以增益判决尺度漂移这个问题我在代码注释里特意标了。现象是L1时曲线还算正常L加到2或4之后低信噪比段BER反而升高或者曲线在中段出现异常平台。原因就是 z 的信号幅度随 sum(|h|²) 随机漂移你把一个幅度一直在变的量直接丢进固定星座判决区域。线性的修正方式就是在合并后除以 g。这一点做完曲线马上恢复正常。6.3 误区三从理想信道估计换成导频估计分集增益大幅缩水入门仿真里都用理想估计也就是直接把真实的 h 拿来做MRC权重。但实际系统里 h 是从导频里估计出来的估计误差在高阶调制下会被放大。常见表现是16QAM在L4时的误码率曲线有一个“地板”无论怎么增加信噪比都降不下去。这不是分集理论错了而是导频密度不够导致信道估计精度跟不上升噪比。想研究这个问题可以在仿真里给 h 加一个估计误差h_est h e其中 e 是方差取决于导频信噪比的高斯噪声看看分集增益会退化多少。这个实验做完你会对导频开销的意义有更深的理解。6.4 扩展方向从平坦瑞利到频率选择性信道本实验假设平坦块衰落信道在一个符号内不变。如果后面想把问题做深可以考虑频率选择性信道即不同时延的径相互叠加。这时MRC不再够用通常要搭RAKE接收机把每条时延支路也看作一个分集支路再做合并。你会发现分集思想并没有变只是“支路”的定义从空间天线扩展到了多径时延。理解了平坦瑞利下的MRCRAKE的原理只需要一天就能上手。最后再分享一个排查经验。每次跑完仿真先别急着贴曲线随便挑一个信噪比点把理论值和仿真值对一下。BPSK、L1有任何信噪比下都有闭式公式理论对不上就说明代码有bug不要往下跑其他调制。我这个习惯帮我省掉了大量在8PSK和16QAM上无意义的时间浪费。