云计算百科
云计算领域专业知识百科平台

基于可学习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

赞(0)
未经允许不得转载:网硕互联帮助中心 » 基于可学习Morlet小波匹配滤波和统计特征融合的引力波信号检测算法(算法完善中,Python)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!