多中继差分放大转发(DAF)误码率性能与Matlab仿真
做无线中继网络仿真时放大转发Amplify-and-ForwardAF是最容易上手的中继协议之一。但很多同学把 AF 从单中继扩展到多节点场景后会发现一个现实问题目的端通常需要同时知道源到中继、中继到目的两条链路的信道状态信息CSI。一旦信道估计结果偏差较大误码率曲线就会明显恶化。差分放大转发Differential Amplify-and-ForwardDAF提供了一个非常实用的解决思路发送端采用差分编码中继只做放大转发目的端通过相邻符号之间的相位差完成检测从而绕开对 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_{i1}^{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_{r1}^{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 仿真模块划分为了把仿真拆得足够清晰模块划分如下参数配置模块定义信噪比范围、中继数量、数据块长度等。信源与差分调制模块随机生成比特并完成 DPSK 调制。信道模块生成瑞利块衰落信道和复高斯噪声。中继处理模块计算放大因子并执行放大转发。差分检测与合并模块计算相邻符号共轭乘积完成软信息合并。误码率统计模块统计错误比特数并得到最终 BER。绘图模块绘制误码率随信噪比变化的曲线。3.3 仿真参数表下面给出本文仿真使用的默认参数参数符号默认值中继节点数量numRelay2每个数据块信息比特数blockLen5000每个 SNR 点最少错误比特数maxBitErrors300信噪比范围dBEbN0dB0: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 % 理想功率归一化需要源到中继
上一篇/下一篇内容由系统自动关联
返回资讯列表 →