
在多节点无线通信中中继协作是提升传输可靠性和覆盖范围的重要手段。放大转发Amplify-and-Forward, AF协议因为实现简单、时延低成为协作通信中最常见的中继模式之一。但传统 AF 方案大多依赖信道状态信息Channel State Information, CSI做相干检测这在快速时变信道中代价很高。差分调制技术正好可以在接收端避免实时 CSI 估计把两者结合就形成了差分放大转发Differential Amplify-and-Forward, DAF方案。本文将围绕“多节点无线通信中差分放大转发技术的性能研究”这一主题给出从系统模型、协议原理到 Matlab 仿真实现的全流程教程。文章会提供可直接运行的 Matlab 代码逐段解释差分编码、中继放大、目的端差分检测、多中继合并等关键环节最后给出仿真结果分析和常见排错思路。无论你是通信方向的在校研究生还是刚接触 Matlab 仿真开发的工程师都能按本文一步步复现多节点 DAF 系统的性能曲线。1. 研究背景与核心概念1.1 为什么要研究中继协作与放大转发无线信道中的路径损耗、阴影衰落和多径衰落会显著影响接收信号质量。当源节点与目的节点之间没有直达链路或者直达链路质量很差时仅靠提高发射功率往往不经济还会造成干扰。中继协作的思想是在源节点 S 和目的节点 D 之间引入一个或多个中继节点 R让 S 先发信号给 R再由 R 转发给 D形成一条更可靠的虚拟链路。多节点无线通信中的中继协作主要有三种协议放大转发AF中继对接收到的模拟信号直接放大后转发不进行解码。解码转发Decode-and-Forward, DF中继先解码出原始数据再重新编码转发。压缩转发Compress-and-Forward, CF中继对接收信号压缩后转发适合某些中继信道模型。AF 的优点是实现复杂度低、时延小不需要在中继节点做复杂的解调和译码操作。缺点是中继在放大信号的同时也会放大第一跳的噪声造成噪声累积。尽管如此AF 依然是协作通信研究中最重要的基准方案之一。本文讨论的 DAF 是 AF 协议与差分调制的结合。所谓差分调制是指将信息承载在相邻符号之间的相位差或幅度差上接收端检测时只需要比较前后相邻符号的差值不需要知道当前信道系数的准确值。这样一来DAF 既保留了 AF 中继的简洁性又避免了实时 CSI 估计特别适合信道变化较快、反馈开销受限的场景。1.2 差分调制解决什么问题普通相移键控PSK在接收端相干解调时需要先估计出信道的幅度和相位。在快衰落信道中信道可能在一个数据帧内变化多次想要准确估计 CSI 需要插入大量导频符号这会降低频谱效率。差分相移键控DPSK的思路是发送端对当前时刻符号和前一时刻符号做差分编码接收端用相邻两个符号的乘积来恢复信息。由于相邻符号经历的信道衰落往往非常接近两者之间的相位差和信道相位可以相互抵消因此接收端不需要知道 CSI 就能完成解调。代价是差分检测的噪声项比相干检测大通常会造成约 2~3 dB 的性能损失但换来的是实现复杂度和开销的大幅下降。1.3 多节点 DAF 系统的基本结构本文研究的多节点无线通信场景可以描述为一个源节点 S经过 N 个中继节点 R_1, R_2, ..., R_N将信息传送给目的节点 D。所有节点都配单天线信道为瑞利块衰落信道。发送端使用差分 M-PSK 调制中继采用放大转发策略目的节点把所有中继分支的信号做等增益合并后再进行差分检测。与单中继协作相比多中继协作能提供额外的空间分集增益有效对抗衰落。在差分调制场景下因为接收端无法获得每一条链路的精确 CSI传统最大比合并MRC并不能直接使用所以通常采用等增益合并EGC作为次优合并方案。这也是本文仿真实现的重点之一。如果想进一步评估系统的信息论性能比如信道容量或可达速率那么还会涉及对信道统计特性的分析必要时可以借助信息熵等指标来刻画信源和信道的不确定性。不过在本文中我们主要从误比特率BER角度展开性能分析。2. Matlab 环境准备与仿真总体设计2.1 运行环境说明本文提供的 Matlab 仿真代码不需要额外的通信工具箱完全基于 Matlab 基础函数实现因此版本兼容性较好。示例代码在 Matlab R2021a 和 R2023b 环境下均能运行。如果你使用的是更早或更新的版本只要支持randn、cumsum、semilogy等基础函数都可以直接运行。建议环境如下项目说明操作系统Windows / Linux / macOS 均可Matlab 版本R2021a 及以上即可本文示例以常见版本为例工具箱不需要额外工具箱内存建议 4GB 以上SNR 点较多时会有内存占用2.2 仿真总体流程整个仿真流程可以拆成下面几步初始化系统参数包括信噪比范围、调制阶数、中继数量、每个信噪比点发送的符号数。生成随机二进制比特流并进行差分 M-PSK 调制。将调制符号从源节点发出经过第一跳瑞利衰落信道到达中继。中继按照放大因子对接收信号做功率归一化放大。放大后的信号经过第二跳瑞利衰落信道到达目的节点。目的节点对多路中继信号做等增益合并。对合并后的信号执行差分检测恢复原始比特。统计误比特率并在所有信噪比点上绘制 BER 曲线。这种“模块化”仿真结构非常符合 Matlab 的开发习惯。模块之间通过函数或%%分区隔开后续无论是换成 DQPSK 调制还是改成 DF 中继都只需要替换对应模块。2.3 项目文件结构为了让代码更清晰建议按下面的目录结构组织工程DAF_Performance_Study/ ├── demo_DAF.m % 主仿真脚本 ├── diffEncode.m % 差分编码函数 ├── diffDetect.m % 差分检测函数 ├── runSingleRelay.m % 单中继链路仿真可选 └── result/ └── DAF_BER_Curve.fig % 仿真结果图如果只是快速验证可以把全部代码放在一个demo_DAF.m脚本中用%%分区执行。为了方便阅读和复用本文在讲解过程中会以函数形式给出核心模块。3. DAF 系统数学模型与协议拆解3.1 差分编码的实现原理以 DPSK 为例假设原始二进制比特序列为 (b(k) \in {0, 1})差分编码后的发送符号满足[ s(k) s(k-1) \cdot e^{j\pi b(k)} ]也就是说当前符号的相位等于上一个符号的相位加上当前比特对应的相位增量。对于 DBPSK比特 0 对应相位增量 0比特 1 对应相位增量 (\pi)。实际发送符号的幅度恒定为 1因此发射功率固定。在 Matlab 中这种累乘关系可以用cumprod或cumsum高效实现。例如% 将比特流映射为相位增量 deltaPhase pi * bits; % bits 是 0/1 行向量 % 用 cumsum 实现相位累积再加一个参考符号 phase cumsum([0, deltaPhase]); txSym exp(1j * phase);这里发送符号序列的第一个符号是参考符号不携带信息用于建立相位基准。接收端做差分检测时会丢弃第一个接收符号因此有效信息符号数为length(bits)。3.2 中继节点放大转发的数学模型以第 i 个中继为例。源节点发送符号 (s(k)) 后中继接收到的信号为[ r_i(k) h_{SR_i}(k) \cdot s(k) n_{1,i}(k) ]其中 (h_{SR_i}(k)) 是源到中继的信道系数(n_{1,i}(k)) 是第一跳的复高斯白噪声单边功率谱密度为 (N_0)。中继执行放大转发时需要选择一个放大因子 (G_i(k))。常见的两种设计是固定增益放大 [ G_i \sqrt{\frac{P_r}{P_s \cdot \sigma_{SR_i}^2 N_0}} ] 其中 (\sigma_{SR_i}^2) 是第一跳信道的平均功率。这种方式实现简单但性能受统计信道信息精度影响。可变增益放大 [ G_i(k) \sqrt{\frac{P_r}{P_s |h_{SR_i}(k)|^2 N_0}} ] 这种方式需要知道当前时刻的第一跳信道瞬时功率但不需要完整 CSI。工程上可以通过接收信号的自动增益控制AGC来近似实现。中继转发的信号为[ t_i(k) G_i(k) \cdot r_i(k) ]目的节点接收到的第 i 路信号为[ y_i(k) h_{RD_i}(k) \cdot t_i(k) n_{2,i}(k) ]其中 (h_{RD_i}(k)) 是中继到目的节点的信道系数(n_{2,i}(k)) 是第二跳噪声。从展开式可以看出目的节点接收信号中既包含有用信号项也包含被放大的第一跳噪声项[ y_i(k) h_{RD_i}(k) G_i(k) h_{SR_i}(k) s(k) h_{RD_i}(k) G_i(k) n_{1,i}(k) n_{2,i}(k) ]这就是 AF 协议噪声累积的来源。差分检测处理这种有色噪声时并不需要额外去噪而是通过相邻符号相减来抑制静态信道影响。3.3 多中继合并方案在多中继场景下目的节点可以从多个中继收到同一份信息的多个副本。如何合并这些副本直接决定最终性能。由于接收端不掌握每一条链路的瞬时 CSI最优合并很难实现。本文采用等增益合并Equal Gain Combining, EGC[ y(k) \sum_{i1}^{N} y_i(k) ]等增益合并把所有中继信号直接相加实现简单。当各分支噪声功率相同时它能提供接近最大比合并的性能尤其适合差分检测场景。3.4 差分检测工作原理目的节点获得合并后的信号 (y(k)) 后对相邻符号做共轭乘积[ d(k) y(k) \cdot y^*(k-1) ]如果两跳信道在相邻符号之间保持不变那么信道引入的复乘因子会在共轭乘积中相互抵消剩下的主要分量是 (s(k) \cdot s^*(k-1))正好对应差分编码时的相位增量。因此通过判断 (d(k)) 落在哪个星座区域就可以恢复出原始比特。对于 DBPSK判决规则非常简洁如果 (\operatorname{Re}{d(k)} 0)判为比特 0如果 (\operatorname{Re}{d(k)} 0)判为比特 1。对于 DQPSK 等高阶调制需要对 (d(k)) 的相位做星座映射一般用最小欧氏距离判决。3.5 性能评价指标在多节点无线通信性能研究中最常用的指标是误比特率BER和误符号率SER。本文以 BER 为主观察它随信噪比 SNR 的变化趋势。SNR 定义为单位符号能量与噪声功率谱密度之比即 (E_s / N_0)。在仿真中我们以 dB 为单位设定信噪比然后在基带复基带模型中加入相应功率的复高斯白噪声。需要注意如果接收端采用差分检测由于存在噪声放大和相邻符号噪声相关性实际 BER 会比理论相干检测略差这是差分方案为免 CSI 付出的代价。4. Matlab 代码实现与运行4.1 参数初始化模块打开 Matlab新建脚本或函数先写入系统参数。下面给出主脚本demo_DAF.m的开头部分。% 文件路径demo_DAF.m % 功能多节点无线通信中差分放大转发DAF性能仿真 clear; clc; close all; % 系统参数 snr_dB 0:2:24; % 信噪比范围dB numBits 2e5; % 每个信噪比点发送的比特数 M 2; % 调制阶数2DBPSK4DQPSK P_s 1; % 源节点发射功率 P_r 1; % 中继节点发射功率 nRelay 2; % 中继节点数量 numTrials 3; % 独立重复次数取平均 % 预分配BER存储数组 ber_direct zeros(length(snr_dB), 1); ber_daf_single zeros(length(snr_dB), 1); ber_daf_multi zeros(length(snr_dB), 1); rng(2025); % 固定随机种子保证结果可复现这里把每个信噪比点的比特数设为 2e5并且重复 3 次取平均目的是降低随机波动。如果机器性能较好想得到更平滑的曲线可以把numBits和numTrials再调大。4.2 差分编码函数实现我建议把差分编码单独封装成一个函数便于复用。% 文件路径diffEncode.m function txSym diffEncode(bits, M) % diffEncode 对二进制比特进行差分 M-PSK 调制 % 输入 % bits - 0/1 行向量长度为 N % M - 调制阶数2 表示 DBPSK4 表示 DQPSK % 输出 % txSym - 差分编码后的符号序列长度为 N1第一个是参考符号 if M 2 % DBPSK相位增量为 0 或 pi deltaPhase pi * bits(:).; elseif M 4 % DQPSK这里使用简单 Gray 映射每个相位增量对应两个比特 % 映射关系00-0, 01-pi/2, 11-pi, 10-3pi/2 % 将比特流按两个一组转换 bits bits(:).; if mod(length(bits), 2) ~ 0 bits [bits, 0]; end bitsPair reshape(bits, 2, []).; idx bitsPair(:,1) * 2 bitsPair(:,2) 1; deltaPhase [0, pi/2, pi, 3*pi/2]; deltaPhase deltaPhase(idx); else error(当前示例只支持 M2 或 M4); end % 相位累积发送符号 exp(1j * 累积相位) phase cumsum([0, deltaPhase]); txSym exp(1j * phase); end这段代码的关键是cumsum([0, deltaPhase])。它把相位增量累积起来实现差分成码。以 DBPSK 为例如果原始比特是[1 0 1]相位增量是[pi, 0, pi]累积相位为[0, pi, pi, 2pi]对应的发送符号依次是[1, -1, -1, 1]。接收端一旦出现信道引起的相位旋转相邻符号的相位差仍然能保持。4.3 差分检测函数实现差分检测是接收端的核心模块。% 文件路径diffDetect.m function bitsHat diffDetect(rxSym, M) % diffDetect 对接收符号做一阶差分检测 % 输入 % rxSym - 接收符号序列 % M - 调制阶数 % 输出 % bitsHat - 恢复出的二进制比特 % 相邻符号共轭乘积 d rxSym(2:end) .* conj(rxSym(1:end-1)); if M 2 % DBPSK实部大于0判为0否则判为1 bitsHat real(d) 0; elseif M 4 % DQPSK计算相位再映射回比特 phase angle(d); % 将相位映射到最近的有效相位增量 deltaRef [0, pi/2, pi, 3*pi/2]; [~, idx] min(abs(angle(exp(1j*(phase - deltaRef.)))), [], 1); idx idx.; pairBits [floor((idx-1)/2), mod(idx-1, 2)]; bitsHat reshape(pairBits., 1, []); else error(当前示例只支持 M2 或 M4); end end对于 DQPSK 的相位判决这里用了最小欧氏距离方法。由于相位存在周期性直接比较phase和deltaRef需要先做角度归一化代码中的angle(exp(1j*(phase - deltaRef.)))就是用来处理相位环绕的。这部分属于比较实用的实现技巧建议读者仔细体会。4.4 生成瑞利衰落信道的辅助代码瑞利衰落信道在复基带中表示为复高斯随机变量% 生成均值为0、方差为1的复高斯信道系数 h sqrt(0.5) * (randn(1, N) 1j * randn(1, N));在块衰落信道模型中我们可以假设一个符号块内信道保持不变。为了简化本文让每个符号都独立地经历瑞利衰落即快衰落信道。这样仿真能够覆盖更恶劣的信道条件也能更清楚地看出差分检测对信道变化率的适应性。4.5 主仿真循环直接链路与单中继 DAF下面写出主仿真循环主体。为了代码可读性我分为三段第一段是直接传输第二段是单中继 DAF第三段是多中继 DAF。for idxSnr 1:length(snr_dB) snr snr_dB(idxSnr); N0 10^(-snr/10); % 噪声功率谱密度假设信号功率为1 totalErrDirect 0; totalErrSingle 0; totalErrMulti 0; totalBits 0; for trial 1:numTrials % 生成随机比特 bits randi([0 1], 1, numBits); % 差分编码 txSym diffEncode(bits, M); % 符号数包含参考符号 N length(txSym); % 噪声功率折算到每维 noiseStd sqrt(N0 / 2); % ---------- 1. 直接传输 ---------- hSD sqrt(0.5) * (randn(1, N) 1j * randn(1, N)); n noiseStd * (randn(1, N) 1j * randn(1, N)); rxDirect sqrt(P_s) * hSD .* txSym n; bitsHatDirect diffDetect(rxDirect, M); totalErrDirect totalErrDirect sum(bitsHatDirect ~ bits); % ---------- 2. 单中继 DAF ---------- % 第一跳S - R hSR sqrt(0.5) * (randn(1, N) 1j * randn(1, N)); n1 noiseStd * (randn(1, N) 1j * randn(1, N)); rR sqrt(P_s) * hSR .* txSym n1; % 中继放大因子可变增益使用瞬时信道功率 G sqrt(P_r ./ (P_s * abs(hSR).^2 N0)); tR G .* rR; % 第二跳R - D hRD sqrt(0.5) * (randn(1, N) 1j * randn(1, N)); n2 noiseStd * (randn(1, N) 1j * randn(1, N)); rxSingle sqrt(P_r) * hRD .* tR n2; bitsHatSingle diffDetect(rxSingle, M); totalErrSingle totalErrSingle sum(bitsHatSingle ~ bits); % ---------- 3. 多中继 DAF ---------- % 先累加所有中继分支的接收信号 rxMulti zeros(1, N); for r 1:nRelay hSR_r sqrt(0.5) * (randn(1, N) 1j * randn(1, N)); n1_r noiseStd * (randn(1, N) 1j * randn(1, N)); rR_r sqrt(P_s) * hSR_r .* txSym n1_r; G_r sqrt(P_r ./ (P_s * abs(hSR_r).^2 N0)); tR_r G_r .* rR_r; hRD_r sqrt(0.5) * (randn(1, N) 1j * randn(1, N)); n2_r noiseStd * (randn(1, N) 1j * randn(1, N)); y_r sqrt(P_r) * hRD_r .* tR_r n2_r; % 等增益合并 rxMulti rxMulti y_r; end % 多中继合并后需要做功率归一化避免幅度过大影响判决 rxMulti rxMulti / nRelay; bitsHatMulti diffDetect(rxMulti, M); totalErrMulti totalErrMulti sum(bitsHatMulti ~ bits); totalBits totalBits numBits; end ber_direct(idxSnr) totalErrDirect / totalBits; ber_daf_single(idxSnr) totalErrSingle / totalBits; ber_daf_multi(idxSnr) totalErrMulti / totalBits; fprintf(SNR %2d dB, BER_direct %.5f, BER_single %.5f, BER_multi %.5f\n, ... snr_dB(idxSnr), ber_direct(idxSnr), ber_daf_single(idxSnr), ber_daf_multi(idxSnr)); end这里有几个容易出错的地方需要特别强调。第一放大因子G的计算使用了点除./。因为hSR是一个向量P_s * abs(hSR).^2 N0也是向量必须用./做逐元素除法。如果写成/Matlab 会尝试解线性方程组轻则报错重则得到错误结果。这就是很多新手在 Matlab 仿真中容易踩的“点乘和直接乘”的坑。第二中继发射信号tR已经包含了功率项sqrt(P_r)所以第二跳信道乘完后不再额外乘中继功率。在数学模型中G本身包含了sqrt(P_r)的归一化因此第 4.2 节中的公式写成[ t_i(k) G_i(k) \cdot r_i(k) ]而仿真代码把G展开成了sqrt(P_r ./ (...))里面已经含有sqrt(P_r)所以第二跳直接用hRD .* tR是合理的。如果你习惯于把功率单独放在信道外也可以调整但要注意不要重复乘功率。第三多中继合并后除以nRelay是为了让合并信号的功率量级回到单分支水平避免差分检测判决阈值出现偏差。实际系统如果接收机有自动增益控制这个归一化也可以由 AGC 完成。4.6 绘图与结果导出仿真结束后使用半对数坐标绘制 BER 曲线是最常见的展示方式。% 绘制 BER 曲线 figure; semilogy(snr_dB, ber_direct, -o, LineWidth, 1.5); hold on; semilogy(snr_dB, ber_daf_single, -s, LineWidth, 1.5); semilogy(snr_dB, ber_daf_multi, -^, LineWidth, 1.5); grid on; xlabel(SNR (dB)); ylabel(BER); title(多节点无线通信中差分放大转发DAF性能对比); legend(Direct DPSK, Single-relay DAF, Multi-relay DAF, Location, best); set(gca, FontSize, 11);如果你想把结果保存成图片类似 Matlab 图像处理中常见的图形导出操作可以使用exportgraphicsexportgraphics(gcf, result/DAF_BER_Curve.png, Resolution, 300);4.7 运行结果分析与解读以nRelay2、DBPSK 调制为例运行上述代码后你会看到三条 BER 曲线直接差分传输的 BER 曲线下降最慢因为它没有分集增益。单中继 DAF 在中高信噪比时 BER 下降更快说明中继链路提供了分集效果。多中继 DAF 的曲线斜率最陡。当 SNR 足够高时BER 随 SNR 增加近似呈 (SNR^{-N}) 下降这就是空间分集带来的性能提升。在低 SNR 区间中继 DAF 的绝对误码率不一定优于直接传输原因是噪声在中继处被放大且两跳噪声叠加。但一旦 SNR 超过某个阈值中继协作的优势就会体现出来。这个趋势是 AF 放大转发协议的重要特征也是论文中经常讨论的“中断概率”与“分集增益”的直观体现。如果把M改为 4DQPSK整体 BER 会抬升因为高阶调制对噪声更敏感但多中继分集增益的趋势依然保持一致。读者可以自行运行对比。5. 常见问题与排查思路在实际仿真过程中很多人会遇到代码报错或者结果异常。这里把高频问题整理成表格方便快速定位。问题现象常见原因解决思路报错“Matrix dimensions must agree”向量的维度不匹配常见于.*、./、.^使用错误检查两个向量长度是否相同确认使用了逐元素运算符误码率曲线几乎不随 SNR 下降噪声功率计算错误或者噪声没加到复信号的实部和虚部确认噪声用sqrt(N0/2)*(randn(1,N)1j*randn(1,N))总功率为 N0多中继性能反而比单中继差合并后未做功率归一化或中继发射功率重复计算检查每路功率是否一致合并后除以中继数曲线剧烈抖动不平滑每个 SNR 点发送比特数太少或未取多次平均增大numBits或增加numTrials差分检测结果总是整体反转差分编码参考符号处理不一致确认发送端第一个符号是参考符号检测时从第 2 个符号开始仿真速度很慢内层使用了大量for循环或随机数每次重新生成尽量向量化减少不必要随机数生成固定随机种子后分帧处理DQPSK 检测在高 SNR 仍有较多错误相位映射和 Gray 编码映射不匹配检查diffEncode和diffDetect中的相位增量顺序是否一致其中一个最容易忽略的问题是差分检测要求相邻符号经历的信道响应尽量一致。如果你把信道设置成每个符号都独立变化的快衰落信道那么相邻符号的信道也会变得不相关差分检测的优势就会被削弱。块衰落模型更适合体现差分调制对抗信道相位旋转的能力。实际仿真中可以设置一个块内所有符号共享同一个信道系数跨块独立变化。6. 最佳实践与工程建议6.1 统一功率与噪声定义很多仿真结果难以复现根源是功率和噪声定义不统一。建议在代码注释中明确写出信号平均功率是多少。噪声功率谱密度 (N_0) 如何由 SNR 计算。复噪声的方差是 (N_0)还是 (N_0/2) 分配在实部和虚部。只要这三条定义一致仿真和理论公式才能对上。本文中的噪声写法是N0 10^(-snr/10); noiseStd sqrt(N0 / 2);也就是复噪声总方差为 (N_0)实部虚部分别为 (N_0/2)这是通信仿真最常用的约定。6.2 用向量化替代显式循环Matlab 的循环效率不如向量化运算。本文差分编码用了cumsum中继合并用了矩阵累加这些都是提高效率的做法。在做多节点扩展时可以考虑把多个中继的信道矩阵组织成二维矩阵一次完成所有中继的衰落、放大和合并而不是每个中继写一个for循环。例如H_SR sqrt(0.5) * (randn(nRelay, N) 1j * randn(nRelay, N));然后对矩阵的每一行做处理最后用sum函数合并。这样既简洁又高效。6.3 使用随机种子保证可复现性仿真研究需要一个稳定的随机种子否则每次运行结果都不同很难比较不同算法的优劣。在代码开头使用rng(2025);固定随机数生成器。如果需要保存多组实验数据可以使用不同种子并记录。6.4 分多帧发送降低内存占用如果一次性生成1e7个符号内存和运算时间都会增加。建议改成“帧循环”每帧发送例如1e4个符号累加错误数。这样既保证了错误统计的稳定性又不会让内存峰值过高。6.5 在中继端避免对 CSI 的过度依赖DAF 的核心卖点是免 CSI但中继的放大因子计算仍可能用到第一跳信道功率。在真实系统中中继可以用接收信号平均功率估计来近似avgPwr mean(abs(rR).^2); G sqrt(P_r / (P_s * avgPwr N0));这种方式只需要统计平均功率不需要瞬时 CSI更贴近实际工程。建议在仿真中同时对比“理想瞬时功率”和“平均功率估计”两种方案的差异。6.6 安全生产与仿真边界意识虽然本文只是仿真研究没有真实射频设备和网络操作但也要注意一些工程边界仿真中使用的信道模型和噪声模型都是理想化假设实际无线系统的非线性失真、相位噪声、射频损伤会让结果偏离仿真曲线。在论文或项目报告中要明确说明这些假设避免把仿真数据当作真实设备性能。另外涉及真实节点部署、功率配置时需要按照当地无线电管理规定执行先做链路预算和合规性评估。7. 总结与下一步方向本文围绕多节点无线通信中的差分放大转发技术完整梳理了从系统模型到 Matlab 仿真落地的全过程。你可以看到差分编码通过相邻符号携带信息中继通过放大转发完成协作目的端通过一阶差分检测免除 CSI 估计。仿真结果显示多中继 DAF 能获得明显的分集增益在高信噪比下 BER 曲线下降更陡相比单中继和直接传输具有更好的可靠性。下一步可以从以下几个方向继续扩展将调制方式从 DBPSK 扩展到 DQPSK、8-DPSK对比频谱效率与误码性能的取舍。把 AF 中继改为 DF 中继比较两种协议在不同信噪比下的适用性。引入中断概率分析从信息论角度评估系统的分集与复用折中。研究中继选择策略在多中继场景中只挑选最佳中继转发降低同步开销。结合深度学习方法设计免 CSI 的合并权重进一步逼近最大比合并性能。如果你正打算把这套代码用于课程设计、毕业设计或论文复现建议先跑通 DBPSK 单中继场景再逐步扩展到多中继和高阶调制。这样既能验证代码正确性也能更清晰地观察每个改动带来的性能变化。本文所有代码都基于 Matlab 基础函数编写你可以直接复制到本地运行并根据自己的实验需求修改参数。