
简介面向无线通信方向学生与研究人员的MATLAB仿真资源专注实现协作通信系统中DF解码转发协议下的中断概率分析。资源基于源-中继-目的节点链路融合Rayleigh衰落信道建模、8PSK调制、CRC校验与维特比译码等模块能够统计不同信噪比条件下的中断事件输出中断概率性能曲线有助于快速理解DF协议实际运算流程与通信可靠性评估方法。压缩包共14个文件以12个m脚本为主涵盖信道仿真、误码统计、状态转移、编解码等核心功能另附asv自动保存文件与txt程序说明包体约9KB代码结构清晰便于直接查阅与二次开发。目前已有200人下载学习尤其适合通信课程设计、毕业设计或初步科研复现场景。1. 为什么DF协议的中断概率要在MATLAB里先算一遍协作通信里最常用的中继策略是DFDecode-and-Forward解码转发中继先解出源数据再重新发送相比AF放大转发它能切断噪声累积代价是“中继解不出来”时会直接掉链子。所以DF系统的性能指标不能只看平均信噪比中断概率才是那个一眼能看出协议边界、SR链路好坏和分集增益的统计量。中断概率本质上是一条CDF曲线瞬时互信息低于目标速率R的概率。它在瑞利衰落信道下有闭式形式却很少有人在第一次实现时就把解析式和仿真对上。本文会按“模型→闭式推导→MATLAB蒙特卡洛→结果验证→工程坑”这条路把一个单中继、半双工的DF系统彻底跑通。适合正在做协作通信课程设计、仿真验证或者想把DF作为基线协议再扩展成多中继方案的工程师。2. DF协议的中断概率模型先把信道和门限说清楚2.1 三节点系统模型与参数定义DF中断概率分析的经典场景是一个源节点S、一个中继节点R、一个目的节点D。所有链路都是瑞利块衰落即在一个传输块内信道系数不变块与块之间独立变化。信道系数记为 $h_{SD}$、$h_{SR}$、$h_{RD}$服从零均值复高斯分布对应链路平均功率分别是 $\sigma_{SD}^2$、$\sigma_{SR}^2$、$\sigma_{RD}^2$。发射端功率为 $P$噪声功率为 $N_0$定义平均信噪比 $\rho P / N_0$则瞬时接收信噪比是 $\rho |h_{ij}|^2$。系统采用半双工DF协议一个端到端传输占用两个等长时隙。第一时隙S广播数据R和D同时接收第二时隙R把解码后的数据转发给D。若R在第一时隙没能正确解码则第二时隙S可以继续发同一份数据此时系统退化成直传。为了方便工程实现下面所有链路瞬时容量都用以下形式近似$$C_{ij} \log_2(1 \rho |h_{ij}|^2)$$当两个链路做最大比合并时等效接收信噪比写成 $\rho(|h_{SD}|^2 |h_{RD}|^2)$这是一个在高信噪比下很接近真实“和容量”的近似也是闭式推导能继续写下去的关键。符号含义典型初始值$R$端到端目标速率1 bit/s/Hz$\rho$平均发射信噪比0~25 dB$\sigma_{SD}^2$S→D链路平均功率0.5$\sigma_{SR}^2$S→R链路平均功率1.0$\sigma_{RD}^2$R→D链路平均功率1.0$N$蒙特卡洛样本数$10^6$2.2 DF中断事件的两种发生路径DF中断不能只写一个“容量小于R”的公式。由于中继可能解码失败中断概率需要按全概率公式拆成两个互斥事件事件 A中继解码失败即 $C_{SR} 2R$。这里为什么是 $2R$ 而不是 $R$因为整个消息要在两个半双工时隙里传完平均速率是R时第一时隙内S→R链路必须在半帧时间内把完整消息塞过去折算下来每个时隙至少承载 $2R$ 的速率信息。若中继失败系统退化为直传此时中断条件是 $C_{SD} R$。事件 B中继成功解码即 $C_{SR} \ge 2R$。此时D把第一时隙的直射信号和第二时隙的中继转发信号做能量合并等效容量为 $\log_2(1 \rho(|h_{SD}|^2 |h_{RD}|^2))$中断当它小于 $2R$。把这两个事件写成闭式表达式就是$$P_{out} P(C_{SR} 2R) \cdot P(C_{SD} R) P(C_{SR} \ge 2R) \cdot P\left(\rho(|h_{SD}|^2 |h_{RD}|^2) 2^{2R} - 1\right)$$这个形式的好处是每一项都能用指数分布CDF直接算出来不需要做数值积分。2.3 瑞利信道下的闭式推导瑞利衰落时 $|h_{ij}|^2$ 服从均值为 $\sigma_{ij}^2$ 的指数分布所以 $\rho |h_{ij}|^2$ 的互补CDF是$$P(\rho |h_{ij}|^2 \ge x) \exp\left(-\frac{x}{\rho \sigma_{ij}^2}\right)$$直接链路那一项可以立刻写出来$$P(C_{SD} R) 1 - \exp\left(-\frac{2^R - 1}{\rho \sigma_{SD}^2}\right)$$中继成功概率类似把分母换成 $\sigma_{SR}^2$分子换成 $2^{2R}-1$。剩下最难处理的是两个独立指数随机变量之和 $Z |h_{SD}|^2 |h_{RD}|^2$ 的CDF。当 $\sigma_{SD}^2 \ne \sigma_{RD}^2$ 时$$F_Z(z) 1 - \frac{\sigma_{RD}^2}{\sigma_{RD}^2 - \sigma_{SD}^2} \exp\left(-\frac{z}{\sigma_{RD}^2}\right) \frac{\sigma_{SD}^2}{\sigma_{RD}^2 - \sigma_{SD}^2} \exp\left(-\frac{z}{\sigma_{SD}^2}\right)$$如果两条链路的平均功率相同退化成二阶Gamma分布$$F_Z(z) 1 - \exp\left(-\frac{z}{\sigma^2}\right)\left(1 \frac{z}{\sigma^2}\right)$$把这三块拼起来就是DF协议的解析中断概率。实际编码时我一般把 $F_Z$ 单独写成一个函数这样更换信道参数只需要改输入不用动主流程。这一点对后面做中继位置扫描非常重要。3. MATLAB实现DF中断概率蒙特卡洛和解析曲线一起画3.1 先写一个可复现的向量化蒙特卡洛脚本MATLAB里做信道仿真最忌讳用for i 1:N一层层循环块衰落场景完全能向量化。下面这段代码同时计算DF的蒙特卡洛中断概率和解析值可直接复制运行。%% DF协议中断概率蒙特卡洛 解析解 clear; clc; rng(1234); % 固定随机种子保证结果可复现 rho_dB 0:2:20; % 平均SNR扫描范围 R 1; % 目标速率 [bit/s/Hz] N 5e5; % 每个SNR点的信道样本数 sig2_SD 0.5; % S-D 平均信道功率 sig2_SR 1.0; % S-R 平均信道功率 sig2_RD 1.0; % R-D 平均信道功率 theta_d 2^R - 1; % 直传模式门限 theta_r 2^(2*R) - 1; % 中继链路门限两时隙折算 Pout_mc zeros(size(rho_dB)); Pout_ana zeros(size(rho_dB)); for k 1:numel(rho_dB) rho db2pow(rho_dB(k)); % 生成三路瑞利块衰落信道 hSD sqrt(sig2_SD/2) * (randn(N,1) 1j*randn(N,1)); hSR sqrt(sig2_SR/2) * (randn(N,1) 1j*randn(N,1)); hRD sqrt(sig2_RD/2) * (randn(N,1) 1j*randn(N,1)); % 中继能否在第一个时隙解码 relay_success log2(1 rho * abs(hSR).^2) 2*R; % 中继失败时退化为直传 outage_direct log2(1 rho * abs(hSD).^2) R; % 中继成功时D合并两路信号 outage_relay log2(1 rho * (abs(hSD).^2 abs(hRD).^2)) 2*R; % 中断事件取并集 outage (~relay_success outage_direct) | (relay_success outage_relay); Pout_mc(k) mean(outage); % 解析解 Pout_ana(k) df_outage_analytic(rho, R, sig2_SD, sig2_SR, sig2_RD); end代码里每个SNR点一次性生成 $N$ 个信道样本relay_success、outage_direct、outage_relay都是 $N\times1$ 的逻辑向量mean(outage)就是该SNR点的中断概率估计。这里把中继门限写成2*R直传门限写成R是为了与上一章的全概率拆分保持一致。3.2 解析函数的实现注意指数分布CDF的边界条件df_outage_analytic单独用一个函数实现避免蒙特卡洛和解析式在门限上不一致。函数内部要区分 $\sigma_{SD}^2$ 与 $\sigma_{RD}^2$ 是否相等否则分式分母为零会得到NaN。function Pout df_outage_analytic(rho, R, sig2_SD, sig2_SR, sig2_RD) theta_d 2^R - 1; theta_r 2^(2*R) - 1; % 中继解码失败概率 p_fail 1 - exp(-theta_r / (rho * sig2_SR)); % 直传中断概率 p_direct 1 - exp(-theta_d / (rho * sig2_SD)); % 中继成功概率 p_succ exp(-theta_r / (rho * sig2_SR)); % P(Z z), Z |hSD|^2 |hRD|^2 z theta_r / rho; if abs(sig2_SD - sig2_RD) 1e-12 Fz 1 - exp(-z / sig2_SD) * (1 z / sig2_SD); else a1 sig2_RD / (sig2_RD - sig2_SD); a2 sig2_SD / (sig2_RD - sig2_SD); Fz 1 - a1 * exp(-z / sig2_RD) a2 * exp(-z / sig2_SD); end Pout p_fail * p_direct p_succ * Fz; end这段代码里p_fail * p_direct对应事件Ap_succ * Fz对应事件B。需要特别注意的是theta_r同时出现在中继门限和合并信号门限中这是半双工DF的特征。很多初学者会在这里少乘一个2导致解析曲线整体向右偏移约3dB。3.3 蒙特卡洛样本数与随机数种子怎么设中断概率本身是伯努利随机变量的均值理论标准差为 $\sqrt{P_{out}(1-P_{out})/N}$。当 $P_{out}10^{-3}$ 时$N10^5$ 只能看到大约100次中断事件相对波动达到10%。我一般按目标精度反推样本数目标中断概率下限相对误差要求建议样本数$10^{-2}$5%$4\times10^6$$10^{-3}$10%$10^6$$10^{-4}$20%$10^6$且建议分层抽样rng(1234)固定随机种子能保证每次运行得到完全相同的曲线这在对比不同协议时非常重要。注意不要在一个脚本里反复调用rng(shuffle)否则两次运行无法归因差异来自协议还是来自噪声。4. 仿真结果怎么读验证解析式、观察分集阶数和中继位置影响4.1 把蒙特卡洛和解析曲线画在同一张图画中断概率曲线必须用semilogy因为纵轴跨度经常超过三个数量级。下面代码用matlab画图的核心结构画双曲线并加上分集阶数参考线。figure; plot(rho_dB, Pout_mc, o-, LineWidth, 1.2); hold on; plot(rho_dB, Pout_ana, s--, LineWidth, 1.0); set(gca, YScale, log); grid on; xlabel(平均SNR \rho (dB)); ylabel(中断概率 P_{out}); legend(蒙特卡洛, 解析解, Location, southwest); title(DF协议中断概率仿真与解析对比R 1 bit/s/Hz);当 $N5\times10^5$、SNR低于16dB时圆点和方块曲线应基本重合。如果发现仿真值在低SNR区系统性高于解析值优先检查中继失败时的直传门限是否用了R而不是2R。高SNR区纯蒙特卡洛的抖动是正常的因为中断事件数量变少这正好说明解析曲线存在的价值。4.2 中继位置对中断概率的影响中继位置在仿真里不写坐标而是通过链路平均功率 $\sigma_{SR}^2$ 和 $\sigma_{RD}^2$ 体现。中继靠近源时 $\sigma_{SR}^2$ 大但 $\sigma_{RD}^2$ 会变小反之亦然。固定 $\sigma_{SD}^20.3$把中继分别放在靠近源$\sigma_{SR}^21.8$$\sigma_{RD}^20.4$、中间位置$\sigma_{SR}^21.0$$\sigma_{RD}^21.0$、靠近目的$\sigma_{SR}^20.4$$\sigma_{RD}^21.8$三组参数下跑解析解会看到两组典型现象。靠近源时中继解码成功概率高但R→D会成为瓶颈靠近目的时R→D很好可S→R解码失败变多。因此DF的中断概率曲线不是单调的中间位置通常最稳妥。这个结论用闭式函数扫描一次就知道不需要跑大量蒙特卡洛这也是先把2.3节解析式写出来的真正收益。4.3 和直传、AF协议比DF的优势和天花板把DF的中断概率与直传对比能直观看到分集阶数。直传中断概率在高信噪比下按 $1/\rho$ 衰减而DF在高信噪比下按 $1/\rho^2$ 衰减斜率差一倍这说明DF提供了二阶分集。MATLAB里可以在对数坐标下用线性拟合估算斜率p polyfit(rho_dB(end-4:end), log10(Pout_ana(end-4:end)), 1); fprintf(高SNR段斜率约为 %.2f\n, -abs(p(1)));若算出来的斜率接近2说明中继链路质量足够好分集优势体现出来了。若SR链路平均功率远低于SDDF会退化成直传斜率回到1这时候再叠加多中继或者选择协议才有意义。AF协同比DF多一条限制AF把噪声也放大了闭式推导里等效SNR变成 $\rho |h_{SR}|^2 \rho |h_{RD}|^2 / (1 \rho |h_{SR}|^2 \rho |h_{RD}|^2)$。DF在中继成功区域一定优于AF但中继一旦解码失败DF连“放大转发”这个保底动作都做不了。所以DF适用在中继位置较好、S→R链路稳定度高的场景。要公平对比应该让两种协议使用相同的功率分配和时隙分配否则曲线差别大多来自资源占用而不是协议本身。5. MATLAB实现里最值得记住的四个工程细节5.1 用同一套信道样本对比多个协议比较DF、AF、直传时很多人会分别调用三次蒙特卡洛结果曲线之间的抖动互相独立看起来高低起伏反而掩盖了真实差距。更好的做法是在同一组信道样本上计算所有协议的中断事件这样不同协议之间是“同衰落、同噪声、同运气”差多少就是协议本身的差多少。实现时只要把 $h_{SD}, h_{SR}, h_{RD}$ 保存下来三种协议共用即可。5.2 不要在解析式里写错半双工因子DF解析式最容易出错的地方是常数2到底放在哪个门限。我的习惯是统一记成两句话中继分支所有瞬时容量都按两时隙折算因此容量必须和 $2R$ 比较直传分支只在“中继失败”时使用因此只和 $R$ 比较。这样记忆后无论R取多少仿真和解析都不会出现固定偏移。5.3 高SNR下蒙特卡洛失效时的替代方案当 $P_{out}$ 低于 $10^{-4}$ 时纯蒙特卡洛需要 $10^6\sim10^7$ 个样本才能不抖。这时候可以用重要性采样或直接依赖解析解。更快的工程折中是把SNR扫描步长加大比如原来2dB一档改成4dB一档然后在semilogy图上用线性插值显示趋势。不要为了追求曲线光滑而盲目把每点样本数提升到 $10^7$MATLAB内存和计算时间都会变得不可控。5.4 保存一条能复用的函数接口把仿真入口封装成Pout df_outage_sim(rho_dB, R, sig2_SD, sig2_SR, sig2_RD, N)后续做中继位置扫描、功率分配优化、多中继排序时所有上层代码都不用改动。这也是把DF基线协议做好后再往AF、选择中继、限幅中继扩展时最值得保留的架构。本文还有配套的精品资源点击获取