news 2026/5/8 3:34:04

基于可学习Morlet小波匹配滤波和统计特征融合的引力波信号检测算法(算法完善中,Python)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于可学习Morlet小波匹配滤波和统计特征融合的引力波信号检测算法(算法完善中,Python)

算法用于引力波信号检测任务,结合了传统匹配滤波的物理可解释性和深度学习的学习能力。首先,算法定义了可学习的Morlet小波基函数,这些小波的频率、尺度等参数在训练过程中可以优化调整,能够自适应地提取引力波信号的特征。然后,通过匹配滤波器组对左右探测器的时间序列数据进行卷积操作,提取信号的幅度和位置特征。为了提高特征的表征能力,算法采用了分桶最大池化策略,将卷积响应分成多个时间桶,并提取每个桶中的最大响应值及其相对位置,这样既保留了关键的时间信息,又减少了数据维度。接着,将这些从小波滤波器提取的特征与预计算的统计特征(如PSD漂移、信噪比等)进行拼接,形成一个综合的特征向量。最后,通过一个多层感知机分类器对这个综合特征向量进行处理,输出信号存在的概率。整个模型在训练过程中使用了二元交叉熵损失函数,并采用了学习率调度和早停策略来优化训练过程,确保模型能够有效地学习区分引力波信号和噪声。

算法步骤

数据准备阶段:加载左右探测器的引力波应变数据,同时加载预计算的统计特征,如距离数据孔的最近时间、PSD漂移值、归一化因子等,并将数据分为训练集和验证集。

模型初始化阶段:构建包含6个不同中心频率(15Hz、20Hz、30Hz、40Hz、50Hz、60Hz)的可学习Morlet小波库,每个小波的持续时间为0.75秒,初始尺度为0.05。

特征提取阶段:将左右探测器的数据分别与每个小波进行复数卷积运算,计算实部和虚部的响应,然后进行相位校正以获得更好的信号对齐效果。对左右探测器的校正后响应取最大值,以增强信号并抑制噪声。

特征降维阶段:将卷积响应按时间划分为大小为26的桶,对每个桶提取绝对值最大的响应值及其在桶内的位置索引,然后从所有桶中选取前3个最大的响应值及其归一化位置,形成每个小波的6维特征。

特征融合阶段:将所有6个小波提取的特征(共36维)与预计算的20维统计特征进行拼接,形成一个56维的综合特征向量。

分类决策阶段:将综合特征向量输入到一个两层全连接神经网络分类器中,第一层有64个神经元并使用ReLU激活函数,第二层输出一个标量值,经过Sigmoid函数转换为信号存在的概率。

训练优化阶段:使用二元交叉熵损失函数和Adam优化器进行训练,采用ReduceLROnPlateau学习率调度策略在验证损失停滞时降低学习率,并设置早停机制在连续多个epoch验证损失无改善时终止训练。

模型评估阶段:在验证集上计算模型的预测概率,分析信号和噪声的分布差异,使用贝叶斯校准方法对输出概率进行校准,并计算逆误报率(IFAR)等检测性能指标。

结果可视化阶段:绘制训练过程中的损失曲线,可视化学习到的小波形状,分析单个样本的时频图和小波响应,比较新旧IFAR值以评估算法改进效果。

import torch.nn as nn import torch.nn.functional as F import torch # 定义可学习的Morlet小波类 class LearnableMorlet(nn.Module): def __init__(self, duration=1.0, sample_rate=256, frequency=1.0, scale=0.2): super().__init__() self.duration = duration # 小波持续时间(秒) self.sample_rate = sample_rate # 采样率(Hz) self.freq = frequency # 小波中心频率(Hz) # 使用对数尺度作为可训练参数,防止收敛到零 self.log_scale = nn.Parameter(torch.tensor(torch.log(torch.tensor(scale)), dtype=torch.float32)) @property def scale(self): """返回实际尺度值(log_scale的指数)""" return torch.exp(self.log_scale) def forward(self, return_t=False): # 获取参数设备信息 dev = self.log_scale.device dt = 1.0 / self.sample_rate # 生成时间序列 t = torch.arange( -self.duration / 2, self.duration / 2, step=dt, device=dev, dtype=torch.float32, ) # 获取实际尺度值 actual_scale = self.scale # 高斯包络函数 gauss = torch.exp(-0.5 * (t / actual_scale) ** 2) # 正弦振荡函数 sinusoid = torch.exp(1j * 2 * torch.pi * self.freq * t) # 组合成复数小波 wavelet = gauss * sinusoid # 归一化处理 norm = wavelet.norm(p=2) if norm > 0: wavelet = wavelet / norm return wavelet if not return_t else (wavelet, t) # 定义匹配滤波器组 class MatchedFilterBank(nn.Module): def __init__(self, wavelet_properties): super().__init__() # 创建多个可学习Morlet小波 self.wavelets = nn.ModuleList([ LearnableMorlet( duration=wp["duration"], sample_rate=wp.get("sample_rate", 256), frequency=wp["frequency"], scale=wp["scale"], ) for wp in wavelet_properties ]) # 每个小波提取6个特征(3个最大值+3个位置索引) self.features_per_wavelet = 6 def forward(self, x_left, x_right): B = x_left.size(0) # 批大小 device = x_left.device all_feats = [] # 存储所有特征 # 对每个小波进行处理 for idx, wavelet in enumerate(self.wavelets): # 生成复数核函数 kernel = wavelet() # 形状(L,) real_k = kernel.real.view(1, 1, -1).to(device) # 实部核 imag_k = kernel.imag.view(1, 1, -1).to(device) # 虚部核 # 处理左右探测器通道 combined_responses = [] for x_channel in [x_left, x_right]: # 卷积运算 real_out = F.conv1d(x_channel, real_k, padding=0) # 实部卷积 imag_out = F.conv1d(x_channel, imag_k, padding=0) # 虚部卷积 # 相位校正 phases = torch.atan2(imag_out, real_out) # 计算相位 real_r = real_out * torch.cos(phases) + imag_out * torch.sin(phases) # 校正后的实部 combined_responses.append(real_r) # 对左右探测器响应取最大值 combined_response = torch.max(combined_responses[0], combined_responses[1]) # 分桶处理:将信号分成多个桶,提取每个桶的最大值 bucket_size = 26 # 桶大小 L_out = combined_response.size(2) num_buckets = L_out // bucket_size # 重塑为桶的形状 rb = combined_response[..., : num_buckets * bucket_size].reshape( B, 1, num_buckets, bucket_size ) # 计算每个桶的最大值和位置 bucket_max, bucket_idx = rb.abs().max(dim=3) # 提取前3个最大值及其位置 top_vals, top_idxs = torch.topk(bucket_max, k=3, dim=2) # 扁平化处理 vals_flat = top_vals.view(B, -1) idxs_norm = top_idxs.view(B, -1).float() / num_buckets # 归一化位置 # 拼接值特征和位置特征 wavelet_feat = torch.cat([vals_flat, idxs_norm], dim=1) # 形状(B,6) all_feats.append(wavelet_feat) # 拼接所有小波特征 return torch.cat(all_feats, dim=1) # 定义完整模型 class FullModel(nn.Module): def __init__(self, wavelet_props, stats_dim=20): super().__init__() self.filterbank = MatchedFilterBank(wavelet_props) # 匹配滤波器组 fb_dim = len(wavelet_props) * self.filterbank.features_per_wavelet # 滤波器特征维度 # 分类器:MLP网络 self.classifier = nn.Sequential( nn.Linear(fb_dim + stats_dim, 64), # 输入层:特征+统计信息 nn.ReLU(), # 激活函数 nn.Linear(64, 1), # 输出层:二分类 ) def forward(self, x_left, x_right, stats): # 提取小波特征 f = self.filterbank(x_left, x_right) # 拼接小波特征和统计特征 x = torch.cat([f, stats], dim=1) # 通过分类器 return self.classifier(x)

担任《Mechanical System and Signal Processing》《中国电机工程学报》《宇航学报》《控制与决策》等期刊审稿专家,擅长领域:信号滤波/降噪,机器学习/深度学习,时间序列预分析/预测,设备故障诊断/缺陷检测/异常检测

参考文章:

基于可学习Morlet小波匹配滤波和统计特征融合的引力波信号检测算法(算法完善中,Python) - 哥廷根数学学派的文章
https://zhuanlan.zhihu.com/p/1998354219955160550

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 17:18:23

基于多阶段参数辨识与蒙特卡洛不确定性传播的质子交换膜水电解槽电压退化预测和预后地平线评估集成算法(Python)

代码实现了一个完整的质子交换膜水电解槽(PEMWE)剩余使用寿命(RUL)预测与性能评估系统。整个流程从加载合成的PEMWE数据集开始,首先基于底层的物理退化模型计算真实的理论失效时间(EOL)。系统通…

作者头像 李华
网站建设 2026/5/8 0:01:44

C++课后习题训练记录Day79

1.练习项目: 问题描述 Bob 和 Alice 最近在学习博弈论,为了学以致用,他们找来了一大堆的小饼干,并通过博弈的方式来吃掉这些小饼干。他们将找来的小饼干分成 𝑛 堆,每堆小饼干有 𝑎&#x1d4…

作者头像 李华
网站建设 2026/5/4 23:41:20

工程化思维破解协同与锁死难题:Java企业的AI集成新思路

在AI技术深度渗透企业业务的今天,Java技术团队普遍面临一个核心难题:不同大模型各有专精——有的擅长数据分析,有的精通代码生成,有的适配多模态交互,但如何让这些“专精选手”协同作战,同时避免被单一厂商…

作者头像 李华
网站建设 2026/5/1 8:19:56

Vue2 的数据响应式原理给实例新增响应式属性

Vue2 响应式原理的案例 <template><div id"app"><div>用户名&#xff1a;{{ user.name }}</div><div>年龄&#xff1a;{{ user.age }}</div> <button click"addAgeDirectly">直接添加年龄&#xff08;无响应式&…

作者头像 李华
网站建设 2026/5/2 2:59:33

轰炸敌人,最多可以摧毁的敌人城堡数目

我的解法&#xff1a; 对于每一个空位置&#xff0c;进行一次bfs&#xff0c;从上下左右四个方向去寻找&#xff0c;这是岛屿问题的相似处理&#xff0c;但是这个题可以优化&#xff0c;因为横竖方向可以进行动规优化。 我们不需要对每个 0 都重新数一遍它所在的行和列有多少敌…

作者头像 李华