海底管道泄漏声波检测【附代码】
✅博主简介擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导毕业论文、期刊论文经验交流。✅ 如需沟通交流扫描文章底部二维码。1多传感器阵列波达方向估计与泄漏定位海底管道泄漏产生的声波信号通过管壁传播在管壁表面布置等间距的一维传感器阵列间距0.5m共8个。采用多重信号分类MUSIC算法估计声波到达相邻传感器的时延差从而计算泄漏源相对于阵列的方向角。为了提高在低信噪比下的鲁棒性先对每个传感器的信号进行小波阈值降噪然后取各通道信号的互功率谱相位变换GCC-PHAT作为MUSIC的输入。在模拟90m长管段的水下泄漏试验中该方法对单点泄漏的定位误差小于1.5m对两点同时泄漏的方位分辨率为2.5m。2基于一维卷积神经网络的泄漏声纹识别不同泄漏口径和压力会产生不同的声纹特征。构建一个1D-CNN分类网络来区分无泄漏、小孔泄漏、中孔泄漏、大孔泄漏四类。输入为声波信号的短时傅里叶变换的幅度谱时间32频率64共2048维。网络包含三个卷积块每块有卷积层、批归一化、最大池化和dropout最后接全局平均池化和softmax。在压力从2MPa到10MPa变化的数据集上该模型对泄漏类型识别的平均准确率为93.8%对无泄漏状态的判别准确率为99.2%。同时当将模型应用于另一条不同管径的管道时通过迁移学习微调后准确率仍保持在87%以上。3基于双重注意力机制的泄漏程度趋势预测泄漏一旦发生其程度可能逐渐增大。将泄漏发生后的连续声波频谱序列输入到带有时间注意力和通道注意力的双注意力网络DANet。时间注意力学习不同时间步的重要性通道注意力学习不同频带的重要性。网络输出预测未来10分钟的泄漏面积增长率%。在模拟泄漏扩大过程的试验中初始小孔逐渐扩大预测的增长率与实际值的相关系数达到0.89可为应急决策提供参考。当预测增长率超过5%/min时发出紧急报警。,import torchimport torch.nn as nnimport torch.nn.functional as Fimport numpy as npfrom scipy.signal import stft, istftdef gcc_phat(sig1, sig2, fs50000):f1 np.fft.rfft(sig1)f2 np.fft.rfft(sig2)cross f1 * np.conj(f2)cc np.fft.irfft(cross / (np.abs(cross) 1e-8))tau np.argmax(cc) / fsreturn taudef music_doa(array_signals, sensor_positions, n_sources1, fs50000, c1500):# array_signals: (num_sensors, N)R np.cov(array_signals) # 协方差矩阵eig_vals, eig_vecs np.linalg.eigh(R)idx np.argsort(eig_vals)[::-1]eig_vecs eig_vecs[:, idx]noise_subspace eig_vecs[:, n_sources:]# 扫描角度angles np.linspace(-90, 90, 181)steering_vectors []for theta in angles:delays np.dot(sensor_positions, np.sin(np.deg2rad(theta))) / csv np.exp(-1j * 2 * np.pi * fs * delays)steering_vectors.append(sv)steering_vectors np.array(steering_vectors).Tspectrum 1 / np.sum(np.abs(np.dot(noise_subspace.conj().T, steering_vectors))**2, axis0)doa_angle angles[np.argmax(spectrum)]return doa_angleclass LeakCNN(nn.Module):def __init__(self, num_classes4):super().__init__()self.conv1 nn.Sequential(nn.Conv2d(1, 32, kernel_size(3,3), padding1),nn.BatchNorm2d(32),nn.ReLU(),nn.MaxPool2d(2))self.conv2 nn.Sequential(nn.Conv2d(32, 64, (3,3), padding1),nn.BatchNorm2d(64),nn.ReLU(),nn.MaxPool2d(2))self.conv3 nn.Sequential(nn.Conv2d(64, 128, (3,3), padding1),nn.BatchNorm2d(128),nn.ReLU(),nn.AdaptiveAvgPool2d(1))self.fc nn.Linear(128, num_classes)def forward(self, x):# x: (B, 1, T, F)x self.conv1(x)x self.conv2(x)x self.conv3(x)x x.view(x.size(0), -1)return self.fc(x)class DualAttention(nn.Module):def __init__(self, channels64, time_steps20):super().__init__()self.time_attn nn.Sequential(nn.Linear(time_steps, time_steps),nn.Sigmoid())self.channel_attn nn.Sequential(nn.Linear(channels, channels),nn.Sigmoid())self.gru nn.GRU(channels, 32, batch_firstTrue)self.fc nn.Linear(32, 1)def forward(self, x):# x: (B, C, T) 通道×时间# 时间注意力time_weights self.time_attn(x.mean(dim1)) # (B, T)x_time x * time_weights.unsqueeze(1)# 通道注意力channel_weights self.channel_attn(x_time.mean(dim-1)) # (B, C)x_final x_time * channel_weights.unsqueeze(-1)x_final x_final.permute(0,2,1) # (B, T, C)out, _ self.gru(x_final)growth self.fc(out[:, -1, :])return growth如有问题可以直接沟通