✅博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)静电传感器有限元仿真与最优安装位置确定:为了实现对滚动轴承非接触式静电监测,首先对静电传感器进行设计并通过COMSOL软件进行有限元仿真分析。选择圆环式静电探头,建立包含轴承座、滚动体和传感器的三维静电模型,施加不同转速下的摩擦荷电边界条件。仿真计算传感器的轴向灵敏度(沿轴承轴向移动时的输出变化)和径向灵敏度(沿径向距离变化的输出变化)。结果表明,在轴承外圈附近且靠近滚动体载荷区的轴向位置具有最高的灵敏度和最小的方向依赖性。根据仿真结果,在轴承故障诊断实验台的合适位置加工安装孔,并实际布置静电传感器。同时搭建了包含振动加速度计、光电转速计和数据采集卡的数据采集系统,加工了内圈、外圈、滚动体三种故障类型的轴承。通过同步采集静电信号和振动信号,为后续分析提供了真实有效的实验数据。
(2)谱插值与小波阈值联合去噪方法抑制工频和背景噪声:静电信号中常混有50Hz工频干扰及随机背景噪声,这会严重干扰故障特征提取。为此,提出一种联合去噪方法。首先,对原始静电信号进行快速傅里叶变换,在频谱上识别出工频及其谐波频率成分,采用谱插值法:将工频点的幅值用其两侧相邻频点幅值的线性插值替代,从而滤除窄带干扰。然后,针对宽带的背景噪声和随机脉冲,采用基于控制图的小波阈值收缩算法。对信号进行多尺度小波分解,得到近似系数和细节系数。在每个细节系数尺度上,计算系数绝对值的均值和控制限(如均值加三倍标准差),将超过控制限的系数视为随机脉冲并予以保留(因为它们可能包含故障冲击),而低于控制限的系数进行软阈值收缩。仿真和实际信号处理表明,联合方法能够在保留故障冲击成分的同时,显著提高信噪比,为后续时频分析提供了干净的信号。
(3)时频谱能量差分与小波图像分解注意力卷积网络:针对静电信号非平稳、故障特征随时间变化的特点,提出一种基于时频谱能量差分和注意力卷积网络的故障诊断方法。首先采用短时傅里叶变换将去噪后的静电信号转换为二维时频谱矩阵,然后计算每个时间点相邻频率区间的能量差分,得到能量变化率矩阵,这可以突出故障出现时引起的瞬态能量波动。接着,对能量差分矩阵进行二维离散小波变换,分解为逼近子带、水平细节子带和垂直细节子带,从而从不同空间频率和方向描述故障模式。将这三个子带分别输入到嵌入通道注意力和空间注意力机制的卷积神经网络中,注意力模块自适应地加权重要特征图,最后融合三个分支的特征进行分类。在自建静电信号数据集上进行对比试验,单用CNN准确率为86.5%,加入时频谱能量差分后提升至89.5%,再加入小波分解和注意力模块后达到92.1%,验证了方法对微弱故障特征的有效提取能力。基于该算法,利用上位机开发平台(LabVIEW)构建了故障诊断界面,实现了数据采集、滤波、时频分析和诊断结果的一体化流程。
import numpy as np import pywt from scipy.signal import spectrogram, stft import torch import torch.nn as nn # 谱插值滤除工频 def spectral_interpolation(signal, fs, target_freq=50, width=2): fft_vals = np.fft.fft(signal) freqs = np.fft.fftfreq(len(signal), 1/fs) idx = np.argmin(np.abs(freqs - target_freq)) for i in range(-width, width+1): if i != 0: fft_vals[idx] = np.mean(fft_vals[idx-1:idx+1]) # 简单插值 return np.fft.ifft(fft_vals).real # 基于控制图的小波阈值去噪 def wavelet_thresholding_control_chart(signal, wavelet='db4', level=5, sigma=3): coeffs = pywt.wavedec(signal, wavelet, level=level) new_coeffs = [coeffs[0]] # 近似系数保留 for detail in coeffs[1:]: median = np.median(detail) mad = np.median(np.abs(detail - median)) / 0.6745 threshold = sigma * mad # 控制图:超过阈值则认为是信号成分,否则收缩 # 软阈值处理 new_detail = np.sign(detail) * np.maximum(np.abs(detail) - threshold, 0) new_coeffs.append(new_detail) return pywt.waverec(new_coeffs, wavelet) # 时频谱能量差分 + 小波分解 + 注意力CNN class AttentionCNN(nn.Module): def __init__(self, num_classes=3): super().__init__() self.conv = nn.Sequential( nn.Conv2d(3, 16, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2), # 输入3通道(逼近+水平+垂直) nn.Conv2d(16, 32, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2) ) self.ca = nn.Sequential(nn.AdaptiveAvgPool2d(1), nn.Flatten(), nn.Linear(32, 32), nn.Sigmoid()) self.sa = nn.Conv2d(32, 1, 1) self.fc = nn.Linear(32 * 7 * 7, num_classes) def forward(self, x): feat = self.conv(x) # 通道注意力 ca_weights = self.ca(feat).view(-1, 32, 1, 1) feat = feat * ca_weights # 空间注意力 sa_map = torch.sigmoid(self.sa(feat)) feat = feat * sa_map feat = feat.view(feat.size(0), -1) return self.fc(feat) # 时频能量差分特征提取 def tf_energy_diff(signal, fs, nperseg=128, noverlap=64): f, t, Sxx = spectrogram(signal, fs, nperseg=nperseg, noverlap=noverlap) Sxx = np.abs(Sxx) # 能量谱 # 沿时间方向计算差分 diff = np.diff(Sxx, axis=1) # 频率轴不变,时间轴相邻帧差分 return diff # DWT分解得到三个子带 def get_dwt_subbands(img, wavelet='db1'): # img 为二维能量矩阵 LL, (LH, HL, HH) = pywt.dwt2(img, wavelet) return LL, LH, HL, HH # 选择LL, LH, HL作为三通道输入如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇