✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)双门限信道质量评估与二阶四阶矩信噪比估计:
为了实时评估各跳频频点的信道质量,采用基于接收信号包络的二阶四阶矩估计算法计算每个频点的信噪比。该算法不需要已知信号调制类型,且计算量小,适合硬件实现。接收机对每个频点进行突发检测,若检测到信号则进行信噪比估计,否则标记为空闲。估计器对处理增益后的基带信号进行二阶矩和四阶矩统计,利用公式推导出信噪比。在FPGA中设计了滑动窗口统计模块,窗口长度128个符号。为了提高低信噪比下的估计精度,引入双门限质量控制:当估计信噪比低于-5dB时,启动卡尔曼平滑器对连续估计值进行滤波,滤波后低信噪比下估计误差由原本的2.5dB降至1.1dB。在硬件平台上测试,估计延迟为1.8毫秒,能够适应跳频速率500跳/秒的需求。将估计结果与误码率映射形成频点质量等级,划分为优、良、差三级,作为概率分配的基础。
(2)改进汤普森采样的概率频点分配:
基于频点质量的概率映射不再采用固定门限概率表,而是引入多臂赌博机框架,将每个频点看作一个臂,奖励为成功传输且误码率低的次数。采用汤普森采样算法动态更新每个频点的选择概率。具体地,每个频点维护一个贝塔分布的先验参数,成功传输时伪计数加1,失败或高误码时失败计数加1。每次需要选择跳频点时,从每个频点的贝塔分布中采样,选择样本值最大的频点发射。为了应对恶意干扰,加入频点惩罚机制:若连续多次选择同一频点后误码率骤升,则判定该频点被干扰,将其失败计数器暂时增加一个较大惩罚值,让其概率迅速下降,从而实现快速躲避干扰。在MATLAB仿真中,模拟了梳状干扰和动态干扰场景,该概率分配方法使系统误码率降至1.8×10的负5次方,频谱利用率达到63.2%,相比传统自适应跳频的误码率降低一个数量级,隐蔽性也因频点使用更加均匀而增强。处理增益约17.5dB。
(3)FPGA模块实现与Vivado仿真验证:
该概率频点分配模块在Xilinx Artix-7 FPGA上实现,主要包含信噪比估计子模块、质量等级编码器、贝塔分布随机数生成器和选频控制器。贝塔分布随机数生成器采用Box-Muller变换结合查找表实现,资源消耗低。Vivado逻辑仿真中,输入模拟中频信号,模块输出跳频图案控制字,对比MATLAB生成的理想图案,时序完全一致。资源占用报告显示LUT使用3251个,触发器使用4872个,块RAM使用6个。实时性指标为每跳决策时间0.6微秒,满足跳频周期2毫秒的要求。通过板上测试,跳频系统在存在20%频点被阻塞的情况下,通信保持连续,验证了模块的有效性。
import numpy as np import random from scipy.stats import beta # 二阶四阶矩信噪比估计 def snr_m2m4_estimate(signal): # signal: 复数基带信号 M2 = np.mean(np.abs(signal)**2) M4 = np.mean(np.abs(signal)**4) # 避免数值问题 if M4 - 2*M2**2 <= 0: return -10 # 无信号或极低 snr_linear = (np.sqrt(2*M2**2 - M4)) / (M2 - np.sqrt(2*M2**2 - M4)) return 10*np.log10(snr_linear + 1e-6) # 卡尔曼平滑信噪比滤波 class KalmanSNRSmoother: def __init__(self, Q=1.0, R=2.0): self.x = 10.0; self.P = 1.0; self.Q = Q; self.R = R def update(self, z): self.P = self.P + self.Q K = self.P / (self.P + self.R) self.x = self.x + K * (z - self.x) self.P = (1 - K) * self.P return self.x # 汤普森采样频点分配 class ThompsonSamplingFreqAlloc: def __init__(self, n_freqs=64): self.n = n_freqs self.success = np.ones(n_freqs) self.failure = np.ones(n_freqs) def select_freq(self): samples = [np.random.beta(self.success[i], self.failure[i]) for i in range(self.n)] return np.argmax(samples) def update(self, freq_idx, success_flag, interference_penalty=False): if success_flag: self.success[freq_idx] += 1 else: if interference_penalty: self.failure[freq_idx] += 5 else: self.failure[freq_idx] += 1 # 防止参数过大导致分布退化 self.success = np.clip(self.success, 1, 1000) self.failure = np.clip(self.failure, 1, 1000) # 模拟跳频 freq_alloc = ThompsonSamplingFreqAlloc() smoother = KalmanSNRSmoother() for hop in range(200): chosen = freq_alloc.select_freq() # 模拟接收信号并估计信噪比 sig = np.exp(1j*np.random.rand(128)) * (0.1+0.1*random.random()) snr_est = snr_m2m4_estimate(sig) smoothed = smoother.update(snr_est) success = smoothed > 5 # 阈值 freq_alloc.update(chosen, success, interference_penalty=(smoothed<-2)) print('频点选择:', chosen, '信噪比平滑:', round(smoothed,2))