滚动轴承变转速故障数据集 本数据集包括6个故障轴承(轻微故障,中度故障,重度故障)和正常状态(NC)轴承的振动信号,共有7种不同的健康状态。 每个实验采集时间为 15 秒,由一个完整的加速/减速过程组成,从静止状态逐渐加速到 3000 rpm,然后保持稳定,最后逐渐减速到 0。

轴承振动信号分析最怕遇到什么情况?变转速绝对算得上头号杀手。传统的平稳信号分析方法碰上转速波动就跟老式收音机收不到信号一样,满屏雪花。今天咱们玩点刺激的——用真实工业场景的变转速轴承故障数据搞事情。

先说说这个数据集的妖孽之处:7种健康状态(正常+6种故障程度),每个样本都是15秒的加速-稳速-减速过程。这就好比让算法坐过山车,既要识别故障类型,还得应对转速变化带来的信号畸变。直接上代码看看数据长啥样:

import numpy as np
import matplotlib.pyplot as plt

def load_bearing_data(file_path):
    raw_data = np.loadtxt(file_path)
    time = raw_data[:, 0]  # 时间序列
    vibration = raw_data[:, 1]  # 振动信号
    rpm = raw_data[:, 2]  # 转速曲线
    return time, vibration, rpm

t, vib, rpm = load_bearing_data('NC_01.txt')
plt.figure(figsize=(12,6))
plt.plot(t, vib, label='Vibration')
plt.plot(t, rpm, label='RPM', color='red')
plt.legend()
plt.title('正常轴承振动信号与转速变化')
plt.show()

!振动信号与转速曲线示意图

这段代码抓取了正常轴承的振动信号和转速曲线。注意看红色转速线,从0飙到3000rpm再回落,振动信号像心电图一样跟着抽搐。这时候直接做FFT就像用菜刀切牛排——根本切不出纹理特征。

对付这种非平稳信号,老司机都知道要使用时频分析。上硬菜——短时傅里叶变换(STFT):

from scipy.signal import stft

freqs, times, Zxx = stft(vib, fs=25600, nperseg=1024)
plt.pcolormesh(times, freqs[:200], np.abs(Zxx[:200]), shading='gouraud')
plt.colorbar(label='Magnitude')
plt.title('STFT时频图')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()

!STFT时频图示例

这张热力图像极了抽象派油画,但藏着转速变化与故障特征的秘密。黄色区域对应着轴承故障特征频率随转速变化的轨迹,像不像宇宙飞船的飞行轨迹?这时候传统固定阈值检测就废了,得用动态追踪。

实战中我们可以用转速信号做文章。举个栗子,把时域信号转换成阶比谱:

def compute_order_spectrum(vibration, rpm, fs):
    # 转速估计与角度重采样
    theta = np.cumsum(rpm/60) * (1/fs) * 2*np.pi
    theta_uniform = np.linspace(0, theta[-1], len(theta))
    vib_resampled = np.interp(theta_uniform, theta, vibration)
    # 阶比分析
    order = np.fft.fft(vib_resampled)
    return order

order_spectrum = compute_order_spectrum(vib, rpm, 25600)
plt.plot(np.abs(order_spectrum[:500]))
plt.xlabel('Order')
plt.title('阶比谱分析')

!阶比谱示例

这个骚操作把转速变化的影响给熨平了,故障特征在阶比谱上原地立正。比如内圈故障通常在1倍转频阶比处出现峰值,外圈故障则可能在3.5倍阶比位置冒头。

最后上点硬核的——用深度学习暴力破解:

from tensorflow.keras.layers import Input, Conv1D, MaxPooling1D, Dense
from tensorflow.keras.models import Model

# 构建1D CNN模型
inputs = Input(shape=(15360, 1))
x = Conv1D(32, 64, activation='relu')(inputs)
x = MaxPooling1D(4)(x)
x = Conv1D(64, 16, activation='relu')(x)
x = MaxPooling1D(4)(x)
x = Dense(128, activation='relu')(x)
outputs = Dense(7, activation='softmax')(x)

model = Model(inputs, outputs)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
print(model.summary())

这个卷积网络专治各种不服,大尺寸卷积核(64个采样点)专门捕捉转速变化中的长时特征。不过要注意输入长度得对齐——15秒数据在25.6kHz采样率下正好是384000个点,做适当分段处理。

玩转这类数据的关键在于动态特征提取。下次遇到旋转机械故障诊断,别急着换数据集,试试这些方法,说不定就解锁新成就了。毕竟,在工业场景里,设备可不会按照教科书上的固定转速运行。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐