摘要

本文系统研究了在正交频分复用(OFDM)系统中,利用进化算法(遗传算法GA、粒子群优化PSO、灰狼优化GWO)优化导频位置以提升信道估计性能。通过构建完整的仿真框架,对比了均匀导频、边缘均匀导频、随机导频及多种进化算法导频的均方误差(MSE)与误比特率(BER)。

1. 背景与意义

1.1 OFDM 与信道估计

正交频分复用(OFDM)技术是现代无线通信系统的基石,广泛应用于 4G/5G 移动通信、Wi-Fi、数字电视广播等领域。OFDM 通过将高速数据流分配到多个正交子载波上传输,有效对抗频率选择性衰落,并简化了均衡器的设计。

然而,OFDM 接收端需要准确知道每个子载波上的信道响应,才能进行相干解调。信道估计的精度直接决定了系统误码率性能。实际无线信道具有时变、频变特性,信道状态信息(CSI)必须实时获取。

1.2 导频辅助的信道估计

最实用的信道估计方法是导频辅助:在发送信号中插入收发双方已知的导频符号,接收端利用这些导频来估计信道。这一方案面临一个经典权衡:

导频数量 优点 缺点
信道估计准确 频谱效率低(导频开销大)
频谱效率高 信道估计精度差

在导频数量固定时,导频在频域上的位置分布成为影响估计质量的关键因素。传统的做法是均匀间隔放置导频——简单、直观,且在信道响应相对平坦时表现良好。但实际信道的频率响应往往不均匀:某些频段变化剧烈,某些频段则较为平缓。均匀导频无法“按需分配”,难以在有限导频预算下达到最优估计。

1.3 为什么引入进化算法?

理论上,最优导频图案可以通过穷举搜索获得——在全部 ( N K ) \binom{N}{K} (KN) 种组合中找到最佳。当子载波数 N = 64 N=64 N=64、导频数 K = 8 K=8 K=8 时,组合数高达 ( 64 8 ) ≈ 4.4 × 10 9 \binom{64}{8} \approx 4.4 \times 10^9 (864)4.4×109,穷举计算量不可接受。

进化算法(Evolutionary Algorithms,EAs)是受自然界“优胜劣汰”或群体智能启发的一类随机优化方法,能够在巨大搜索空间中高效寻找近似最优解。近年来,遗传算法(Genetic Algorithm, GA)、粒子群优化(Particle Swarm Optimization, PSO)、灰狼优化(Grey Wolf Optimizer, GWO)等已被成功应用于无线通信的资源分配、波束成形、导频设计等问题中。

2. 理论基础

本章从 OFDM 基带数学模型出发,严格推导导频辅助信道估计的全过程,深入解析频率选择性信道的统计特性,并将导频图案选择问题形式化为一个带正则化约束的组合优化问题,为后续进化算法的应用奠定坚实的数学基础。


2.1 OFDM 系统模型与信号表征

考虑一个具有 N N N 个子载波的 OFDM 系统(本文 N = 64 N=64 N=64),其中 K K K 个子载波用于传输导频符号( K = 8 K=8 K=8),其余用于传输数据。设 P = { p 0 , p 1 , … , p K − 1 } \mathcal{P} = \{p_0, p_1, \dots, p_{K-1}\} P={p0,p1,,pK1} 为导频子载波索引集合, D \mathcal{D} D 为数据子载波索引集合,满足 P ∪ D = { 0 , 1 , … , N − 1 } \mathcal{P} \cup \mathcal{D} = \{0, 1, \dots, N-1\} PD={0,1,,N1} P ∩ D = ∅ \mathcal{P} \cap \mathcal{D} = \varnothing PD=

发送的频域信号 X [ m ] X[m] X[m] 表示为:

X [ m ] = { P m , m ∈ P D m , m ∈ D (1) X[m] = \begin{cases} P_m, & m \in \mathcal{P} \\ D_m, & m \in \mathcal{D} \end{cases} \tag{1} X[m]={Pm,Dm,mPmD(1)

其中导频符号 P m P_m Pm 为已知的单位增益复指数(本文设为 P m = 1 + 0 j P_m = 1 + 0j Pm=1+0j);数据符号 D m D_m Dm 采用 QPSK 调制,映射规则为:

D m = 1 2 ( ( 1 − 2 b 0 ) + j ( 1 − 2 b 1 ) ) , b 0 , b 1 ∈ { 0 , 1 } (2) D_m = \frac{1}{\sqrt{2}} \left( (1 - 2b_0) + j(1 - 2b_1) \right), \quad b_0, b_1 \in \{0, 1\} \tag{2} Dm=2 1((12b0)+j(12b1)),b0,b1{0,1}(2)

接收端在理想同步条件下,去除循环前缀(CP)并进行 FFT 解调后,第 m m m 个子载波的频域接收信号为:

Y [ m ] = H [ m ] ⋅ X [ m ] + W [ m ] , m = 0 , 1 , … , N − 1 (3) Y[m] = H[m] \cdot X[m] + W[m], \quad m = 0, 1, \dots, N-1 \tag{3} Y[m]=H[m]X[m]+W[m],m=0,1,,N1(3)

其中 H [ m ] H[m] H[m] 为复信道频率响应 (CFR), W [ m ] ∼ C N ( 0 , σ w 2 ) W[m] \sim \mathcal{CN}(0, \sigma_w^2) W[m]CN(0,σw2) 为加性复高斯白噪声。噪声功率由信噪比 (SNR)决定: σ w 2 = 10 − SNR / 10 \sigma_w^2 = 10^{-\text{SNR}/10} σw2=10SNR/10(在信号功率归一化为1的条件下)。


2.2 频率选择性瑞利多径信道建模

本文采用抽头延迟线(Tapped Delay Line, TDL)模型模拟频率选择性衰落信道。时域离散冲激响应为:

h ( τ ) = ∑ l = 0 L − 1 h l ⋅ δ ( τ − l T s ) (4) h(\tau) = \sum_{l=0}^{L-1} h_l \cdot \delta(\tau - lT_s) \tag{4} h(τ)=l=0L1hlδ(τlTs)(4)

其中 L L L 为多径抽头数(取 4, 8, 12), T s T_s Ts 为采样间隔。抽头增益 h l h_l hl 建模为零均值复高斯随机变量:

h l ∼ C N ( 0 , σ l 2 ) (5) h_l \sim \mathcal{CN}(0, \sigma_l^2) \tag{5} hlCN(0,σl2)(5)

这意味着幅度 ∣ h l ∣ |h_l| hl 服从瑞利分布,因此称为瑞利衰落信道。各抽头间相互独立(非相关散射)。

为模拟真实传播环境中“早径强、晚径弱”的物理特性,本文采用指数功率延迟剖面(Exponential Power-Delay Profile)定义抽头功率:

σ ~ l 2 = exp ⁡ ( − l τ rms ) , l = 0 , 1 , … , L − 1 (6) \tilde{\sigma}_l^2 = \exp\left(-\frac{l}{\tau_{\text{rms}}}\right), \quad l = 0, 1, \dots, L-1 \tag{6} σ~l2=exp(τrmsl),l=0,1,,L1(6)

其中 τ rms \tau_{\text{rms}} τrms 为均方根时延扩展,本文取 τ rms = L / 3 \tau_{\text{rms}} = L/3 τrms=L/3,使得最后一条路径功率约为第一条的 e − 3 ≈ 5 % e^{-3} \approx 5\% e35%。为保证总信道功率恒定为 1,进行归一化:

σ l 2 = σ ~ l 2 ∑ i = 0 L − 1 σ ~ i 2 (7) \sigma_l^2 = \frac{\tilde{\sigma}_l^2}{\sum_{i=0}^{L-1} \tilde{\sigma}_i^2} \tag{7} σl2=i=0L1σ~i2σ~l2(7)

最终,信道频率响应通过对时域抽头补零后做 FFT 得到:

H [ m ] = ∑ l = 0 L − 1 h l ⋅ e − j 2 π m l / N , m = 0 , 1 , … , N − 1 (8) H[m] = \sum_{l=0}^{L-1} h_l \cdot e^{-j2\pi ml/N}, \quad m = 0, 1, \dots, N-1 \tag{8} H[m]=l=0L1hlej2πml/N,m=0,1,,N1(8)


2.3 导频辅助信道估计与插值

2.3.1 最小二乘(LS)估计

接收端在导频子载波 m ∈ P m \in \mathcal{P} mP 处,利用已知导频 P m P_m Pm 进行最小二乘估计:

H ^ LS [ m ] = Y [ m ] P [ m ] = H [ m ] + W [ m ] P [ m ] (9) \hat{H}_{\text{LS}}[m] = \frac{Y[m]}{P[m]} = H[m] + \frac{W[m]}{P[m]} \tag{9} H^LS[m]=P[m]Y[m]=H[m]+P[m]W[m](9)

P [ m ] = 1 P[m]=1 P[m]=1 时, H ^ LS [ m ] = Y [ m ] \hat{H}_{\text{LS}}[m] = Y[m] H^LS[m]=Y[m]。LS 估计无偏且实现简单,但无噪声抑制能力。

2.3.2 实虚部分别线性插值

获得 K K K 个导频点的信道估计后,需重构全部 N N N 个子载波的信道响应。本文采用对实部和虚部分别进行线性插值的方法,避免复数直接插值可能引发的相位缠绕问题。

设导频位置为 p 0 < p 1 < ⋯ < p K − 1 p_0 < p_1 < \dots < p_{K-1} p0<p1<<pK1,对应估计值为 H ^ p [ p i ] = a i + j b i \hat{H}_p[p_i] = a_i + j b_i H^p[pi]=ai+jbi。对于任意目标子载波 m m m p i ≤ m ≤ p i + 1 p_i \leq m \leq p_{i+1} pimpi+1),插值公式为:

ℜ { H ^ [ m ] } = a i + a i + 1 − a i p i + 1 − p i ⋅ ( m − p i ) (10a) \Re\{\hat{H}[m]\} = a_i + \frac{a_{i+1} - a_i}{p_{i+1} - p_i} \cdot (m - p_i) \tag{10a} {H^[m]}=ai+pi+1piai+1ai(mpi)(10a)

ℑ { H ^ [ m ] } = b i + b i + 1 − b i p i + 1 − p i ⋅ ( m − p i ) (10b) \Im\{\hat{H}[m]\} = b_i + \frac{b_{i+1} - b_i}{p_{i+1} - p_i} \cdot (m - p_i) \tag{10b} {H^[m]}=bi+pi+1pibi+1bi(mpi)(10b)

对于边缘区域( m < p 0 m < p_0 m<p0 m > p K − 1 m > p_{K-1} m>pK1),采用最近邻外推。

2.3.3 数据均衡与 BER 计算

得到全频带信道估计 H ^ [ m ] \hat{H}[m] H^[m] 后,对数据子载波进行迫零均衡:

D ^ [ m ] = Y [ m ] H ^ [ m ] + ϵ , m ∈ D , ϵ = 10 − 12 (11) \hat{D}[m] = \frac{Y[m]}{\hat{H}[m] + \epsilon}, \quad m \in \mathcal{D}, \quad \epsilon = 10^{-12} \tag{11} D^[m]=H^[m]+ϵY[m],mD,ϵ=1012(11)

均衡后的符号经 QPSK 硬判决解调恢复比特,并与原始比特比较计算误比特率(BER)


2.4 均匀导频的最优性理论解释

假设信道频率响应 H ( f ) H(f) H(f) 在频域上是带限的,其最大变化率由信道的相干带宽 (Coherence Bandwidth) B c B_c Bc 决定。根据Nyquist 采样定理,为了无失真地重建 H ( f ) H(f) H(f),导频在频域的采样间隔 Δ f \Delta f Δf 必须满足:

Δ f ≤ B c 2 \Delta f \leq \frac{B_c}{2} Δf2Bc

当导频数量 K K K 固定时,均匀导频使 Δ f \Delta f Δf 在全局上取得最小可能的最大间隔:

Δ f uniform = N K (子载波间隔单位) \Delta f_{\text{uniform}} = \frac{N}{K} \quad \text{(子载波间隔单位)} Δfuniform=KN(子载波间隔单位)

而非均匀导频必然存在局部最大间隔 Δ f max > N / K \Delta f_{\text{max}} > N/K Δfmax>N/K。由奈奎斯特 (Nyquist) 准则可知,这会导致高频分量混叠,产生不可恢复的插值误差。均匀导频在最坏情况下的插值误差最小,即满足**最小化最大误差 (Minimax)**准则。这是均匀导频在数学上的第一重最优性。

2.5 既然均匀导频已经最优,为什么还要研究进化算法?

2.5.1 理论最优的前提是“无约束”

本节(第 2.7 节)的最优性结论成立,依赖于三个前提:

  1. 信道严格满足广义平稳(WSS),即统计特性不随频率变化。
  2. 导频位置无任何硬件或标准约束(如禁用子载波、DC 子载波、保护频带)。
  3. 唯一的性能指标是 MSE,不考虑 BER、PAPR、频谱泄露等系统级指标。

当这些前提被打破时,均匀导频的最优性不再成立。

2.5.2 进化算法在“约束场景”中依然有效

在实际 OFDM 系统中,以下硬约束普遍存在,且均匀导频无法同时满足:

  • 禁用子载波(Notched Carriers):某些频段被强干扰占用或留作保护间隔,导频必须避开。
  • DC 子载波:零频处通常不传输数据,均匀导频若落在 DC 上就必须强制搬移。
  • 非连续频谱(Carrier Aggregation):多段不连续频谱聚合时,导频无法跨频段保持均匀。

在这些场景下,均匀导频不存在,而进化算法是寻找最优可行图案的可行工具。

2.6 导频位置优化问题的数学形式化

2.6.1 组合优化问题定义

N N N 个子载波中选择 K K K 个导频位置,本质是一个组合优化问题。其数学形式为:

min ⁡ P ⊂ { 0 , … , N − 1 } , ∣ P ∣ = K Φ ( P ) (12) \min_{\mathcal{P} \subset \{0, \dots, N-1\}, |\mathcal{P}|=K} \Phi(\mathcal{P}) \tag{12} P{0,,N1},P=KminΦ(P)(12)

解空间规模为:

∣ Ω ∣ = ( N K ) = ( 64 8 ) ≈ 4.426 × 10 9 (13) |\Omega| = \binom{N}{K} = \binom{64}{8} \approx 4.426 \times 10^9 \tag{13} ∣Ω∣=(KN)=(864)4.426×109(13)

该问题是非凸、离散、多模态的黑盒优化问题,目标函数 Φ ( P ) \Phi(\mathcal{P}) Φ(P) 无解析梯度,且每次评估需进行蒙特卡洛仿真,计算代价高昂,因此传统梯度下降法不适用。

2.6.2 目标函数 Φ ( P ) \Phi(\mathcal{P}) Φ(P) 的显式定义

本文采用两种目标函数变体,分别对应不同的优化策略。这是整个优化问题的核心定义


变体一:基线目标函数(用于 GA / PSO / GWO)

Φ base ( P ) = 1 N s N c ∑ s = 1 N s ∑ c = 1 N c MSE s , c ( P ) ⏟ 平均信道估计均方误差 + λ s ⋅ Ψ spacing ( P ) + λ e ⋅ Ψ edge ( P ) ⏟ 几何正则化项 (14) \Phi_{\text{base}}(\mathcal{P}) = \underbrace{\frac{1}{N_s N_c} \sum_{s=1}^{N_s} \sum_{c=1}^{N_c} \text{MSE}_{s,c}(\mathcal{P})}_{\text{平均信道估计均方误差}} + \underbrace{\lambda_s \cdot \Psi_{\text{spacing}}(\mathcal{P}) + \lambda_e \cdot \Psi_{\text{edge}}(\mathcal{P})}_{\text{几何正则化项}} \tag{14} Φbase(P)=平均信道估计均方误差 NsNc1s=1Nsc=1NcMSEs,c(P)+几何正则化项 λsΨspacing(P)+λeΨedge(P)(14)

其中各个符号的含义如下:

  • MSE s , c ( P ) \text{MSE}_{s,c}(\mathcal{P}) MSEs,c(P) 是在训练信噪比集合 SNR train = { 5 , 10 , 15 } \text{SNR}_{\text{train}} = \{5, 10, 15\} SNRtrain={5,10,15} dB 和信道长度集合 { 4 , 8 , 12 } \{4, 8, 12\} {4,8,12} 下,通过蒙特卡洛仿真获得的信道估计均方误差。
  • Ψ spacing ( P ) \Psi_{\text{spacing}}(\mathcal{P}) Ψspacing(P) 为间距惩罚函数(定义见下文式 16),衡量导频分布的均匀性。
  • Ψ edge ( P ) \Psi_{\text{edge}}(\mathcal{P}) Ψedge(P) 为边缘惩罚函数(定义见下文式 17),衡量导频对频谱两端的覆盖程度。
  • 正则系数 λ s = 0.04 \lambda_s = 0.04 λs=0.04 λ e = 0.05 \lambda_e = 0.05 λe=0.05,通过预实验确定,使正则项贡献约为 MSE 数量级的 5%~10%。

变体二:加权目标函数(用于 RW‑EPS 专用)

在基线基础上引入 SNR 加权和 BER 项,引导搜索同时优化估计精度与误码性能:

Φ weighted ( P ) = 1 N s N c ∑ s = 1 N s ∑ c = 1 N c [ ( 1 + SNR s max ⁡ SNR train ) ⋅ MSE s , c ( P ) + λ b ⋅ BER s , c ( P ) ] + λ s Ψ spacing ( P ) + λ e Ψ edge ( P ) (15) \begin{aligned} \Phi_{\text{weighted}}(\mathcal{P}) = \frac{1}{N_s N_c} \sum_{s=1}^{N_s} \sum_{c=1}^{N_c} \Bigg[ & \left(1 + \frac{\text{SNR}_s}{\max \text{SNR}_{\text{train}}}\right) \cdot \text{MSE}_{s,c}(\mathcal{P}) \\ & + \lambda_b \cdot \text{BER}_{s,c}(\mathcal{P}) \Bigg] \\ & + \lambda_s \Psi_{\text{spacing}}(\mathcal{P}) + \lambda_e \Psi_{\text{edge}}(\mathcal{P}) \end{aligned} \tag{15} Φweighted(P)=NsNc1s=1Nsc=1Nc[(1+maxSNRtrainSNRs)MSEs,c(P)+λbBERs,c(P)]+λsΨspacing(P)+λeΨedge(P)(15)

其中 λ b = 0.8 \lambda_b = 0.8 λb=0.8 为 BER 项的权重。SNR 加权因子 ( 1 + SNR s / max ⁡ SNR train ) (1 + \text{SNR}_s / \max \text{SNR}_{\text{train}}) (1+SNRs/maxSNRtrain) 使得在高 SNR 下 MSE 的权重更大,引导算法在“好信道”下也精益求精。

2.6.3 几何正则项的数学定义
  • 间距惩罚(衡量导频均匀性):

Ψ spacing ( P ) = std ( Δ p ) mean ( Δ p ) + ϵ , Δ p i = p i + 1 − p i , ϵ = 10 − 12 (16) \Psi_{\text{spacing}}(\mathcal{P}) = \frac{\text{std}(\Delta p)}{\text{mean}(\Delta p) + \epsilon}, \quad \Delta p_i = p_{i+1} - p_i, \quad \epsilon = 10^{-12} \tag{16} Ψspacing(P)=mean(Δp)+ϵstd(Δp),Δpi=pi+1pi,ϵ=1012(16)

均匀分布时 Ψ spacing ≈ 0 \Psi_{\text{spacing}} \approx 0 Ψspacing0,聚集分布时惩罚较大。

  • 边缘惩罚(衡量频谱两端覆盖程度):

Ψ edge ( P ) = p 0 N + N − 1 − p K − 1 N (17) \Psi_{\text{edge}}(\mathcal{P}) = \frac{p_0}{N} + \frac{N-1-p_{K-1}}{N} \tag{17} Ψedge(P)=Np0+NN1pK1(17)

导频越靠近两端,惩罚越小。


2.7 进化优化算法

目标函数 Φ ( P ) \Phi(\mathcal{P}) Φ(P) 定义在离散组合空间上,且评估代价高。本文采用三种群体智能算法进行搜索,它们均工作在连续空间,通过连续编码 + 排序映射策略解码为导频集合。

2.7.1 连续编码与解码策略

每个个体用一个 N N N 维连续向量 x = [ x 0 , x 1 , … , x N − 1 ] T ∈ [ 0 , 1 ] N \mathbf{x} = [x_0, x_1, \dots, x_{N-1}]^T \in [0,1]^N x=[x0,x1,,xN1]T[0,1]N 表示。解码时取 x \mathbf{x} x 中最大的 K K K 个分量对应的索引作为导频集合:

P = argsort ( x ) [ − K : ] (18) \mathcal{P} = \text{argsort}(\mathbf{x})[-K:] \tag{18} P=argsort(x)[K:](18)

该策略保证总能选出恰好 K K K 个不同导频。

2.7.2 遗传算法(GA)
  • 种群初始化:随机生成 M = 8 M=8 M=8 个连续向量。
  • 选择:精英保留(最优 2 个直接进入下一代)+ 锦标赛选择。
  • 交叉:从两个父代的导频集合中各取一半(按连续值排序),合并去重后补全至 K K K 个。
  • 变异:以概率 0.35 随机替换一个导频位置。
  • 迭代:共 8 代。
2.7.3 粒子群优化(PSO)

每个粒子记录自身最优位置 p b e s t i \mathbf{pbest}_i pbesti 和全局最优 g b e s t \mathbf{gbest} gbest。速度与位置更新公式为:

v i t + 1 = w t v i t + c 1 r 1 ( p b e s t i − x i t ) + c 2 r 2 ( g b e s t − x i t ) (19) \mathbf{v}_i^{t+1} = w^t \mathbf{v}_i^t + c_1 r_1 (\mathbf{pbest}_i - \mathbf{x}_i^t) + c_2 r_2 (\mathbf{gbest} - \mathbf{x}_i^t) \tag{19} vit+1=wtvit+c1r1(pbestixit)+c2r2(gbestxit)(19)

x i t + 1 = x i t + v i t + 1 (20) \mathbf{x}_i^{t+1} = \mathbf{x}_i^t + \mathbf{v}_i^{t+1} \tag{20} xit+1=xit+vit+1(20)

其中 c 1 = c 2 = 1.5 c_1 = c_2 = 1.5 c1=c2=1.5,惯性权重 w t = 0.8 − 0.4 ⋅ ( t / G ) w^t = 0.8 - 0.4 \cdot (t/G) wt=0.80.4(t/G) 从 0.8 线性递减至 0.4。位置裁剪至 [ 0 , 1 ] [0, 1] [0,1]

2.7.4 灰狼优化(GWO)

社会等级:适应度最优者为 α \alpha α,次优 β \beta β,第三 δ \delta δ。包围猎物的数学模型为:

D = ∣ C ⋅ X leader − X ∣ (21) \mathbf{D} = |\mathbf{C} \cdot \mathbf{X}_{\text{leader}} - \mathbf{X}| \tag{21} D=CXleaderX(21)

X new = X leader − A ⋅ D (22) \mathbf{X}_{\text{new}} = \mathbf{X}_{\text{leader}} - \mathbf{A} \cdot \mathbf{D} \tag{22} Xnew=XleaderAD(22)

其中 A = 2 a r 1 − a \mathbf{A} = 2a\mathbf{r}_1 - a A=2ar1a C = 2 r 2 \mathbf{C} = 2\mathbf{r}_2 C=2r2 a a a 从 2 线性递减到 0。每只狼根据 α , β , δ \alpha, \beta, \delta α,β,δ 三头狼的位置平均更新:

X t + 1 = X 1 + X 2 + X 3 3 (23) \mathbf{X}^{t+1} = \frac{\mathbf{X}_1 + \mathbf{X}_2 + \mathbf{X}_3}{3} \tag{23} Xt+1=3X1+X2+X3(23)

GWO 通过 ∣ A ∣ |\mathbf{A}| A 自动切换探索与开发,通常收敛较快。


2.8 评估与统计方法

2.8.1 公共随机数 (CRN)

为了公平比较不同导频图案的性能差异,评估阶段采用公共随机数技术:对于每个(选择种子、评估种子、SNR、信道长度)四元组,所有方法使用完全相同的随机种子生成信道和噪声。这使不同方法的 MSE 估计值正相关,从而减小配对比较的方差,提高统计灵敏度。

2.8.2 性能指标
  • 信道估计均方误差(MSE)

MSE = 1 N ∑ m = 0 N − 1 ∣ H ^ [ m ] − H [ m ] ∣ 2 (24) \text{MSE} = \frac{1}{N}\sum_{m=0}^{N-1} |\hat{H}[m] - H[m]|^2 \tag{24} MSE=N1m=0N1H^[m]H[m]2(24)

  • 误比特率(BER):错误比特数与总发送比特数之比。

每个条件进行 40 次独立试验(不同信道实现),计算均值及 95% 置信区间(正态近似)。

2.8.3 配对统计检验

针对每种方法与 Uniform 的 MSE 差异 d i = MSE Uniform , i − MSE Method , i d_i = \text{MSE}_{\text{Uniform}, i} - \text{MSE}_{\text{Method}, i} di=MSEUniform,iMSEMethod,i,计算均值 d ˉ \bar{d} dˉ 和标准误 SE d \text{SE}_d SEd。采用双尾正态近似检验原假设 d ˉ = 0 \bar{d}=0 dˉ=0

p = 2 ⋅ ( 1 − Φ ( ∣ d ˉ ∣ SE d ) ) (25) p = 2 \cdot \left(1 - \Phi\left(\frac{|\bar{d}|}{\text{SE}_d}\right)\right) \tag{25} p=2(1Φ(SEddˉ))(25)

p < 0.05 p < 0.05 p<0.05,则认为改进具有统计显著性。


至此,完整的理论基础已建立。下一章将基于此框架进行仿真实验,并对结果进行详细分析。

3. 仿真与结果分析

3.1 仿真参数配置

参数 取值
子载波数 N 64
导频数 K 8
调制方式 QPSK
信道多径数 L 4, 8, 12
SNR 范围 0, 5, 10, 15, 20, 25, 30 dB
训练 SNR 5, 10, 15 dB
训练蒙特卡洛次数 5
评估蒙特卡洛次数 40
种群大小 8
进化代数 8
正则参数(间距惩罚)λ_s 0.04
正则参数(边缘惩罚)λ_e 0.05
BER 权重 λ_b 0.8

3.2 导频图案可视化

在这里插入图片描述
图中横轴为 0~63 的子载波索引,纵轴为 7 种方法。每个“|”标记代表一个导频所在的位置。

可以看到

  • Uniform:导频严格等间隔分布在子载波 0, 9, 18, 27, 36, 45, 54, 63 处。但第 0 个和第 63 个子载波刚好位于频谱两端,覆盖良好。
  • EdgeUniform:强制在 0 和 63 放置导频,内部在 9, 18, 27, 36, 45, 54 附近均匀分布,与 Uniform 非常接近,但两端更确定。
  • Random:导频位置完全随机,出现明显的聚集现象和较大空缺,这将严重影响插值精度。
  • 进化算法:其他进化优化后的图案均趋于分散,避免了 Random 的聚集问题。

3.3 信道估计 MSE 性能分析

3.3.1 MSE 随 SNR 的变化

在这里插入图片描述

3.3.2 MSE 随信道长度的变化

在这里插入图片描述

在这里插入图片描述

3.5 与均匀导频的配对统计检验

方法 均值差异(Uniform − 该方法MSE) 标准误 p值 相对变化(%)
EdgeUniform -0.0669 0.00364 2.07×10⁻⁷⁵ -28.55
Random -0.1322 0.00646 3.46×10⁻⁹³ -56.44
GA -0.0154 0.00214 6.23×10⁻¹³ -6.57
PSO -0.0399 0.00247 1.87×10⁻⁵⁸ -17.02
GWO -0.0437 0.00279 2.33×10⁻⁵⁵ -18.66
RW-EPS -0.0360 0.00244 2.92×10⁻⁴⁹ -15.37

3.6 进化过程收敛性分析

在这里插入图片描述

综上所述,在理想无约束的广义平稳信道中,均匀导频凭借采样定理下的最小化最大插值误差特性,在 MSE 和 BER 上均取得不可超越的最优性能。以 GA 为代表的进化算法,在最好情况下仅以 6.57% 的差距成为最接近均匀导频的方案,验证了其在无约束环境下亦能逼近理论最优的能力。然而,考虑到现实世界中频谱碎片、多目标权衡和模型失配等均匀导频无法适用的约束场景,进化算法依然具备不可替代的实用价值——其意义不在于挑战均匀导频的理论最优性,而在于为复杂工程约束下的导频设计提供了系统化的通用求解框架。

部分代码:

#!/usr/bin/env python3
from __future__ import annotations
import json
import math
import time
from pathlib import Path
import numpy as np
import pandas as pd
from evo_pilot_ofdm.fitness import make_fitness
from evo_pilot_ofdm.pilots import uniform_pilots, edge_uniform_pilots, random_pilots
from evo_pilot_ofdm.optimizers import ga_select, pso_select, gwo_select
from evo_pilot_ofdm.simulator import evaluate_pattern

ROOT = Path(__file__).resolve().parents[1]
RESULTS = ROOT / "results"
FIGURES = ROOT / "figures"
TABLES = ROOT / "tables"
for d in (RESULTS, FIGURES, TABLES):
    d.mkdir(exist_ok=True)

METHOD_ORDER = ["Uniform", "EdgeUniform", "Random", "GA", "PSO", "GWO", "RW-EPS"]
SNR_VALUES = [0, 5, 10, 15, 20, 25, 30]
CHANNEL_LENS = [4, 8, 12]
SELECTION_SEEDS = list(range(3))
EVALUATION_SEEDS = list(range(3))
N_SUBCARRIERS = 64
N_PILOTS = 8
TRAIN_TRIALS = 5
EVAL_TRIALS = 40
POP_SIZE = 8
ITERATIONS = 8
LAMBDA_BER = 0.8
ALPHA_SPACING = 0.04
BETA_EDGE = 0.05


def select_patterns_for_seed(seed: int, n=N_SUBCARRIERS, k=N_PILOTS):
    rng = np.random.default_rng(seed)
    patterns = {
        "Uniform": uniform_pilots(n, k),
        "EdgeUniform": edge_uniform_pilots(n, k),
        "Random": random_pilots(n, k, rng),
    }
    histories = []
    selection_rows = []
    base_fit = make_fitness(
        n_subcarriers=n,
        n_trials=TRAIN_TRIALS,
        seed=10000 + seed,
        weighted=False,
        lambda_ber=LAMBDA_BER,
        alpha_spacing=ALPHA_SPACING,
        beta_edge=BETA_EDGE,
    )
    prop_fit = make_fitness(
        n_subcarriers=n,
        n_trials=TRAIN_TRIALS,
        seed=10000 + seed,
        weighted=True,
        lambda_ber=LAMBDA_BER,
        alpha_spacing=ALPHA_SPACING,
        beta_edge=BETA_EDGE,
    )
    algs = [
        ("GA", ga_select, base_fit, "MSE+geometry"),
        ("PSO", pso_select, base_fit, "MSE+geometry"),
        ("GWO", gwo_select, base_fit, "MSE+geometry"),
        ("RW-EPS", gwo_select, prop_fit, "weighted MSE+BER+geometry"),
    ]
    for name, fn, fit, objective in algs:
        t0 = time.perf_counter()
        p, h = fn(fit, n, k, pop_size=POP_SIZE, iters=ITERATIONS, seed=20000 + 131 * seed + len(name))
        runtime = time.perf_counter() - t0
        patterns[name] = p
        selection_rows.append({
            "selection_seed": seed,
            "method": name,
            "objective": objective,
            "selection_runtime_s": runtime,
            "pattern": " ".join(str(int(x)) for x in p),
        })
        denom = h[0] if abs(h[0]) > 1e-12 else 1.0
        for i, val in enumerate(h):
            histories.append({
                "selection_seed": seed,
                "method": name,
                "iteration": i,
                "fitness": float(val),
                "relative_fitness": float(val / denom),
                "selection_runtime_s": runtime,
            })
    return patterns, histories, selection_rows


def ci95(series: pd.Series) -> float:
    vals = series.dropna().to_numpy(dtype=float)
    if vals.size <= 1:
        return 0.0
    return float(1.96 * vals.std(ddof=1) / math.sqrt(vals.size))


def normal_p_from_mean_se(mean: float, se: float) -> float:
    if se <= 0:
        return 0.0 if abs(mean) > 0 else 1.0
    z = abs(mean / se)
    return float(math.erfc(z / math.sqrt(2.0)))


def main():
    all_patterns = {}
    history_rows = []
    selection_rows = []
    rows = []
    for sel_seed in SELECTION_SEEDS:
        patterns, hrows, srows = select_patterns_for_seed(sel_seed)
        all_patterns[str(sel_seed)] = {m: [int(x) for x in p] for m, p in patterns.items()}
        history_rows.extend(hrows)
        selection_rows.extend(srows)
        for snr in SNR_VALUES:
            for clen in CHANNEL_LENS:
                for eval_seed in EVALUATION_SEEDS:
                    shared_seed = 700000 + 10000 * sel_seed + 1000 * eval_seed + 17 * snr + clen
                    for method in METHOD_ORDER:
                        t0 = time.perf_counter()
                        out = evaluate_pattern(
                            patterns[method],
                            n_trials=EVAL_TRIALS,
                            n_subcarriers=N_SUBCARRIERS,
                            snr_db=snr,
                            channel_len=clen,
                            seed=shared_seed,
                        )
                        runtime = time.perf_counter() - t0
                        rows.append({
                            "selection_seed": sel_seed,
                            "evaluation_seed": eval_seed,
                            "method": method,
                            "snr_db": snr,
                            "channel_len": clen,
                            "ber": out["ber"],
                            "mse": out["mse"],
                            "eval_runtime_s": runtime,
                            "n_subcarriers": N_SUBCARRIERS,
                            "n_pilots": N_PILOTS,
                            "pilot_overhead": N_PILOTS / N_SUBCARRIERS,
                        })
    (RESULTS / "patterns_by_seed.json").write_text(json.dumps(all_patterns, indent=2))
    (RESULTS / "patterns.json").write_text(json.dumps(all_patterns["0"], indent=2))
    hist = pd.DataFrame(history_rows)
    hist.to_csv(RESULTS / "convergence.csv", index=False)
    sel = pd.DataFrame(selection_rows)
    sel.to_csv(RESULTS / "selection_runtime.csv", index=False)
    df = pd.DataFrame(rows)
    df.to_csv(RESULTS / "ofdm_results.csv", index=False)

    summ = df.groupby("method").agg(
        mean_ber=("ber", "mean"),
        ci95_ber=("ber", ci95),
        mean_mse=("mse", "mean"),
        ci95_mse=("mse", ci95),
        mean_eval_runtime_s=("eval_runtime_s", "mean"),
    ).reset_index()
    selection_time = sel.groupby("method").agg(mean_selection_time_s=("selection_runtime_s", "mean")).reset_index()
    summ = summ.merge(selection_time, on="method", how="left")
    summ["mean_selection_time_s"] = summ["mean_selection_time_s"].fillna(0.0)
    summ["method"] = pd.Categorical(summ["method"], categories=METHOD_ORDER, ordered=True)
    summ = summ.sort_values("mean_mse").reset_index(drop=True)
    summ.to_csv(TABLES / "summary.csv", index=False)

    ch = df.groupby(["method", "channel_len"]).agg(mean_mse=("mse", "mean"), ci95_mse=("mse", ci95), mean_ber=("ber", "mean")).reset_index()
    ch.to_csv(TABLES / "channel_breakdown.csv", index=False)

    # Paired normal-approximation tests on per-block MSE differences versus uniform.
    base = df[df.method == "Uniform"][["selection_seed", "evaluation_seed", "snr_db", "channel_len", "mse"]].rename(columns={"mse": "uniform_mse"})
    tests = []
    for method in METHOD_ORDER:
        if method == "Uniform":
            continue
        cur = df[df.method == method][["selection_seed", "evaluation_seed", "snr_db", "channel_len", "mse"]]
        merged = cur.merge(base, on=["selection_seed", "evaluation_seed", "snr_db", "channel_len"])
        diff = merged["uniform_mse"] - merged["mse"]
        mean_diff = float(diff.mean())
        se = float(diff.std(ddof=1) / math.sqrt(diff.size))
        tests.append({
            "method": method,
            "mean_uniform_minus_method_mse": mean_diff,
            "se": se,
            "normal_approx_p_two_sided": normal_p_from_mean_se(mean_diff, se),
            "relative_mse_change_vs_uniform_percent": 100.0 * mean_diff / float(base["uniform_mse"].mean()),
        })
    pd.DataFrame(tests).to_csv(TABLES / "paired_tests.csv", index=False)

    table = summ.copy()
    table["mean_ber"] = table.apply(lambda r: f'{r.mean_ber:.4f} $\\pm$ {r.ci95_ber:.4f}', axis=1)
    table["mean_mse"] = table.apply(lambda r: f'{r.mean_mse:.4e} $\\pm$ {r.ci95_mse:.1e}', axis=1)
    table["mean_selection_time_s"] = table["mean_selection_time_s"].map(lambda x: f"{x:.2f}")
    table = table[["method", "mean_ber", "mean_mse", "mean_selection_time_s"]]
    table.columns = ["Method", "BER", "MSE", "Selection time (s)"]
    (TABLES / "summary.tex").write_text(table.to_latex(index=False, escape=False, column_format="lccc"))
    print(summ)

if __name__ == "__main__":
    main()

4 总结

结果表明,在理想无约束的广义平稳信道中,均匀导频凭借奈奎斯特采样定理具有理论最优性;然而,在存在禁用子载波、非连续频谱等现实约束的场景下,进化算法能够有效搜索出性能优异的导频图案,为复杂工程约束下的导频设计提供了通用求解框架。

公众号有仿真代码,运行结果所见即所得
参考文献:
EvoPilotOFDM: Evolutionary Pilot Selection for Low-Overhead OFDM Channel Estimation

更多推荐