用Python复现AWGN信道下的隐蔽通信仿真:从KL散度到能量检测的完整流程

张开发
2026/4/13 18:20:05 15 分钟阅读

分享文章

用Python复现AWGN信道下的隐蔽通信仿真:从KL散度到能量检测的完整流程
用Python复现AWGN信道下的隐蔽通信仿真从KL散度到能量检测的完整流程隐蔽通信技术正逐渐成为信息安全领域的热点研究方向。想象一下你正在开发一个需要隐藏通信行为的系统——可能是保护敏感商业数据也可能是确保隐私对话不被第三方察觉。传统加密技术虽然能保护通信内容但无法隐藏通信行为本身。而隐蔽通信Covert Communication的核心目标就是让监听者Willie甚至无法确定通信是否正在发生。本文将带你用Python完整实现AWGN加性高斯白噪声信道下的隐蔽通信仿真。不同于单纯的理论讲解我们会聚焦如何将论文中的数学公式转化为可运行的代码并通过可视化手段直观展示隐蔽通信的关键特性。你会学到如何用NumPy和SciPy实现KL散度约束下的功率控制能量检测器的虚警概率与漏检概率的Python计算方法有限块长度对吞吐量影响的量化分析与可视化最优码长与发射功率的联合优化方法1. 环境配置与基础模型搭建在开始之前确保你的Python环境已安装以下库import numpy as np import matplotlib.pyplot as plt from scipy.stats import chi2, norm from scipy.special import gammainc, gammaln, erfinv from scipy.optimize import fsolve1.1 AWGN信道建模首先构建AWGN信道模型。Alice向Bob发送信号时Willie也在监听同一信道。三方接收信号可表示为def awgn_channel(x, snr_db, receiverbob): AWGN信道模拟 :param x: 发送信号 :param snr_db: 信噪比(dB) :param receiver: bob或willie :return: 接收信号 snr 10 ** (snr_db / 10) if receiver bob: noise_var 1 / snr # 假设Bob端噪声方差为1 else: noise_var 1 / snr # Willie端噪声方差可不同 noise np.sqrt(noise_var/2) * (np.random.randn(*x.shape) 1j*np.random.randn(*x.shape)) return x noise1.2 隐蔽通信系统参数初始化隐蔽通信系统的关键参数包括class CovertCommSystem: def __init__(self): self.N 1000 # 最大块长度 self.epsilon 0.1 # 隐蔽性参数 self.sigma_w 1 # Willie端噪声方差 self.sigma_b 1 # Bob端噪声方差 self.delta 0.01 # 解码错误概率2. KL散度约束与功率控制隐蔽通信的核心约束是KL散度必须满足D(P0||P1) ≤ 2ε²。我们需要先实现KL散度的计算2.1 KL散度计算根据论文公式(10)KL散度可表示为def kl_divergence(P, sigma_w, n): 计算KL散度 :param P: 发射功率 :param sigma_w: Willie端噪声方差 :param n: 码字长度 :return: KL散度值 ratio (P sigma_w**2) / sigma_w**2 return n * (np.log(ratio) - P / (P sigma_w**2))2.2 最优功率计算最优发射功率P*需要解方程(11)def optimal_power_equation(P, sigma_w, epsilon, N): return P - (P sigma_w**2) * (np.log(1 P/sigma_w**2) - 2*epsilon**2/N) def find_optimal_power(sigma_w, epsilon, N, P_initial_guess0.1): 求解最优发射功率 sol fsolve(optimal_power_equation, P_initial_guess, args(sigma_w, epsilon, N)) return sol[0]3. 能量检测器实现与性能分析Willie使用能量检测来判断通信是否发生。我们需要实现虚警概率(PFA)和漏检概率(PMD)的计算。3.1 能量检测阈值确定能量检测的关键是确定合适的阈值Γdef energy_detector_threshold(P, sigma_w, n, alpha0.05): 计算能量检测阈值Γ使得PFAα :param alpha: 虚警概率目标值 :return: 检测阈值 # 卡方分布逆CDF scale sigma_w**2 / n return chi2.ppf(1-alpha, df2*n) * scale3.2 虚警与漏检概率计算根据论文公式(5)和(6)def false_alarm_probability(Gamma, sigma_w, n): 计算虚警概率PFA return 1 - gammainc(n, n*Gamma/sigma_w**2) def miss_detection_probability(Gamma, P, sigma_w, n): 计算漏检概率PMD return gammainc(n, n*Gamma/(P sigma_w**2))4. 有限块长度下的吞吐量优化4.1 有限码长速率计算根据论文公式(2)有限码长下的速率近似为def finite_blocklength_rate(P, sigma_b, n, delta): 计算有限块长度下的传输速率 gamma_b P / sigma_b**2 term1 np.log2(1 gamma_b) term2_num gamma_b * (gamma_b 2) term2_den n * (gamma_b 1)**2 term2 np.sqrt(term2_num / term2_den) * norm.ppf(1-delta) / np.log(2) term3 np.log2(n) / (2 * n) return term1 - term2 term34.2 吞吐量最大化有效吞吐量η nR(1-δ)def effective_throughput(P, sigma_b, n, delta): rate finite_blocklength_rate(P, sigma_b, n, delta) return n * rate * (1 - delta)5. 结果可视化与分析5.1 最优功率与块长度关系def plot_optimal_power_vs_blocklength(): N_values np.linspace(100, 2000, 20) P_opt [find_optimal_power(1, 0.1, N) for N in N_values] plt.figure(figsize(10, 6)) plt.plot(N_values, P_opt, b-o) plt.xlabel(Block Length (N)) plt.ylabel(Optimal Power (P*)) plt.title(Optimal Power vs. Block Length) plt.grid(True) plt.show()5.2 吞吐量与块长度关系def plot_throughput_vs_blocklength(): N_values np.linspace(100, 2000, 20) throughput [] for N in N_values: P_opt find_optimal_power(1, 0.1, N) eta effective_throughput(P_opt, 1, N, 0.01) throughput.append(eta) plt.figure(figsize(10, 6)) plt.plot(N_values, throughput, r-s) plt.xlabel(Block Length (N)) plt.ylabel(Effective Throughput (η)) plt.title(Throughput vs. Block Length) plt.grid(True) plt.show()5.3 能量检测性能曲线def plot_energy_detection_performance(): P find_optimal_power(1, 0.1, 1000) n 1000 Gamma_values np.linspace(0.8, 1.2, 100) PFA [false_alarm_probability(G, 1, n) for G in Gamma_values] PMD [miss_detection_probability(G, P, 1, n) for G in Gamma_values] plt.figure(figsize(10, 6)) plt.plot(Gamma_values, PFA, b-, labelFalse Alarm Probability) plt.plot(Gamma_values, PMD, r--, labelMiss Detection Probability) plt.xlabel(Detection Threshold (Γ)) plt.ylabel(Probability) plt.title(Energy Detection Performance) plt.legend() plt.grid(True) plt.show()6. 完整仿真流程示例下面展示如何将这些组件组合成一个完整的隐蔽通信仿真def full_covert_communication_simulation(): # 初始化系统参数 system CovertCommSystem() # 计算最优功率 P_opt find_optimal_power(system.sigma_w, system.epsilon, system.N) print(fOptimal Power: {P_opt:.4f}) # 计算KL散度 D kl_divergence(P_opt, system.sigma_w, system.N) print(fKL Divergence: {D:.6f} (Constraint: {2*system.epsilon**2})) # 能量检测性能分析 Gamma energy_detector_threshold(P_opt, system.sigma_w, system.N) PFA false_alarm_probability(Gamma, system.sigma_w, system.N) PMD miss_detection_probability(Gamma, P_opt, system.sigma_w, system.N) print(fEnergy Detection - PFA: {PFA:.4f}, PMD: {PMD:.4f}, Total Error: {PFAPMD:.4f}) # 计算吞吐量 eta effective_throughput(P_opt, system.sigma_b, system.N, system.delta) print(fEffective Throughput: {eta:.4f}) # 可视化 plot_optimal_power_vs_blocklength() plot_throughput_vs_blocklength() plot_energy_detection_performance()通过这个完整实现我们不仅验证了论文中的关键结论——当码字长度nN时吞吐量达到最大还能直观地看到隐蔽通信系统各参数之间的复杂关系。例如从能量检测性能曲线可以清楚地看到存在一个最优检测阈值使得Willie的总错误概率最大这正是隐蔽通信所追求的效果。在实际项目中这种仿真框架可以帮助工程师快速评估不同参数配置下的系统性能为实际系统设计提供数据支持。比如你可以修改噪声方差参数来模拟不同信道质量下的性能变化或者调整隐蔽性参数ε来研究隐蔽程度与通信效率之间的权衡关系。

更多文章