Atri Website

Back

一、仿真方法#

1.1 离散事件系统仿真(DES)#

离散事件系统仿真(DES)是一种时间推进机制,其核心思想是仿真时钟不连续推进,而是直接跳到下一个事件发生的时刻。

固定步长则是按照时间计时,经过相同的时间间隔 TT 后检查是否有事件发生,进而更新系统状态。DES 则是放弃按时间间隔计时的方式,转为事件驱动:即如果没有任何事件发生,系统状态一直不会更新,直到事件发生。

为什么用 DES 而不用固定步长:固定步长需要选择合适的时间粒度——太粗会漏掉事件,太细会浪费计算。DES 直接跳到事件时刻,既不遗漏也不浪费。

在代码中的体现

while True:
    next_time = protocol_func(now_time)  # 推进到下一个事件
    ...
    now_time = next_time                 # 时间跳转,无中间步长
python

每个事件(数据包到达、发送完成、冲突发生)触发一次状态更新,事件之间的时间间隔不等。

1.2 蒙特卡洛仿真方法#

基本思想

蒙特卡洛(Monte Carlo)仿真方法是一种基于随机抽样和统计平均的数值计算方法。其核心思想是:通过对同一实验条件进行大量独立重复实验,用样本均值逼近系统的真实性能指标。

数学基础——大数定律

蒙特卡洛方法的理论基础是大数定律(Law of Large Numbers)。设 X1,X2,,XnX_1, X_2, \ldots, X_n 为独立同分布的随机变量,期望为E[X]=μE[X] = \mu,则当 nn \to \infty 时:

Xˉn=1ni=1nXiPμ\bar{X}n = \frac{1}{n}\sum{i=1}^{n} X_i \xrightarrow{P} \mu

即样本均值以概率收敛于真实期望。这意味着只要重复次数足够多,统计平均就能以任意精度逼近真实值。

方差与精度

根据中心极限定理,样本均值的标准误差为:

σXˉ=σn\sigma_{\bar{X}} = \frac{\sigma}{\sqrt{n}}

其中 σ\sigma 为单次实验的标准差,nn 为重复次数。由此可知,当 nn 扩大 100 倍,精度提高 10 倍。

本实验采用参数扫描 + 统计平均的方式应用蒙特卡洛方法:

  1. 参数扫描:对归一化业务负载 GG 从 0.1 到 2.0 以 0.1 为步长取 20 个值
  2. 独立仿真:对每个 GG 值独立运行一次完整的离散事件仿真
  3. 统计平均:每次仿真处理 spend = 10000 个成功数据包,计算吞吐量 SS
  4. 绘制曲线:以 GG 为横轴、SS 为纵轴,得到吞吐量-负载曲线

每个 GG 值对应的仿真结果是一个随机变量(因为包含随机到达、随机退避、随机衰落等),但当 spend=10000\text{spend} = 10000 足够大时,统计平均的结果已经非常接近真实性能。

本实验的系统涉及多个随机过程(泊松到达、随机退避、阴影衰落、Rayleigh 衰落),难以推导封闭形式的解析解,因此采用蒙特卡洛仿真方法。

GG为归一化的业务负载:

G=总传输比特数仿真总时间×符号速率G = \frac{\text{总传输比特数}}{\text{仿真总时间} \times \text{符号速率}}

GG 越大,意味着终端发包越频繁,信道越拥挤。

1.3 随机变量生成:逆变换法#

逆变换法是一种从均匀分布随机变量生成其他分布随机变量的通用方法。其核心思想是利用目标分布的累积分布函数(CDF)的反函数,将均匀随机数映射为目标分布的随机数。

数学原理

设目标随机变量 XX 的累积分布函数为 F(x)=P(Xx)F(x) = P(X \leq x),则:

U=F(X)Uniform(0,1)U = F(X) \sim \text{Uniform}(0, 1)

也就是将服从目标分布的随机变量代入其 CDF F(X)F(X),结果服从 [0,1][0,1] 均匀分布。

反之,如果已有均匀随机变量 UUniform(0,1)U \sim \text{Uniform}(0,1),则:

X=F1(U) X = F^{-1}(U)

可求出目标变量的分布。

指数分布的推导

指数分布的概率密度函数为:

f(x)=λeλx,x0f(x) = \lambda e^{-\lambda x}, \quad x \geq 0

其 CDF 为:

F(x)=1eλxF(x) = 1 - e^{-\lambda x}

U=F(X)=1eλXU = F(X) = 1 - e^{-\lambda X},解出 XX

eλX=1Ue^{-\lambda X} = 1 - U λX=ln(1U)-\lambda X = \ln(1 - U) X=1λln(1U)X = -\frac{1}{\lambda} \ln(1 - U)

这就是从均匀分布生成指数分布的逆变换公式。

在代码中的体现

数据包的到达间隔服从指数分布,均值为 TintT_{int}(即 λ=1/Tint\lambda = 1/T_{int})。在代码中:

# 生成到达间隔(指数分布)
self.mgtime = -self.Tint * np.log(1 - np.random.rand(self.Mnum))
python

其中 np.random.rand() 生成 [0,1)[0,1) 上的均匀随机数 UU,“1 - np.random.rand()` 得到 (0,1](0,1] 上的均匀随机数(避免 ln(0)\ln(0)),Tintln(1U)-T_{int} \cdot \ln(1-U) 即为服从均值为 TintT_{int} 的指数分布随机变量。

数学上 UU1U1-U 都服从 [0,1)[0,1) 均匀分布,但代码中用 1U1-U 可以避免 U=0U=0ln(0)\ln(0),的数值问题。当 U=0U=0 时,1U=11-U=1ln(1)=0\ln(1)=0,安全且合理(间隔为 0)。

二、业务源模型#

业务源模型即信源模型,是整个仿真信号处理链路的第一个环节,位于 MAC 层之前。它的功能是为每个终端生成数据包,并决定每个数据包的到达时间——即描述终端”何时发包”和”发多频繁”。

在仿真中,信源模块不关心数据包的内容,只负责按特定的随机过程为每个终端安排到达时刻。当某个终端的到达时刻到来时,该终端进入”有数据待发送”状态,随后由 MAC 层决定何时接入信道。

2.1 泊松过程#

基本定义

泊松过程是描述随机事件发生的经典数学模型。设 N(t)N(t) 表示时间区间 [0,t][0, t] 内事件发生的次数,若满足以下三个条件,则称 {N(t),t0}\{N(t), t \geq 0\} 为强度为 λ\lambda 的泊松过程:

  1. 独立增量性:不相交时间区间内的事件发生次数相互独立
  2. 平稳增量性:在长度为 Δt\Delta t 的任意时间区间内,事件发生 kk 次的概率只与 Δt\Delta t 有关,与区间起始位置无关
  3. 普通性:在极短时间 Δt\Delta t 内,事件发生 1 次的概率为 λΔt+o(Δt)\lambda \Delta t + o(\Delta t),发生 2 次及以上的概率为 o(Δt)o(\Delta t)

事件计数的分布

在时间区间 [0,t][0, t] 内,事件发生 kk 次的概率服从泊松分布:

P(N(t)=k)=(λt)keλtk!,k=0,1,2,P(N(t) = k) = \frac{(\lambda t)^k e^{-\lambda t}}{k!}, \quad k = 0, 1, 2, \ldots

其中 λ\lambda 为单位时间内的平均到达次数(到达率),λt\lambda t 为时间区间 [0,t][0, t] 内的平均到达次数。

到达间隔的分布

泊松过程的一个重要性质是:相邻事件的到达间隔服从指数分布

设第 nn 次事件与第 n+1n+1 次事件之间的时间间隔为 Δtn\Delta t_n,则:

ΔtnExp(λ)\Delta t_n \sim \text{Exp}(\lambda)

其概率密度函数为:

f(Δt)=λeλΔt,Δt0f(\Delta t) = \lambda e^{-\lambda \Delta t}, \quad \Delta t \geq 0

均值为:

E[Δt]=1λE[\Delta t] = \frac{1}{\lambda}

即平均到达间隔为到达率的倒数。

无记忆性

指数分布具有无记忆性:

P(Δt>s+tΔt>s)=P(Δt>t)P(\Delta t > s + t \mid \Delta t > s) = P(\Delta t > t)

其物理含义是无论已经等待了多长时间,下一个事件在未来的到达概率与刚一开始等待时相同。在本实验中,无记忆性意味着每个终端在发送完一个数据包后,下一个数据包的到达时间与之前的到达历史无关,完全重新按指数分布生成。

在本实验中的应用

本实验将数据包的产生过程建模为泊松过程。参数关系为:

T=Ttranln(1G/Mnum)T = -\frac{T_{tran}}{\ln(1 - G/M_{num})}

其中:

  • Ttran=L/RsT_{tran} = L / R_s 为一个数据包的传输时间(L=128L = 128 符号,Rs=256×103R_s = 256 \times 10^3 符号/秒)
  • GG 为归一化业务负载
  • Mnum=100M_{num} = 100 为终端数量
  • TT 为每个终端的平均到达间隔

代码中通过逆变换法生成指数分布的到达间隔:

self.mgtime = -self.Tint * np.log(1 - np.random.rand(self.Mnum))
python

每个终端独立生成自己的到达时间,到达间隔服从均值为 TintT_{int} 的指数分布。当 GG 增大时,TintT_{int} 减小,终端发包更频繁,信道负载更高。

直观理解

可以把泊松过程想象为大量终端各自独立地、随机地产生数据包,每个终端的产生概率很小,但终端数量很多。在任意短时间窗口内,某个终端产生数据包的概率与其之前的行为无关,只与时间长度成正比。这种”大量独立小概率事件的叠加”正是泊松过程的典型特征。

2.2 突发业务模型#

纯泊松过程中,所有终端的发包强度相同,到达间隔服从同一参数的指数分布。但真实网络中,不同终端的业务特征往往差异很大——比如视频流、文件传输等业务会在短时间内连续产生大量数据包,而普通传感器节点可能长时间只发送少量数据。泊松过程无法反映这种异质性。

基本思想

突发业务模型将终端分为两类:

  • 普通终端:保持原始泊松过程,到达间隔为 TT
  • 突发终端:到达间隔缩短为 T/fburstT / f_{burst},其中 fburst=4.0f_{burst} = 4.0

通过设定突发终端比例 p=0.2p = 0.2(即 20%),模拟真实网络中少数终端突发发包的场景。

数学模型

设普通终端到达率为 λ\lambda,突发终端到达率为:

λburst=fburstλ\lambda_{burst} = f_{burst} \cdot \lambda

系统平均到达率为两类终端的加权平均:

λˉ=(1p)λ+pfburstλ=λ(1p+pfburst)\bar{\lambda} = (1 - p) \cdot \lambda + p \cdot f_{burst} \cdot \lambda = \lambda \cdot (1 - p + p \cdot f_{burst})

代入 p=0.2p = 0.2fburst=4f_{burst} = 4

λˉ=λ(0.8+0.2×4)=1.6λ\bar{\lambda} = \lambda \cdot (0.8 + 0.2 \times 4) = 1.6\lambda

即混合模式下系统整体到达率是纯泊松模式的 1.6 倍。

与负载 GG 和吞吐量 SS 的区别

突发业务模型是信源产生方式,描述终端”怎么发包”;而 GGSS 是系统级性能指标,描述整个系统”发了多少”和”成功了多少”。突发模型改变了每个终端的到达率,从而影响了系统整体的 GG 值。同一个 GG 参数下,突发模式的实际到达行为比纯泊松更不均匀——少数终端发得密集,多数终端发得稀疏。突发终端的密集发包更容易引发冲突,导致吞吐量 SS 下降。

三、信道模型#

信道模型是仿真信号处理链路的第四环节,位于发射机之后、接收机之前。它的功能是模拟信号从发射端到接收端的传播过程,计算每个终端的接收功率。信道模块的输入是发射功率和终端位置,输出是叠加了各种衰落后的接收功率。

本实验涉及三层信道衰落:对数距离路径损耗(大尺度,确定性)、阴影衰落(中尺度,随机慢变)、Rayleigh 衰落(小尺度,随机快变)。三层叠加后,接收功率既反映了距离的影响,又包含了障碍物遮挡和多径传播的随机效应。

3.1 对数距离路径损耗模型#

模型提出的原因

电磁波在自由空间中传播时,信号功率会随传播距离的增大而逐渐衰减。这种衰减是确定性的,给定发射功率和距离,接收功率就可以计算出来。在无线网络仿真中,需要一个数学模型来描述这种”距离越远、信号越弱”的基本规律,对数距离路径损耗模型就是最常用的模型之一。

数学表达式

PL(d)=PL0+10αlog10(d)[dB]PL(d) = PL_0 + 10\alpha \log_{10}(d) \quad [\text{dB}]

其中:

  • PL(d)PL(d):距离为 dd 时的路径损耗(dB)
  • PL0=38.5PL_0 = 38.5 dB:1 米参考距离处的路径损耗,由载波频率和天线增益决定
  • α=3\alpha = 3:路径损耗指数,描述信号衰减的快慢程度
  • dd:发射端到接收端的距离(米)

路径损耗指数 α\alpha 的取值与环境有关:α=2\alpha = 2 对应自由空间传播(Friis 公式),信号按距离平方衰减;α=34\alpha = 3 \sim 4 对应城市环境,建筑物反射、散射加剧衰减;α>4\alpha > 4 对应严重遮挡环境(室内、隧道等)。本实验取 α=3\alpha = 3,对应城市宏蜂窝场景。

在本实验中的应用

接收功率的计算公式为:

Prx=Ptx+Gtx+GrxPL010αlog10(d)S[dBm]P_{rx} = P_{tx} + G_{tx} + G_{rx} - PL_0 - 10\alpha \log_{10}(d) - S \quad [\text{dBm}]

其中 PtxP_{tx} 为发射功率,GtxG_{tx}GrxG_{rx} 为天线增益,SS 为阴影衰落。代码中:

power = self.tpowdBm + self.txGain + self.rxGain - refPL_1m \
        - self.alfa * 10 * np.log10(dxy) - shadow
python

距离 dxydxy 由终端位置和基站位置计算得出,当终端移动时,dxydxy 随之变化,接收功率也随之动态更新。

在系统中的角色

对数距离路径损耗模型是信道模块的第一层衰落,属于大尺度衰落。它决定了接收功率的基本量级,离基站近的终端信号强,离基站远的终端信号弱。这一层衰落是确定性的,同一距离的终端在没有其他随机因素时接收功率相同。

在完整的信道模型层次中,路径损耗位于最底层:

层次模型性质作用
第一层对数距离路径损耗确定性决定接收功率基本量级
第二层阴影衰落随机(慢变)模拟障碍物遮挡造成的功率波动
第三层Rayleigh 衰落随机(快变)模拟多径传播造成的快速信号波动

三层叠加后,接收功率既反映了距离的影响,又包含了障碍物遮挡和多径传播的随机效应,构成了完整的无线信道模型。

3.2 阴影衰落#

模型提出的原因

对数距离路径损耗模型是确定性的,相同距离的终端接收功率完全相同。但在现实中,即使两个终端与基站的距离相同,它们的接收功率也可能差异很大。因为传播路径上的建筑物、树木、地形起伏等障碍物会对信号产生遮挡,造成额外的功率损耗。

这种由于障碍物遮挡导致的功率波动就是阴影衰落,也称大尺度衰落。它的特点是变化缓慢,终端移动几十米甚至上百米,阴影衰落才会发生明显变化,因此称为”慢衰落”。

数学表达式

对数路径损耗:

PL(d)=PL0+10αlog10(d)[dB]PL(d) = PL_0 + 10\alpha \log_{10}(d) \quad [\text{dB}]

阴影衰落在路径损耗基础上叠加一个随机衰落项:

Prx=Ptx+Gtx+GrxPL010αlog10(d)S[dBm]P_{rx} = P_{tx} + G_{tx} + G_{rx} - PL_0 - 10\alpha \log_{10}(d) - S \quad [\text{dBm}]

其中 SS 为阴影衰落随机变量,服从高斯分布:

SN(0,σ2)S \sim \mathcal{N}(0, \sigma^2)

σ=6\sigma = 6 dB 为阴影衰落标准差,反映功率波动的剧烈程度。SS 的物理含义是障碍物遮挡造成的额外功率损耗(dB),正值表示信号被衰减,负值表示信号相对增强。

在本实验中的应用

代码中,阴影衰落随机变量在初始化时生成,每个终端一个:

self.mrnd = np.random.randn(self.Mnum)  # S ~ N(0, 1)
python

在增强组中,放大了阴影衰落幅度:

shadow = self.mrnd[idx]
if self.sinr_enabled:
    shadow = self.sigma * shadow  # sigma = 6, 即 S ~ N(0, 36)
python

此时 SN(0,36)S \sim \mathcal{N}(0, 36),标准差为 6 dB。这意味着相同距离的终端,接收功率可能相差十几 dB 甚至更多。

在系统中的角色

阴影衰落是信道模块的第二层衰落,位于路径损耗之上、Rayleigh 衰落之下。它引入了空间上的随机性,相同距离的终端有不同的接收功率,不同位置的终端信道条件差异明显。

这种随机性对仿真结果有重要影响:阴影衰落使得某些距离较远的终端反而比距离近的终端信号更强,这直接影响了 SINR 计算和捕获效应的判决结果。在捕获效应中,信号最强的终端不一定是离基站最近的终端,而是叠加了阴影衰落后功率最高的终端。

3.3 噪声功率计算#

模型提出的原因

接收机在接收信号时,除了来自其他终端的干扰之外,还不可避免地受到热噪声的影响。热噪声是由电子元器件中自由电子的热运动产生的,是所有通信系统都无法消除的基本噪声源。在仿真中需要计算热噪声功率,作为 SINR 计算的分母组成部分。

数学表达式

N=N0+10log10(BW)+NF[dBm]N = N_0 + 10\log_{10}(BW) + NF \quad [\text{dBm}]

其中:

  • N0=174N_0 = -174 dBm/Hz:热噪声功率谱密度,对应常温 290K 下的物理极限
  • BW=Rs=256×103BW = R_s = 256 \times 10^3 Hz:信号带宽,本实验中等于符号速率
  • NF=5NF = 5 dB:接收机噪声系数,反映实际接收机相比理想接收机的额外噪声

代入数值:N=174+10log10(256000)+5=174+54.1+5=114.9N = -174 + 10\log_{10}(256000) + 5 = -174 + 54.1 + 5 = -114.9 dBm。

在本实验中的应用

噪声功率在初始化时一次性计算,仿真过程中保持不变:

self.NoisePowerdBm = self.N0 + 10 * np.log10(self.sym_rate) + self.NF
self.NoisePower = 10 ** (self.NoisePowerdBm / 10)
python

转换为线性单位(mW)后参与 SINR 计算:SINR=Pmax/(N+Pinterference)\text{SINR} = P_{max} / (N + P_{interference}),其中 NN 即为 self.NoisePower

在系统中的角色

噪声功率是 SINR 计算的基准,它决定了在没有干扰的情况下,接收机能以多高的信噪比解调信号。当干扰功率远大于噪声功率时,系统是干扰受限的,噪声的影响可以忽略;当干扰功率很小(如低负载时),系统是噪声受限的,噪声功率决定了接收性能的上限。

3.4 Rayleigh 衰落#

模型提出的原因

路径损耗和阴影衰落描述的是信号在较长距离上的变化规律,但现实中信号还会在很短的距离内发生快速波动,即使终端只移动几厘米,接收功率也可能变化十几 dB 甚至更多。这是由于信号经过建筑物、地面等物体的多次反射、散射、衍射后,以多条路径叠加的形式到达接收端。这些多径信号的相位不同,叠加后可能增强也可能抵消,造成接收信号的快速波动。

这种由多径传播引起的快速衰落就是 Rayleigh 衰落,也称小尺度衰落或快衰落。当传播环境中没有直射路径(NLOS)时,接收幅度服从 Rayleigh 分布。

直射路径与无直射路径

直射路径(Line-of-Sight)指发射端和接收端之间没有障碍物遮挡,信号沿直线直接到达,因此直射信号存在且强度远大于其他多径信号。此时接收信号幅度服从 Rician 分布,有一个稳定的强分量叠加随机波动。典型场景包括空旷平原、卫星通信、视距范围内的微波链路。

无直射路径(Non-Line-of-Sight)指直射信号被建筑物等障碍物完全遮挡,接收端只能收到经过反射、散射、衍射后到达的信号,此时没有任何一条路径的信号占据主导低位。各多径信号的幅度和相位都是随机的,接收信号幅度服从 Rayleigh 分布。典型场景包括城市密集区、室内环境、隧道和地下停车场。

本实验的改进部分使用 Rayleigh 衰落,假设所有终端都处于 NLOS 环境,这与对数路径损耗模型中 α=3\alpha = 3 的假设一致:城市宏蜂窝场景中,基站与终端之间通常存在建筑物遮挡,直射路径被阻断。

数学表达式

Rayleigh 衰落的信道增益建模为复高斯随机变量:

hCN(0,1)h \sim \mathcal{CN}(0, 1)

其中 CN(0,1)\mathcal{CN}(0, 1) 表示均值为 0、方差为 1 的复高斯分布。hh 可以写成实部和虚部的形式:h=hR+jhIh = h_R + j h_I,其中 hR,hIN(0,1/2)h_R, h_I \sim \mathcal{N}(0, 1/2)

接收幅度 h|h| 服从 Rayleigh 分布,功率增益 h2|h|^2 服从指数分布:

h2Exp(1)|h|^2 \sim \text{Exp}(1)

其均值为 1,即 Rayleigh 衰落的平均增益为 0 dB,不会改变接收功率的长期均值,只引入短期波动。

在本实验中的应用

代码中,通过 channel_model 参数控制是否启用 Rayleigh 衰落。在 _calculate_power() 方法中,每次计算接收功率时重新采样 Rayleigh 衰落增益:

if self.channel_model == "rayleigh":
    h = (np.random.randn(len(idx)) + 1j * np.random.randn(len(idx))) / np.sqrt(2)
    rayleigh_gain = np.maximum(np.abs(h) ** 2, 1e-12)
    power += 10 * np.log10(rayleigh_gain)
python

其中 / np.sqrt(2) 保证 hCN(0,1)h \sim \mathcal{CN}(0, 1),使 h2|h|^2 的均值为 1。np.maximum(..., 1e-12) 防止增益过小导致 log10(0)\log_{10}(0) 数值异常。

叠加后接收功率变为:

Prx(t)=Ptx+Gtx+GrxPL010αlog10(d)S+10log10(h(t)2)P_{rx}(t) = P_{tx} + G_{tx} + G_{rx} - PL_0 - 10\alpha \log_{10}(d) - S + 10\log_{10}(|h(t)|^2)

Rayleigh 衰落是时变的,每次计算接收功率时重新采样,模拟信道的快速波动。这意味着同一终端在不同时刻的接收功率不同,即使位置没有变化。

两组实验的信道配置差异:

配置baselineenhanced
信道模型log_distance(路径损耗 + 阴影衰落)rayleigh(路径损耗 + 阴影衰落 + Rayleigh 快衰落)
阴影衰落标准差1.0 dB6.0 dB

在系统中的角色

Rayleigh 衰落是信道模块的第三层衰落,位于路径损耗和阴影衰落之上,是最内层、变化最快的衰落。它模拟的是多径传播导致的信号快速波动。

典型应用场景包括城市密集区(高楼林立,信号被建筑物反复反射)、室内环境(信号经过墙壁、家具等多次反射)、隧道和地下停车场(封闭环境中的多径传播)。

Rayleigh 衰落使得接收功率在短时间内剧烈波动,直接影响 SINR 计算和捕获效应的判决。在某些时刻,原本信号较弱的终端可能因为衰落的随机增强而变得信号最强,从而被成功捕获。这增加了仿真结果的随机性,也使得协议性能在不同信道条件下表现出更大的差异。

四、SINR 与捕获效应#

4.1 为什么用 SINR 而不是 SNR#

SNR(信噪比)只考虑信号功率与噪声功率之比:

SNR=PsignalNnoise\text{SNR} = \frac{P_{signal}}{N_{noise}}

SNR 适用于只有一个发射端的场景——接收端只需要从噪声中提取有用信号。

SINR(信号干扰噪声比)同时考虑噪声和来自其他发射端的干扰:

SINR=PsignalNnoise+Pinterference\text{SINR} = \frac{P_{signal}}{N_{noise} + P_{interference}}

本仿真的场景是多个终端竞争同一信道,当多个终端同时发送时,其他终端的信号对目标终端而言就是干扰。此时必须使用 SINR,因为干扰功率(来自其他同时发送的终端)是影响解调成功与否的关键因素。

对比

指标分子分母适用场景
SNR信号功率噪声功率单用户点对点通信
SINR信号功率噪声 + 干扰功率多用户竞争信道(本仿真)

如果在本仿真中使用 SNR 而忽略干扰项,等于假设同时发送的终端之间互不影响,这与现实不符,也无法体现冲突和捕获效应。

4.2 捕获效应#

基本概念

当多个终端同时发送数据包时,传统观点认为所有信号互相干扰,接收端无法解调任何一个信号,所有数据包都丢失。但实际情况并非如此:如果多个同时发送的信号中,最强信号的 SINR 超过解调门限,接收端仍然可以从干扰中解调出这个最强信号。这就是捕获效应。

物理机制

接收端收到多个叠加的信号后,会尝试从中提取最强的那个信号。能否成功解调取决于:

SINRmax=PmaxN+jiPrx,jγth\text{SINR}_{max} = \frac{P_{max}}{N + \sum_{j \neq i} P_{rx,j}} \geq \gamma_{th}

其中 PmaxP_{max} 为最强信号的接收功率,NN 为热噪声功率,jiPrx,j\sum_{j \neq i} P_{rx,j} 为其他同时发送终端的干扰功率之和,γth=10\gamma_{th} = 10 dB 为解调门限。只要最强信号的 SINR 达到门限,该信号就能被成功解调,其余信号仍然冲突丢失。

直观理解

想象一个房间里有 10 个人同时说话,你可能听不清大多数人说什么,但如果其中有一个人声音特别大(比如站在你耳边),你仍然能听清他说的内容——其他人的声音变成了”背景噪音”,但不足以淹没这个最强的声音。在无线网络中,离基站最近的终端信号最强,即使有其他终端同时发送,只要干扰不太大,基站仍然能解调出这个最强信号。

在本实验中的应用

代码中,_resolve_channel() 方法实现了捕获效应的判决:

def _resolve_channel(self, idx: np.ndarray):
    if len(idx) <= 1:
        return
    self.collision_count += 1
    max_pos, sinr_db = self._calculate_sinr(idx)
    if self.Mstate[idx[max_pos]] == TRANSMIT:
        self.Mstate[idx] = COLLISION          # 先默认全部冲突
        if sinr_db >= self.tcn:               # 再检查最强信号是否达标
            self.Mstate[idx[max_pos]] = TRANSMIT  # 捕获成功
            self.capture_success_count += 1
python

判决逻辑:当多个终端同时发送时,先计算最强信号的 SINR,如果 SINR10\text{SINR} \geq 10 dB,则最强终端标记为”成功发送”,其余终端标记为”冲突”。

捕获效应对协议性能的影响

场景无捕获效应有捕获效应
多终端同时发送全部冲突丢失最强信号可能被成功解调
吞吐量较低较高(部分冲突变为成功)
公平性所有终端同等对待离基站近的终端更有优势

捕获效应提升了系统的整体吞吐量,在传统冲突模型下完全丢失的数据包,在捕获效应下可能有一部分被成功接收。但这也引入了不公平性:离基站近、信号强的终端更容易被捕获成功,而离基站远的终端即使先发送也可能被”抢走”信道。

五、拓扑与运动模型#

拓扑与运动模型不属于信号处理主链路(信源 → MAC 层 → 发射机 → 信道 → 接收机 → 统计分析),而是信道模块的前置依赖,为信道模块提供终端位置输入。它的功能是在覆盖区域内生成终端的初始位置,并在仿真过程中根据运动模型动态更新终端位置。终端位置决定了每个终端到基站的距离,进而影响路径损耗和接收功率。

本实验涉及两种拓扑与运动模型:静态终端(位置固定不变)、随机路点(有目的地和停留行为的移动)。

5.1 终端位置生成#

在半径 r=100r = 100 m 的圆形覆盖区域内均匀生成 Mnum=100M_{num} = 100 个终端,AP 位于 (0,0,5)(0, 0, 5)

均匀分布生成方法

在圆形区域内均匀生成随机点,不能直接对半径 rr 均匀采样,否则点会集中在圆心附近。正确的方法是对半径进行平方根变换:

r=rU,UUniform(0,1)r' = r \cdot \sqrt{U}, \quad U \sim \text{Uniform}(0, 1)

角度 θ\theta[0,2π)[0, 2\pi) 上均匀采样,转换为直角坐标:

x=rcosθ,y=rsinθx = r' \cos\theta, \quad y = r' \sin\theta

三维距离计算

终端与基站的距离需考虑高度差。AP 位于 (0,0,5)(0, 0, 5),终端位于 (x,y,0)(x, y, 0),距离为:

d=x2+y2+(zAPzterminal)2=x2+y2+25d = \sqrt{x^2 + y^2 + (z_{AP} - z_{terminal})^2} = \sqrt{x^2 + y^2 + 25}

由于 zAP=5z_{AP} = 5m,即使终端位于圆心,最小距离也为 5m。

在本实验中的应用

代码中 _generate_terminal_positions() 方法生成终端位置,保存在 self.mxy 数组中。baseline 配置下终端位置固定不变,enhanced 配置下终端按随机路点模型移动,位置随仿真推进动态更新。

5.2 随机路点模型#

模型提出的原因

静态终端模型假设终端位置永远不变,这在真实场景中几乎不存在。实际的无线网络终端(如行人、车辆、无人机)都在持续移动,终端与基站的距离随时间变化,信道条件也随之波动。Random Waypoint 模型是无线网络仿真中最经典的移动模型之一,它引入了”有目的地的移动”和”到达后暂停”两个特征,比简单的随机游走更贴近真实行为。

数学模型

每个终端重复以下循环:

  1. 选择目标点:在半径 rr 的圆形覆盖区域内随机选择目标点 (xtarget,ytarget)(x_{target}, y_{target}),采用均匀分布生成:
r=rU,θ=2πV,U,VUniform(0,1)r' = r \cdot \sqrt{U}, \quad \theta = 2\pi V, \quad U, V \sim \text{Uniform}(0, 1) xtarget=rcosθ,ytarget=rsinθx_{target} = r' \cos\theta, \quad y_{target} = r' \sin\theta
  1. 选择移动速度:在 [vmin,vmax][v_{min}, v_{max}] 范围内随机选取速度 vv
v=vmin+(vmaxvmin)Uv,UvUniform(0,1)v = v_{min} + (v_{max} - v_{min}) \cdot U_v, \quad U_v \sim \text{Uniform}(0, 1)
  1. 向目标移动:计算当前朝目标方向的单位向量,位置按速度推进:
d=rtargetrcurrentrtargetrcurrent\vec{d} = \frac{\vec{r}_{target} - \vec{r}_{current}}{|\vec{r}_{target} - \vec{r}_{current}|} r(t+Δt)=r(t)+vdΔt\vec{r}(t + \Delta t) = \vec{r}(t) + v \cdot \vec{d} \cdot \Delta t

当剩余距离小于步长时,直接将终端定位到目标点。

  1. 到达后暂停:到达目标点后,暂停一段时间 tpauset_{pause}
tpause=tmaxUp,UpUniform(0,1)t_{pause} = t_{max} \cdot U_p, \quad U_p \sim \text{Uniform}(0, 1)

暂停结束后回到步骤 1,选择新的目标点和速度。

本实验参数:vmin=0.5v_{min} = 0.5vmax=2.0v_{max} = 2.0tmax=1.0t_{max} = 1.0 秒。

在本实验中的应用

代码中通过 _init_mobility()_refresh_waypoint_target()_update_positions() 三个方法实现 Random Waypoint 模型。初始化时为每个终端随机生成目标点和移动速度;每次事件触发时调用 _update_positions() 按时间间隔推进终端位置,处理暂停、移动、到达、选新目标的完整循环;到达目标后调用 _refresh_waypoint_target() 选择新目标点和速度。每次仿真(不同 GG 值)前恢复初始拓扑,避免上一次仿真结果影响下一组。

在系统中的角色

Random Waypoint 模型属于拓扑模块,不属于信号处理主链路,而是信道模块的前置依赖。它为信道模块提供随时间变化的终端位置,使得距离 di(t)d_i(t) 和接收功率 Prx,i(t)P_{rx,i}(t) 随仿真推进动态更新。终端移动带来的信道条件变化直接影响 SINR 计算和捕获效应的判决结果。

六、MAC 协议#

MAC 协议是仿真信号处理链路的第二环节,位于信源之后、发射机之前。它的功能是决定终端何时可以接入信道,当终端有数据待发送时,由 MAC 协议控制发送时机、处理冲突、安排重传。不同的 MAC 协议在信道利用率和冲突概率之间有不同的权衡。

6.1 Pure ALOHA#

协议提出的原因

在无线网络中,多个终端共享同一信道。最简单的接入方式是”有数据就发”,不进行任何信道检测或协调,终端一旦产生数据包就立即发送。这种最简单的协议就是 Pure ALOHA,由夏威夷大学的 Abramson 于 1970 年提出,最初用于解决卫星通信中的随机接入问题。它的价值在于提供了一个性能基准:任何更复杂的协议都应该比 Pure ALOHA 表现更好,否则就没有引入的必要。

工作机制和原理

Pure ALOHA 的核心规则只有一条:终端有数据就立即发送,不做任何信道检测。

具体工作流程:

  1. 数据包到达:终端按泊松过程产生数据包,到达时刻由信源模块决定。到达时刻到来时,终端进入”有数据待发送”状态

  2. 立即发送:终端不做载波侦听,到达时刻一到就立即占用信道开始发送,发送持续时间为 Ttran=L/RsT_{tran} = L / R_s

  3. 冲突检测:当多个终端同时占用信道时,通过 SINR 捕获判决判断冲突。若最强信号的 SINR 未达到解调门限 γth=10\gamma_{th} = 10 dB,则所有终端判定为冲突

  4. 退避重传:冲突终端按指数退避策略等待一段随机时间后重新发送:

tbackoff=Rintln(1U),UUniform(0,1)t_{backoff} = -R_{int} \cdot \ln(1 - U), \quad U \sim \text{Uniform}(0, 1)

其中 RintR_{int} 为退避时间均值。退避时间服从指数分布,利用了无记忆性,冲突终端不依赖历史冲突次数,每次退避独立生成。

  1. 成功传输:若终端发送结束时状态仍为 TRANSMIT(未被冲突覆盖),则计为成功传输,累计吞吐量,终端随后按泊松过程产生下一个数据包。

关键缺陷

Pure ALOHA 的关键缺陷在于冲突窗口。假设一个数据包在时刻 tt 开始发送,持续时间 TtranT_{tran},则其冲突窗口为 [tTtran,t+Ttran][t - T_{tran}, t + T_{tran}],总长度为 2Ttran2 T_{tran}。任何其他终端在这个时间窗口内开始发送,都会与该数据包发生冲突。这个”两倍传输时间”的冲突窗口是 Pure ALOHA 性能较低的根本原因。

理论最大吞吐量

设归一化业务负载为 GG,Pure ALOHA 的吞吐量公式为:

S=Ge2GS = G \cdot e^{-2G}

其中 e2Ge^{-2G} 表示在冲突窗口 2Ttran2T_{tran} 内没有其他终端发送的概率。当 G=0.5G = 0.5 时吞吐量达到最大值:

Smax=12e0.184S_{max} = \frac{1}{2e} \approx 0.184

即信道最多只有约 18.4% 的时间被有效利用。

在本实验中的应用

代码中 _pure_aloha_protocol() 方法实现了 Pure ALOHA 的事件处理逻辑。初始化时为每个终端生成泊松到达时间;每次事件触发时依次处理成功传输(累计吞吐量、生成新包)、冲突退避(指数退避重传)、新终端发送(立即占用信道)。终端状态包括 STANDBY(空闲)、TRANSMIT(发送中)、COLLISION(冲突),通过状态机驱动协议流程。

6.2 Slotted ALOHA#

协议提出的原因

Pure ALOHA 的最大吞吐量仅为 1/2e18.4%1/2e \approx 18.4\%,根本原因是冲突窗口长达 2Ttran2T_{tran}——一个数据包发送前后的各一倍传输时间内都可能发生冲突。Roberts 于 1972 年提出了 Slotted ALOHA,通过引入时隙结构将冲突窗口缩小一半,从而使最大吞吐量翻倍。

工作机制和原理

Slotted ALOHA 的核心改进:将时间划分为等长的时隙,终端只能在时隙边界开始发送,不能随时发送。

具体工作流程:

  1. 时隙划分:将时间轴划分为长度为 Tslot=Ttran=L/RsT_{slot} = T_{tran} = L / R_s 的等长时隙,时隙长度等于一个数据包的传输时间。

  2. 时隙对齐:终端产生数据包后,不立即发送,而是等待到下一个时隙边界才开始发送。代码中通过向上取整实现对齐:

tsend=(tarrivalTslot+1)Tslott_{send} = \left(\left\lfloor \frac{t_{arrival}}{T_{slot}} \right\rfloor + 1\right) \cdot T_{slot}
  1. 冲突窗口缩小:由于所有发送都在时隙边界开始,冲突只可能发生在同一时隙内。冲突窗口从 Pure ALOHA 的 2Ttran2T_{tran} 缩小为 Tslot=TtranT_{slot} = T_{tran},减半。

  2. 退避重传:冲突终端按指数退避等待后,同样对齐到时隙边界发送:

tbackoff=(tnowRintln(1U)Tslot+1)Tslott_{backoff} = \left(\left\lfloor \frac{t_{now} - R_{int} \cdot \ln(1 - U)}{T_{slot}} \right\rfloor + 1\right) \cdot T_{slot}
  1. 发送结束对齐:发送结束时间也对齐到时隙边界,确保同一时隙内的所有终端同时结束,便于统一处理冲突判决。

与 Pure ALOHA 的对比

特征Pure ALOHASlotted ALOHA
发送时机有数据立即发送仅在时隙边界发送
冲突窗口2Ttran2T_{tran}TtranT_{tran}
理论最大吞吐量1/2e0.1841/2e \approx 0.1841/e0.3681/e \approx 0.368
最优工作点 GG0.51.0
实现复杂度需要时钟同步

Slotted ALOHA 以时钟同步为代价,将吞吐量提升了一倍。

理论最大吞吐量

S=GeGS = G \cdot e^{-G}

G=1G = 1 时吞吐量达到最大值:

Smax=1e0.368S_{max} = \frac{1}{e} \approx 0.368

即信道最多约 36.8% 的时间被有效利用。

在本实验中的应用

代码中 _slotted_aloha_protocol() 方法实现了 Slotted ALOHA 的事件处理逻辑。与 Pure ALOHA 的关键区别在于三个时间点都做了时隙对齐:到达时间对齐到下一个时隙边界、退避时间对齐到时隙边界、发送结束时间对齐到时隙边界。时隙长度 Tslot=L/Rs=128/256000=0.0005T_{slot} = L / R_s = 128 / 256000 = 0.0005 秒。

6.3 np-CSMA#

协议提出的原因

ALOHA 协议(无论 Pure 还是 Slotted)的核心问题是终端在发送前完全不感知信道状态,即使其他终端正在发送,自己也照发不误,导致冲突概率很高。CSMA(Carrier Sense Multiple Access,载波侦听多路访问)协议的核心改进是:发送前先侦听信道,只有信道空闲时才发送,信道忙则等待。这大大减少了冲突概率。

CSMA 有多种变体,按”信道忙时如何处理”分为:

  • 1-坚持 CSMA:持续侦听,信道一空闲就立即发送
  • p-坚持 CSMA:以概率 pp 在信道空闲时发送
  • 非坚持 CSMA:信道忙时随机退避一段时间再重新侦听,不持续监听

非坚持 CSMA 的优势在于避免了多个终端同时等待信道空闲后立即发送导致的群冲突。

工作机制和原理

np-CSMA 的核心规则:发送前先侦听信道,空闲则发送,忙则退避。

具体工作流程:

  1. 数据包到达:终端按泊松过程产生数据包,到达后进入待发送状态。

  2. 载波侦听:终端在发送前调用 _carrier_sense() 检查信道是否空闲。侦听机制通过检查当前时刻是否落在某次传输窗口内来判断信道状态,并引入传播延迟 DtimeTtranD_{time} \cdot T_{tran} 模拟侦听延迟,刚开始的发送不会立即被侦听到。

  3. 信道空闲:立即占用信道开始发送,发送持续时间为 Ttran=L/RsT_{tran} = L / R_s

  4. 信道忙:终端不持续监听,而是按指数退避等待一段随机时间后重新侦听:

tbackoff=Rintln(1U),UUniform(0,1)t_{backoff} = -R_{int} \cdot \ln(1 - U), \quad U \sim \text{Uniform}(0, 1)
  1. 冲突处理:若多个终端同时侦听到信道空闲并同时发送,仍会发生冲突。冲突终端同样按指数退避等待后重新进入侦听流程。

与 ALOHA 的关键区别

特征Pure ALOHASlotted ALOHAnp-CSMA
发送前侦听
发送时机有数据立即发送时隙边界发送侦听空闲后发送
信道忙时处理不关心不关心随机退避后再侦听
冲突概率最高中等最低

np-CSMA 通过载波侦听减少了冲突,但引入了侦听延迟,且在传播延迟较大时侦听可能不准确(远端终端的发送还未传播到本地)。

在本实验中的应用

代码中 _np_csma_protocol() 方法实现了 np-CSMA 的事件处理逻辑。与 ALOHA 协议的关键区别在”处理待发送”环节:终端到达发送时刻后,不直接占用信道,而是先调用 _carrier_sense() 侦听信道。若信道空闲,立即发送;若信道忙,按指数退避等待后重新尝试。_carrier_sense() 通过检查其他终端的发送开始时间 Mstime 和传输窗口来判断信道状态,并引入 DtimeTtranD_{time} \cdot T_{tran} 的传播延迟。

七、性能指标#

性能指标是仿真信号处理链路的最后一个环节,位于接收机之后。它的功能是统计仿真过程中的各项数据,计算吞吐量、业务负载等系统级指标,用于评估不同 MAC 协议在不同条件下的性能表现。性能指标模块不参与信号处理,只负责记录和汇总。

7.1 吞吐量 SS#

提出该参数的目的

在无线网络中,多个终端共享同一信道,由于冲突、退避、信道忙等原因,并非所有发送的数据包都能成功传输。吞吐量 SS 衡量的是信道被有效利用的比例,在单位时间内,有多少比例的时间被用于成功传输数据。它是评估 MAC 协议性能最核心的指标,直接反映了协议的效率。

计算公式

S=成功传输的比特数仿真总时间×符号速率=SplenRsTtotalS = \frac{\text{成功传输的比特数}}{\text{仿真总时间} \times \text{符号速率}} = \frac{S_{plen}}{R_s \cdot T_{total}}

其中:

  • SplenS_{plen}:仿真期间所有成功传输的数据包的总符号数(累计成功包数 ×\times 包长 LL
  • RsR_s:符号速率,256×103256 \times 10^3 符号/秒
  • TtotalT_{total}:仿真总时间

SS 是无量纲的归一化指标,取值范围为 [0,1][0, 1]S=1S = 1 表示信道被 100% 有效利用,S=0S = 0 表示没有任何数据包成功传输。

如何利用它评价系统性能

吞吐量 SS 需要与业务负载 GG 配合使用,通过 SS-GG 曲线来评价协议性能:

  • 低负载(GG 较小)时:SGS \approx G,几乎无冲突,信道空闲时间多,吞吐量随负载线性增长
  • 中等负载时:SS 达到峰值,即协议的最大吞吐量 SmaxS_{max},这是协议的最优工作点
  • 高负载(GG 较大)时:SS 下降,冲突增多导致大量数据包丢失,信道利用率反而降低

不同协议的最大吞吐量不同:Pure ALOHA 约 0.184,Slotted ALOHA 约 0.368,np-CSMA 通常更高。通过对比不同协议在同一负载下的 SS 值,可以判断哪种协议在给定场景下更高效。

7.2 业务负载 GG#

提出该参数的目的

业务负载 GG 衡量的是终端向信道”请求”发送数据的强度,即单位时间内所有终端试图发送的总数据量与信道容量的比值。它与吞吐量 SS 的区别在于:SS 统计的是成功传输的部分,而 GG 统计的是所有尝试发送的部分(包括成功和冲突的)。GG 是系统的输入,SS 是系统的输出,两者的关系反映了协议的效率。

计算公式

G=总传输比特数仿真总时间×符号速率=TplenRsTtotalG = \frac{\text{总传输比特数}}{\text{仿真总时间} \times \text{符号速率}} = \frac{T_{plen}}{R_s \cdot T_{total}}

其中:

  • TplenT_{plen}:仿真期间所有终端尝试发送的数据包的总符号数(不论成功与否)
  • RsR_s:符号速率,256×103256 \times 10^3 符号/秒
  • TtotalT_{total}:仿真总时间

GG 同样是无量纲的归一化指标。G=1G = 1 表示终端请求发送的数据量等于信道容量;G>1G > 1 表示请求量超过信道容量,必然产生冲突。

如何利用它评价系统性能

GG 是仿真的控制变量,通过扫描 GG 从 0.1 到 2.0,逐步增大业务负载,观察协议在不同负载下的吞吐量表现。具体做法是:对每个 GG 值,调整终端的平均到达间隔 TintT_{int},使系统总发送请求量达到目标 GG,然后运行仿真得到对应的 SS 值。

GG 值的物理含义:

  • G<1G < 1:信道未饱和,终端请求量低于信道容量,理论上可以全部成功传输
  • G=1G = 1:信道饱和点,请求量等于信道容量
  • G>1G > 1:信道过载,请求量超过信道容量,冲突不可避免

通过绘制 SS-GG 曲线,可以观察协议在不同负载区间的表现:低负载时 SGS \approx G(无冲突)、峰值处为最优工作点、高负载时 SS 下降(冲突增多)。

7.3 吞吐量-负载曲线#

横轴为 GG,纵轴为 SS,曲线反映了协议在不同负载下的性能:

  • 低负载时 SGS \approx G(几乎无冲突)
  • 高负载时 SS 下降(冲突增多)
  • 峰值点为协议的最优工作点

理论曲线与仿真曲线的差异

理论公式 S=Ge2GS = Ge^{-2G}(Pure ALOHA)和 S=GeGS = Ge^{-G}(Slotted ALOHA)假设:当多个终端同时发送时,所有数据包全部丢失,无一幸免。这个假设在无捕获效应的传统冲突模型下成立。

但本仿真实现了 SINR 捕获判决:当多个终端同时发送时,程序计算最强信号的 SINR,若 SINR10\text{SINR} \geq 10 dB,最强终端的数据包仍然可以被成功解调。这意味着理论上的”冲突”在仿真中有一部分变成了”成功传输”,因此仿真得到的吞吐量 SS 高于理论值。

这种差异在高负载时尤为明显:GG 越大,同时发送的终端越多,冲突越频繁,但捕获效应”挽救”了一部分数据包,使得仿真曲线在理论曲线上方。

因此,判断 SS-GG 曲线时需要注意:

  • 仿真曲线高于理论曲线是正常的,说明捕获效应在起作用
  • 仿真曲线低于理论曲线则说明仿真可能存在问题(参数配置错误、代码 bug 等)
  • baseline 和 enhanced 两组实验的曲线差异反映了信道模型和业务模型改进的影响
信息建模与仿真实验相关知识点
Author Juyao Huang
Published at May 23, 2026
Comment seems to stuck. Try to refresh?✨