第【38】期--基于进化算法的OFDM导频位置优化:从均匀导频到智能搜索 --python完整代码
文章目录
摘要
本文系统研究了在正交频分复用(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,…,pK−1} 为导频子载波索引集合, D \mathcal{D} D 为数据子载波索引集合,满足 P ∪ D = { 0 , 1 , … , N − 1 } \mathcal{P} \cup \mathcal{D} = \{0, 1, \dots, N-1\} P∪D={0,1,…,N−1} 且 P ∩ D = ∅ \mathcal{P} \cap \mathcal{D} = \varnothing P∩D=∅。
发送的频域信号 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,m∈Pm∈D(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=21((1−2b0)+j(1−2b1)),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,…,N−1(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=10−SNR/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=0∑L−1hl⋅δ(τ−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} hl∼CN(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,…,L−1(6)
其中 τ rms \tau_{\text{rms}} τrms 为均方根时延扩展,本文取 τ rms = L / 3 \tau_{\text{rms}} = L/3 τrms=L/3,使得最后一条路径功率约为第一条的 e − 3 ≈ 5 % e^{-3} \approx 5\% e−3≈5%。为保证总信道功率恒定为 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=0L−1σ~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=0∑L−1hl⋅e−j2πml/N,m=0,1,…,N−1(8)
2.3 导频辅助信道估计与插值
2.3.1 最小二乘(LS)估计
接收端在导频子载波 m ∈ P m \in \mathcal{P} m∈P 处,利用已知导频 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<⋯<pK−1,对应估计值为 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} pi≤m≤pi+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+1−piai+1−ai⋅(m−pi)(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+1−pibi+1−bi⋅(m−pi)(10b)
对于边缘区域( m < p 0 m < p_0 m<p0 或 m > p K − 1 m > p_{K-1} m>pK−1),采用最近邻外推。
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],m∈D,ϵ=10−12(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} Δf≤2Bc
当导频数量 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 节)的最优性结论成立,依赖于三个前提:
- 信道严格满足广义平稳(WSS),即统计特性不随频率变化。
- 导频位置无任何硬件或标准约束(如禁用子载波、DC 子载波、保护频带)。
- 唯一的性能指标是 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,…,N−1},∣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=1∑Nsc=1∑NcMSEs,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=1∑Nsc=1∑Nc[(1+maxSNRtrainSNRs)⋅MSEs,c(P)+λb⋅BERs,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+1−pi,ϵ=10−12(16)
均匀分布时 Ψ spacing ≈ 0 \Psi_{\text{spacing}} \approx 0 Ψspacing≈0,聚集分布时惩罚较大。
- 边缘惩罚(衡量频谱两端覆盖程度):
Ψ 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+NN−1−pK−1(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,…,xN−1]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(pbesti−xit)+c2r2(gbest−xit)(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.8−0.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=∣C⋅Xleader−X∣(21)
X new = X leader − A ⋅ D (22) \mathbf{X}_{\text{new}} = \mathbf{X}_{\text{leader}} - \mathbf{A} \cdot \mathbf{D} \tag{22} Xnew=Xleader−A⋅D(22)
其中 A = 2 a r 1 − a \mathbf{A} = 2a\mathbf{r}_1 - a A=2ar1−a, 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=0∑N−1∣H^[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,i−MSEMethod,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−Φ(SEd∣dˉ∣))(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
更多推荐

所有评论(0)