最大比合并MRC原理与MATLAB仿真:从权重推导到瑞利信道误码率验证
2026/9/14 5:41:51 网站建设 项目流程

简介:最大比合并(MRC)是无线通信中对抗多径衰落的关键接收分集技术,它利用多个接收天线对同一信号进行加权合并,从而最大化输出信噪比。这份基于MATLAB的仿真实例面向通信工程与信号处理学习者,资源内含两段m脚本:主程序用于实现信道估计、加权合并与解码流程,调制器程序负责产生符合瑞利信道特性的输入信号,二者配合可在多径衰落环境下直观展示分集增益,并完整覆盖从信号产生到合并输出的全部环节。压缩包仅2个文件,全部为m文件,大小仅2KB,代码短小精悍,便于快速阅读与二次修改。已有562人学习,若希望理解最大比合并原理、对比选择性合并和等增益合并,或为课程设计寻找可直接运行的参考模板,这是一个高效的起点。

1. 最大比合并(MRC)为什么在所有线性分集合并里最“不亏”

接收机只靠单天线时,瑞利衰落很容易把瞬时信噪比打到 -30dB,误码率指标直接崩盘。最大比合并(Maximum Ratio Combining, MRC)不做等增益叠加,而是让每个天线支路的信号先乘上对应信道响应的共轭再合并。这个操作看似只是“加个权重”,却能让有用信号按功率加权、噪声按非相关叠加,最终合并信噪比等于各路信噪比之和。换言之,在信道估计足够准的前提下,MRC 是所有线性合并方式中最接近理论极限的。下面这份项目来自一段只有 MRC.m 和 modulator.m 两个源码文件的 MATLAB 分集链路,我会把权重推导、仿真实现、瑞利信道下的误码率验证和常见坑讲透。适合正在做物理层链路仿真、或者想把分集脚本整理成可复用模块的工程师。

2. MRC 的数学模型与权重向量的信噪比最大化推导

2.1 复基带下的多天线接收信号模型

发射端发送一个能量归一化的复符号 (s),满足 (E{|s|^2}=1)。接收端用 (N) 根天线同时接收,经过下变频和采样后,第 (i) 根天线得到:

[ y_i = h_i \cdot s + n_i ]

其中 (h_i) 是第 (i) 根天线到发射端的复信道增益。对瑞利信道,(h_i) 可以建模为均值为 0、方差为 1 的独立复高斯随机变量;(n_i) 是复加性高斯白噪声,实部虚部方差各为 (N_0/2),且不同天线间独立。这个模型没有把符号序号标出来,是因为 MRC 的处理是对每个符号独立进行的,单符号建模已经足够说明原理。写成向量形式:

[ \mathbf{y} = \mathbf{h} \cdot s + \mathbf{n} ]

接收端能拿到的数据是向量 (\mathbf{y}),以及依靠导频估计得到的 (\mathbf{\hat{h}})。MRC 的目标是构造一个线性合并权重向量 (\mathbf{w}),把 (\mathbf{y}) 的所有支路合并成一个标量 (z):

[ z = \mathbf{w}^H \mathbf{y} = \mathbf{w}^H \mathbf{h} s + \mathbf{w}^H \mathbf{n} ]

此时问题转化为:在已知 (\mathbf{h}) 的情况下,怎样选 (\mathbf{w}),才能让 (z) 的瞬时信噪比最大。

2.2 从柯西-施瓦茨不等式到权重取共轭

合并后信号功率是 (P_s = E_s |\mathbf{w}^H \mathbf{h}|^2),噪声功率是 (P_n = N_0 |\mathbf{w}|^2)。于是合并输出的瞬时信噪比为:

[ SNR_w = \frac{E_s}{N_0} \cdot \frac{|\mathbf{w}^H \mathbf{h}|^2}{|\mathbf{w}|^2} ]

用柯西-施瓦茨不等式,(|\mathbf{w}^H \mathbf{h}|^2 \le |\mathbf{w}|^2 |\mathbf{h}|^2),等号成立当且仅当 (\mathbf{w}) 与 (\mathbf{h}) 线性相关。因此最大瞬时 SNR 为:

[ SNR_{\max} = \frac{E_s}{N_0} |\mathbf{h}|^2 = \frac{E_s}{N_0} \sum_{i=1}^N |h_i|^2 ]

对应的最优权重可以取 (\mathbf{w}=\mathbf{h}) 的任意非零复常数倍。如果所有支路噪声功率相同,直接令 (\mathbf{w} = \text{conj}(\mathbf{h})) 就是标准 MRC 实现。这个结果非常漂亮:不需要做任何搜索,也不需要计算协方差矩阵,只要把每个天线的信号乘以对应信道响应的共轭再相加。

但要注意一个细节:如果各支路噪声功率不一致,例如靠近发热元件的射频链路底噪偏高,那么权重的一般形式是 (w_i = \text{conj}(h_i)/\sigma_i^2)。因为噪声更高的支路即使信道增益很大,它对合并 SNR 的贡献也应该被压低。这个推广形式在后面的仿真中不会用到,但在实测系统中很常见。在 MATLAB 里,对应的核心代码压缩到几行:

z = conj(hEst) .* rx; % 逐天线乘共轭 zCombined = sum(z, 1); % 把所有支路相加

这里conj(hEst)是逐天线取共轭,.*完成复数乘法,sum把多个支路累加。先乘后加的顺序不能反过来,否则会出现把所有信号先求和再乘共轭,导致不同传播路径的相位没有被补偿对齐。

2.3 MRC、EGC、SC 三者放在同一张表里

选择性合并(SC)每个符号只选择瞬时信噪比最大的天线,最简单,但浪费了其余天线的能量。等增益合并(EGC)把所有天线信号等幅相加,只需要估计相位,不需要精确估计幅度。MRC 则需要完整的信道幅度和相位信息。下面这张表把三者的输出信噪比和控制条件放在一起:

合并方式CSI 需求输出瞬时 SNR
SC只需选择最大支路(\max_i \gamma_i)
EGC相位,幅度归一化(\frac{1}{N}(\sum_i
MRC完整 CSI(幅度+相位)(\frac{E_s}{N_0} \sum_i

注意 EGC 的输出 SNR 用到了幅度求和,由于 (|h_i|) 的平均值是 (\sqrt{\pi/2}),所以 EGC 会有固定的功率损失。对两分支独立瑞利信道,EGC 相对 MRC 大约损失 1.8dB;随着分支数增加,这个差值会变化,但 MRC 始终优于或等于 EGC。SC 的输出 SNR 是所有天线里的最大值,它提供分集阶数 (N),但平均 SNR 不随 (N) 线性增长。因此,当系统对可靠性要求高、CSI 获取成本可接受时,MRC 是第一选择;硬件做不了太多复乘时,SC 仍然有存在的理由。

3. 从 modulator.m 到 MRC.m:一套可复现的 MATLAB 分集仿真链路

3.1 发射端调制器的符号映射与能量归一化

原压缩包里有两个文件,modulator.m 负责把二进制比特流变成复数基带符号。为了能控制变量,我选用 QPSK 作为默认调制方式。下面是一个可运行的实现:

function sym = modulator(bits, M) % bits: 列向量,长度是log2(M)的整数倍 % M: 调制阶数,仅支持QPSK k = log2(M); bitsMatrix = reshape(bits, k, []).'; sym = (2*bitsMatrix(:,1)-1) + 1j*(2*bitsMatrix(:,2)-1); sym = sym / sqrt(2); end

这段代码的输入假设是:bits是二进制 0/1 列向量,长度是 2 的倍数。reshape把每两个比特组成一行,第一列变成 I 路幅度,第二列变成 Q 路幅度,0 映射为 -1,1 映射为 +1。除以sqrt(2)是为了让 QPSK 星座图的平均符号能量等于 1。之所以强调能量归一化,是因为后面加性高斯白噪声的方差是按符号能量为 1 设计算的,如果星座点能量是 2 或 4,那仿真的 Eb/N0 曲线会比真实值偏移 1.5dB 或 3dB。值得注意的是,这里没有加入成型滤波器和上变频,原因是分集合并主要作用在复基带等效信道,射频部分引入的载波频偏和相位噪声可以在后续模块单独建模。

3.2 MRC 函数的入参设计与向量化实现

MRC.m 是整个压缩包里的核心。函数需要接收两个矩阵:rxN_ant x N_sym复数矩阵,hEst是与rx同尺寸的信道估计。函数内部不再逐符号循环,而是利用 MATLAB 的向量化避免不必要的时延。我的实现如下:

function [combSym, combSnr] = MRC(rx, hEst) % rx: N_ant x N_sym 接收信号矩阵 % hEst: N_ant x N_sym 信道估计,与rx同尺寸 % combSym: 1 x N_sym 合并后符号 % combSnr: 1 x N_sym 合并后瞬时SNR倍数 w = conj(hEst); % 最优权重:共轭信道 combSym = sum(w .* rx, 1); % 沿天线维合并 combSnr = sum(abs(hEst).^2, 1); % 瞬时SNR与Es/N0的比例 end

注意combSnr并不是实际绝对信噪比,而是表示合并后的信道增益和。在进行误码率统计时,硬判决只需要combSym的相位或位置;如果要计算软信息,则需要把combSnr乘上 (N_0) 作为对数似然比缩放因子。很多实现里会顺手把输出除以sum(abs(hEst).^2, 1),这能把信号幅度恢复为原始星座尺度,但会抵消掉合并增益,导致后续软判决时无法利用信道信息,所以我建议把“合并”和“归一化”分成两步。

3.3 主仿真循环:瑞利信道生成、噪声叠加与 BER 统计

单有调制和合并还不够,还需要一个驱动它们的主脚本。这里给出一个适合快速迭代的蒙特卡洛循环:

N_ant = 2; % 天线数 N_bits = 1e6; % 每个信噪比点发送的比特数 EbN0_dB = 0:2:20; % 扫描点 M = 4; % QPSK k = log2(M); BER = zeros(size(EbN0_dB)); for idx = 1:length(EbN0_dB) Eb_N0_lin = 10^(EbN0_dB(idx)/10); N0 = 1 / (Eb_N0_lin * k); % Es = 1, k bits per symbol bitErrors = 0; for mc = 1:10 % 分块累计,避免内存占用过大 bits = randi([0 1], N_bits/10, 1); txSym = modulator(bits, M); N_sym = length(txSym); h = (randn(N_ant, N_sym) + 1j*randn(N_ant, N_sym)) / sqrt(2); n = sqrt(N0/2) * (randn(N_ant, N_sym) + 1j*randn(N_ant, N_sym)); rx = repmat(txSym.', N_ant, 1) .* h + n; [rxComb, ~] = MRC(rx, h); rxBits = [(real(rxComb) > 0); (imag(rxComb) > 0)]; bitErrors = bitErrors + sum(rxBits(:) ~= bits(:)); end BER(idx) = bitErrors / N_bits; end

这里N0 = 1 / (Eb_N0_lin * k),因为调制后符号能量 (E_s=1),每个符号携带 (k) 比特,所以 (E_s/N_0 = k \cdot E_b/N_0)。h每列服从标准复高斯,方差为 1,功率也是 1。rx的物理意义是:把发射符号复制到每一根天线上,乘以各自的复信道衰落,再叠加独立的复噪声。rxComb解调时直接判实部虚部符号,由于 MRC 输出没有归一化,判决门限仍是 0,所以可行。分块数取 10,是为了避免一次性生成 100 万个符号对应的rx矩阵占用过多内存;实际影响可以忽略。

主仿真循环中可调参数较多,我常用的清单如下:

参数推荐值为什么这样选
N_ant2 或 42 天线能看到 3dB 增益,4 天线更容易暴露分集阶数问题
N_bits1e6 ~ 5e6保证 BER 统计稳定到 1e-4 量级
M4(QPSK)能量归一化简单,硬判决公式直观
衰落类型每符号独立瑞利不需要额外的交织器设计,收敛更快

4. 瑞利信道下 MRC 误码率验证:理论闭式解与调试方向

4.1 用 N 支路理论 BER 曲线校验蒙特卡洛结果

对于 BPSK 或 QPSK,在 N 分支独立同分布瑞利信道下采用 MRC 合并,误比特率有闭式表达式:

[ P_b = \left(\frac{1-\mu}{2}\right)^N \sum_{k=0}^{N-1} \binom{N-1+k}{k} \left(\frac{1+\mu}{2}\right)^k ]

其中 (\mu = \sqrt{\bar{\gamma}/(1+\bar{\gamma})}),(\bar{\gamma}) 是每比特的平均信噪比 (E_b/N_0)。这个表达式可以直接画出来,作为仿真结果的对照基准。在 MATLAB 里我通常这样写理论曲线:

N_ant = 2; ebno_dB = 0:0.5:20; ebno = 10.^(ebno_dB/10); mu = sqrt(ebno ./ (ebno + 1)); Pb = zeros(size(ebno)); for k = 0:N_ant-1 Pb = Pb + nchoosek(N_ant-1+k, k) .* ((1+mu)/2).^k; end Pb = ((1-mu)/2).^N_ant .* Pb; semilogy(ebno_dB, Pb, 'k-');

这段代码的作用是画出 N 分支 MRC 在瑞利信道下的理论 BER 曲线。mu的表达式来自任意两支路的 BPSK 误码率积分,N 分支时用组合数展开。理论曲线放在仿真图上,除了能确认实现是否正确,还能帮助观察“斜率”:分集阶数越高,曲线高信噪比区域的下降斜率越陡。如果仿真点在高 SNR 区域出现平缓,那基本可以断定权重实现有问题,而不是随机起伏。

4.2 快速自检:合并后 SNR 是否等于各路 SNR 之和

第 3 章里的combSnr可以在主循环中顺手统计。在理想信道估计下,N=2、平均每符号 SNR 为 (E_s/N_0=1) 时,combSnr的均值应当等于 2。推广到任意信噪比,只需要在仿真里记录:

singleSnr = mean(abs(h).^2, 2); % 每根天线平均信道功率 snrAfterMrc = mean(combSnr); % 理论倍数,均值应约等于N_ant

如果snrAfterMrc明显小于 N_ant,说明天线间信道没有形成独立衰落,或者h生成时忘了除以sqrt(2),导致每个支路平均功率只有 0.5,合并后自然少 3dB。这是一个非常隐蔽的问题,因为 BER 曲线看起来还是有分集效果的,只是整体向右偏。

4.3 实际调试中常遇到的三个坑

第一个坑是噪声功率写错。生成复噪声时如果写成sqrt(N0)而不是sqrt(N0/2),实部虚部总功率是 (N_0),加在符号上后实际 SNR 减半,曲线右移约 3dB。这个问题在只看 BER 图形时不容易发现,因为曲线形状不变。第二个坑是权重退化成了 EGC。如果代码中写了w = hEst ./ abs(hEst),那每个支路只保留了相位,MRC 退化为等增益合并,损失大约 1.8dB;此时 BER 曲线在高 SNR 区域依然下降,但斜率会变缓,新手往往误认为是信道估计误差。第三个坑是信道快速衰落时没有把hrx一一对应,常见的是每个符号循环里只生成了一个1 x N_anth向量,导致所有符号共用同一衰落,那么在高 SNR 区域分集效果退化,曲线斜率从 (N) 变成了 1。下表总结了这三个症状和对应的检查点:

症状可能原因检查方法
BER 曲线整体右移 3dB噪声功率多算一倍打印mean(abs(n(:)).^2),应与 N0 相等
高 SNR 区域斜率不足MRC 被写成 EGC检查权重是否保留幅度项
分集阶数不符合预期信道未独立生成计算 h 行间相关系数,应在 0 附近

这些坑在实际从数组代码迁移到向量化代码时更容易遇到。我的建议是每次改动后先跑一个低信噪比点,比如 0dB,对比理论 BER,误差超过 10% 就先停下来定位,不要直接跑完整扫描。

5. 把 MRC 模块化:信道估计误差回归测试与快速验证技巧

5.1 给 MRC 包一层可配置的信道失配

实际系统里hEst永远不会等于h。为了量化 CSI 误差对 MRC 的影响,可以改造调用处而不是函数内部:

hEst = h .* (1 + sigmaE * (randn(size(h)) + 1j*randn(size(h)))/sqrt(2)); [combSym, combSnr] = MRC(rx, hEst);

sigmaE是归一化信道估计误差标准差。当sigmaE=0.05时,MRC 的性能损失通常在 0.2dB 以内;sigmaE增大到 0.2 时,高信噪比下会出现误差平台。这个测试的好处是,不需要改 MRC 函数本身,就能知道系统对导频密度或插值算法的敏感度。

5.2 利用 N_ant=1 的退化场景做回归测试

每改动一次 MRC.m,先跑 N_ant=1。这时 MRC 退化为匹配滤波,BER 必须和单天线瑞利信道曲线重合。如果重合,说明噪声功率、星座映射、判决规则都没问题。然后把 N_ant 改成 2,若低信噪比区域获得约 3dB 增益,说明空间分集链路是通的。整个验证流程不到半分钟,却能挡住绝大多数低级错误。

5.3 一个容易被忽略的工程技巧:检查每根天线的平均信道功率

生成瑞利信道时,矩阵里的每个元素功率应该为 1。可以在仿真开始前先执行mean(abs(h(:)).^2),如果结果不是近似 1,后面所有的信噪比换算都会偏。这个检查虽然简单,但它能一次性排除信道系数缩放错误、随机数生成器维度错误、数据组织方式错误三类问题。配合前面提到的combSnr均值检查,基本可以把 MRC 从“看起来能跑”提升到“确定结果可信”。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询