news 2026/9/4 16:18:34

多节点无线通信中差分放大转发技术性能仿真教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
多节点无线通信中差分放大转发技术性能仿真教程

在多节点无线通信中,中继协作是提升传输可靠性和覆盖范围的重要手段。放大转发(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 环境下均能运行。如果你使用的是更早或更新的版本,只要支持randncumsumsemilogy等基础函数,都可以直接运行。

建议环境如下:

项目说明
操作系统Windows / Linux / macOS 均可
Matlab 版本R2021a 及以上即可,本文示例以常见版本为例
工具箱不需要额外工具箱
内存建议 4GB 以上,SNR 点较多时会有内存占用

2.2 仿真总体流程

整个仿真流程可以拆成下面几步:

  1. 初始化系统参数,包括信噪比范围、调制阶数、中继数量、每个信噪比点发送的符号数。
  2. 生成随机二进制比特流,并进行差分 M-PSK 调制。
  3. 将调制符号从源节点发出,经过第一跳瑞利衰落信道到达中继。
  4. 中继按照放大因子对接收信号做功率归一化放大。
  5. 放大后的信号经过第二跳瑞利衰落信道到达目的节点。
  6. 目的节点对多路中继信号做等增益合并。
  7. 对合并后的信号执行差分检测,恢复原始比特。
  8. 统计误比特率,并在所有信噪比点上绘制 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 中,这种累乘关系可以用cumprodcumsum高效实现。例如:

% 将比特流映射为相位增量 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_{i=1}^{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; % 调制阶数:2=DBPSK,4=DQPSK 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 次取平均,目的是降低随机波动。如果机器性能较好,想得到更平滑的曲线,可以把numBitsnumTrials再调大。

4.2 差分编码函数实现

我建议把差分编码单独封装成一个函数,便于复用。

% 文件路径:diffEncode.m function txSym = diffEncode(bits, M) % diffEncode 对二进制比特进行差分 M-PSK 调制 % 输入: % bits - 0/1 行向量,长度为 N % M - 调制阶数,2 表示 DBPSK,4 表示 DQPSK % 输出: % txSym - 差分编码后的符号序列,长度为 N+1,第一个是参考符号 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('当前示例只支持 M=2 或 M=4'); 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('当前示例只支持 M=2 或 M=4'); end end

对于 DQPSK 的相位判决,这里用了最小欧氏距离方法。由于相位存在周期性,直接比较phasedeltaRef需要先做角度归一化,代码中的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 图像处理中常见的图形导出操作,可以使用exportgraphics

exportgraphics(gcf, 'result/DAF_BER_Curve.png', 'Resolution', 300);

4.7 运行结果分析与解读

nRelay=2、DBPSK 调制为例,运行上述代码后,你会看到三条 BER 曲线:

  • 直接差分传输的 BER 曲线下降最慢,因为它没有分集增益。
  • 单中继 DAF 在中高信噪比时 BER 下降更快,说明中继链路提供了分集效果。
  • 多中继 DAF 的曲线斜率最陡。当 SNR 足够高时,BER 随 SNR 增加近似呈 (SNR^{-N}) 下降,这就是空间分集带来的性能提升。

在低 SNR 区间,中继 DAF 的绝对误码率不一定优于直接传输,原因是噪声在中继处被放大,且两跳噪声叠加。但一旦 SNR 超过某个阈值,中继协作的优势就会体现出来。这个趋势是 AF 放大转发协议的重要特征,也是论文中经常讨论的“中断概率”与“分集增益”的直观体现。

如果把M改为 4(DQPSK),整体 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 编码映射不匹配检查diffEncodediffDetect中的相位增量顺序是否一致

其中一个最容易忽略的问题是,差分检测要求相邻符号经历的信道响应尽量一致。如果你把信道设置成每个符号都独立变化的快衰落信道,那么相邻符号的信道也会变得不相关,差分检测的优势就会被削弱。块衰落模型更适合体现差分调制对抗信道相位旋转的能力。实际仿真中,可以设置一个块内所有符号共享同一个信道系数,跨块独立变化。

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 基础函数编写,你可以直接复制到本地运行,并根据自己的实验需求修改参数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 8:22:30

Tabby 自托管AI编程助手:私有化代码补全与代码问答的完整落地指南

Tabby 自托管AI编程助手:私有化代码补全与代码问答的完整落地指南 【免费下载链接】tabby Self-hosted AI coding assistant 项目地址: https://gitcode.com/GitHub_Trending/tab/tabby Tabby 是一款自托管的 AI 编程助手&#xff0c;用开源、可私有部署的方式替代 GitH…

作者头像 李华
网站建设 2026/9/4 16:17:34

SpringBoot图书馆管理系统实战:从架构设计到性能优化

简介&#xff1a;这是一套面向Java初学者与课程设计实践者的SpringBoot图书馆管理系统完整源码&#xff0c;适用于高校Java程序设计、Web开发或软件工程类课程实训项目。系统采用前后端分离架构&#xff0c;涵盖用户管理、图书借阅、库存统计、管理员后台及数据可视化等核心功能…

作者头像 李华
网站建设 2026/9/4 0:55:19

WEP加密与压缩包密码安全评估:Kali Linux实战与防御策略

在实际网络安全教学和渗透测试授权演练中&#xff0c;理解常见的密码保护机制及其潜在的脆弱性是构建有效防御体系的基础。许多安全漏洞并非源于高深的技术攻击&#xff0c;而是由于使用了弱密码、默认密码或存在缺陷的加密协议。本文旨在从安全研究的角度&#xff0c;系统性地…

作者头像 李华
网站建设 2026/9/4 8:14:26

C++ Qt实战:开发Windows实时系统监控工具全程解析

我接触过不少刚学完 C 语法的人&#xff0c;最常听到的问题不是“接下来学什么”&#xff0c;而是“我能做个什么项目”。有人写图书管理系统&#xff0c;有人写贪吃蛇&#xff0c;但如果目标是真正把 C、Qt 和 Windows 系统编程串起来&#xff0c;我最想推荐的反而是这个方向&…

作者头像 李华
网站建设 2026/9/4 8:02:58

51单片机数字秒表设计:LCD1602驱动与定时器12T模式详解

简介&#xff1a;本资源是面向单片机初学者与嵌入式入门学习者的中级实践例程&#xff0c;聚焦数字秒表功能开发与LCD1602液晶显示驱动&#xff0c;解决硬件定时控制、字符型液晶接口编程及实时数据显示等核心问题。压缩包共10个文件&#xff0c;含2个C源文件&#xff08;main.…

作者头像 李华
网站建设 2026/9/4 1:03:19

校园信息发布平台毕业设计:Spring Boot+Vue前后端分离实战指南

简介&#xff1a;这是一套面向计算机专业本科生的高质量毕业设计级校园信息发布平台源码&#xff0c;聚焦高校场景下的通知公告、活动发布、招聘对接等核心需求&#xff0c;适用于Web开发入门到进阶的学习者开展项目实践与二次开发。资源共410个文件&#xff0c;20.3MB&#xf…

作者头像 李华