多中继差分放大转发(DAF)误码率性能与Matlab仿真
2026/9/3 20:56:23 网站建设 项目流程

做无线中继网络仿真时,放大转发(Amplify-and-Forward,AF)是最容易上手的中继协议之一。但很多同学把 AF 从单中继扩展到多节点场景后会发现一个现实问题:目的端通常需要同时知道源到中继、中继到目的两条链路的信道状态信息(CSI)。一旦信道估计结果偏差较大,误码率曲线就会明显恶化。差分放大转发(Differential Amplify-and-Forward,DAF)提供了一个非常实用的解决思路:发送端采用差分编码,中继只做放大转发,目的端通过相邻符号之间的相位差完成检测,从而绕开对 CSI 的依赖。本文围绕 DAF 在无线通信多节点场景下的性能研究展开,先讲清楚数学模型,再给出一套可直接运行的 Matlab 仿真代码,最后梳理多中继合并、误码率统计、常见报错等关键点。

1. 背景:协作通信为什么需要差分放大转发

1.1 多节点无线通信中的协作分集

实际无线通信系统中,源节点到目的节点之间往往不是直接可见的。例如传感器网络中的节点受限于发射功率,车联网中车辆之间存在遮挡,无人机中继场景中地面节点与远端控制台之间距离过大。这些场景下,让中间节点参与转发数据,可以在目的端形成多路副本,这就是协作分集的基本思想。

协作分集的价值在于,它不需要在源节点配置多根天线,而是通过分布式节点之间形成的虚拟天线阵列获得空间分集增益。多个中继节点同时转发同一个数据块时,即使某几条链路处于深度衰落,其他链路仍然可能提供可靠副本,从而降低系统的整体误码率。因此在多节点通信研究中,中继数量、中继位置、功率分配和中继转发协议都是核心研究变量。

1.2 AF、DF 与 DAF 的协议对比

中继节点最常见的转发协议有以下三种:

  • 放大转发(AF):中继收到信号后,不做解调,直接按比例放大后转发。实现简单、延迟小,但中继噪声也会被一起放大。
  • 解码转发(DF):中继先解调并解码,再重新编码转发。能有效抑制中继噪声,但要求中继具备完整收发基带能力,一旦解码错误会把错误继续传下去。
  • 差分放大转发(DAF):源节点先做差分编码,中继仍然只做放大转发,目的端利用差分检测恢复信息。最大优势是系统不需要估计信道状态信息。

三种协议的关键区别可以用下表概括:

协议中继是否需要解码目的端是否需要 CSI主要误差来源
AF中继噪声被放大
DF中继解码错误传播
DAF差分检测带来一定性能损失

从表中可以看出,DAF 在实现复杂度上接近 AF,却在是否依赖 CSI 这一点上具备明显优势。对于信道快速变化、导频开销昂贵或者接收机硬件资源受限的系统,DAF 是非常有吸引力的候选方案。

1.3 DAF 的核心思路:用差分相位替代绝对相位

DAF 的基础是差分相移键控(DPSK)。DPSK 不把信息直接调制在信号的绝对相位上,而是调制在相邻两个符号的相位差上。这样即使信道让信号的绝对相位发生随机旋转,只要相邻符号经历的信道差异足够小,接收端就可以从相邻符号相位差中恢复信息。

把 DPSK 和 AF 转发结合起来,就形成了 DAF:源节点产生 DPSK 信号,中继节点不需要知道发送相位,也不需要信道估计,只需要对接收信号进行幅度归一化后转发,目的节点再做差分检测。整体链路对“信道状态不可知”的容忍度很高。

2. 差分放大转发的数学模型

2.1 系统模型

考虑一个单源、单目的、N 个中继的无线通信系统。源节点记为 S,目的节点记为 D,第 r 个中继节点记为 R_r。系统模型假设如下:

  • 所有信道均为瑞利平坦块衰落信道,即在一个数据块内信道复增益保持不变。
  • 源到中继、中继到目的、源到目的各链路的噪声均建模为独立复高斯白噪声。
  • 发射端默认不知道信道信息,中继不需要解码,目的端不依赖 CSI 进行相干检测。
  • 每个中继采用等功率放大转发,放大倍数只用于保证中继发射功率恒定。

在不考虑直连路径的情况下,从 S 到 D 的数据需要经过两跳:第一跳为 S 到 R_r,第二跳为 R_r 到 D。这种双跳结构下,每一跳的衰落都会影响最终接收质量,因此中继数量和合并策略对系统性能影响很大。

2.2 源端 DPSK 调制

假设待发送的信息比特为 b(i) ∈ {0,1}。DPSK 调制的规则如下:

$$ x(i) = x(i-1) \cdot e^{j\pi b(i)} $$

其中 x(1) 为参考符号,不携带信息;发送序列的总长度为信息比特数加 1。当 b(i)=1 时,相邻符号相位翻转 π;当 b(i)=0 时,相邻符号相位不变。因此接收端只要判断相邻符号的相位差,就能恢复出 b(i)。

在 Matlab 代码中,可以采用如下方式实现 DPSK 调制:

function x = dpsk_mod(bits) n = length(bits); x = ones(1, n + 1); % 第一个符号是参考符号 for i = 1:n if bits(i) == 1 x(i + 1) = -x(i); else x(i + 1) = x(i); end end end

这里的核心是“相位差携带信息”,所以后续所有处理都围绕相邻符号做运算。

2.3 中继端放大因子

第 r 个中继收到的信号为:

$$ y_{SR_r}(i) = h_{SR_r} x(i) + n_{SR_r}(i) $$

其中 h_{SR_r} 是源到第 r 个中继的瑞利信道复增益,n_{SR_r} 是高斯白噪声。

中继不进行解调,直接乘以放大因子 β_r 后转发:

$$ t_r(i) = \beta_r \cdot y_{SR_r}(i) $$

放大因子 β_r 需要满足中继发射功率约束。如果中继端完全不知道信道状态,一种典型做法是根据接收信号样本平均功率估计放大因子:

$$ \beta_r = \sqrt{\frac{L}{\sum_{i=1}^{L} |y_{SR_r}(i)|^2}} $$

其中 L 为发送符号长度。这种基于样本功率的估计不需要 CSI,实现简单,非常适合 DAF 系统。如果系统能够获得源到中继链路的信道增益,也可以用理想功率归一化公式:

$$ \beta_r = \frac{1}{\sqrt{|h_{SR_r}|^2 + N_0}} $$

两种方式各有适用场景,本文代码会把两种方式都写出来,方便读者对比。

2.4 目的端差分检测

目的端收到第 r 个中继转发的信号为:

$$ y_{RD_r}(i) = h_{RD_r} \cdot t_r(i) + n_{RD_r}(i) $$

其中 h_{RD_r} 是中继到目的节点的信道复增益。把中继转发信号展开后可以得到:

$$ y_{RD_r}(i) = h_{RD_r} \beta_r h_{SR_r} x(i) + h_{RD_r} \beta_r n_{SR_r}(i) + n_{RD_r}(i) $$

由于采用块衰落模型,相邻两个符号经历的信道增益 h_{SR_r}、h_{RD_r} 近似相同。目的端计算相邻符号的共轭乘积:

$$ d_r(i) = y_{RD_r}(i) \cdot y_{RD_r}^*(i-1) $$

展开后,信号部分为:

$$ |h_{RD_r}|^2 \beta_r^2 |h_{SR_r}|^2 \cdot x(i) x^*(i-1) $$

其中 x(i)x^*(i-1) = e^{j\pi b(i)},因此只需要判断 d_r(i) 的实部符号即可恢复 b(i)。若实部小于 0,则判定 b(i)=1;否则判定 b(i)=0。

值得注意的是,上述共轭乘积展开后还会出现信号乘噪声、噪声乘信号、噪声乘噪声等交叉项。这些交叉项就是差分检测相比相干检测存在性能损失的根本原因,通常表现为约 2 到 3 dB 的信噪比损失。

2.5 多中继软合并

多中继场景下,目的节点会收到 N 路转发信号。在系统不知道各链路 CSI 的情况下,最直接的方式是等增益合并,即将各路差分软信息直接相加:

$$ D(i) = \sum_{r=1}^{N} d_r(i) $$

然后在实数域做符号判决:

$$ \hat{b}(i) = \begin{cases} 1, & \text{Re}(D(i)) < 0 \ 0, & \text{Re}(D(i)) \geq 0 \end{cases} $$

这种等增益合并虽然简单,但在各支路噪声方差相同时已经接近无 CSI 约束下的最优合并策略。如果系统能够估计出各支路的信道增益,还可以进一步采用加权合并来提升性能,代价是额外增加导频和信道估计开销。

3. Matlab 仿真环境与整体设计

3.1 环境准备

本文示例代码基于 Matlab R2021a 编写,代码本身只依赖最基础的矩阵运算和随机数函数,不依赖 Communication Toolbox 等附加工具箱。如果你的 Matlab 版本是 R2016b 之前,需要注意脚本文件中的局部函数(local function)可能无法直接使用,可以把局部函数单独保存为同名函数文件放在同一目录下。

如果你的电脑还没有安装 Matlab,可以自行查找 Matlab 下载安装教程,或者尝试在浏览器中直接使用 MATLAB Online。代码对这种轻量级仿真场景完全够用。任何版本问题都不影响算法思路本身,只需要保证循环、复数和随机数函数正常工作即可。

3.2 仿真模块划分

为了把仿真拆得足够清晰,模块划分如下:

  1. 参数配置模块:定义信噪比范围、中继数量、数据块长度等。
  2. 信源与差分调制模块:随机生成比特,并完成 DPSK 调制。
  3. 信道模块:生成瑞利块衰落信道和复高斯噪声。
  4. 中继处理模块:计算放大因子并执行放大转发。
  5. 差分检测与合并模块:计算相邻符号共轭乘积,完成软信息合并。
  6. 误码率统计模块:统计错误比特数,并得到最终 BER。
  7. 绘图模块:绘制误码率随信噪比变化的曲线。

3.3 仿真参数表

下面给出本文仿真使用的默认参数:

参数符号默认值
中继节点数量numRelay2
每个数据块信息比特数blockLen5000
每个 SNR 点最少错误比特数maxBitErrors300
信噪比范围(dB)EbN0dB0:2:26
是否包含源到目的直连链路hasDirectLinktrue
放大因子估计方式useAutoBetatrue
随机数种子rng1

仿真中每个数据块的长度会影响差分检测的准确性和统计速度,blockLen 越大,功率归一化估计越准确,但单块仿真耗时也会增加。maxBitErrors 控制每个信噪比点的统计置信度,建议至少设置为 100,想要曲线更平滑可以提高到 300 或 500。

4. 完整 Matlab 代码实现

4.1 完整可运行代码

将以下代码保存为main_DAF_MultiNode.m,在 Matlab 中直接运行即可得到误码率曲线。

%% main_DAF_MultiNode.m % 多节点无线通信中差分放大转发(DAF)性能仿真 % 调制方式:DPSK % 检测方式:差分检测 % 中继方式:多中继等增益放大转发 % % 环境:Matlab R2021a,纯脚本实现,无额外工具箱依赖 clear; close all; clc; %% ========== 系统参数 ========== numRelay = 2; % 中继节点数量 blockLen = 5000; % 每个数据块的信息比特数 maxBitErrors = 300; % 每个SNR点最少收集的错误比特数 EbN0dB = 0:2:26; % 信噪比范围(dB) hasDirectLink = true; % 是否包含源到目的直连路径 useAutoBeta = true; % true: 接收信号估计功率计算放大因子 rng(1); % 固定随机种子,便于复现 %% ========== 仿真主循环 ========== nSymbol = blockLen + 1; % DPSK调制后的符号数 ber = zeros(1, length(EbN0dB)); for snrIdx = 1:length(EbN0dB) noiseVar = 10^(-EbN0dB(snrIdx) / 10); totalErr = 0; totalBit = 0; while totalErr < maxBitErrors % 1. 生成随机信息比特并完成DPSK调制 bits = randi([0 1], 1, blockLen); tx = dpsk_mod(bits); % 2. 软信息合并向量 softSum = zeros(1, blockLen); % 3. 源到目的直连分支(可选) if hasDirectLink hSD = (randn + 1j*randn) / sqrt(2); nSD = sqrt(noiseVar/2) * (randn(1, nSymbol) + 1j*randn(1, nSymbol)); ySD = hSD * tx + nSD; softSum = softSum + ySD(2:end) .* conj(ySD(1:end-1)); end % 4. 多中继分支 for r = 1:numRelay % 4.1 源 -> 中继 r hSR = (randn + 1j*randn) / sqrt(2); nSR = sqrt(noiseVar/2) * (randn(1, nSymbol) + 1j*randn(1, nSymbol)); ySR = hSR * tx + nSR; % 4.2 放大因子计算 if useAutoBeta % 基于接收信号样本平均功率估计,不需要CSI beta = sqrt(nSymbol / sum(abs(ySR).^2)); else % 理想功率归一化,需要源到中继

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

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

立即咨询