☰
齿轮箱故障数据.zip:振动信号数据集诊断流程实战指南
2026/10/20 2:40:43 网站建设 项目流程

简介:这份齿轮箱故障数据集面向从事机械故障诊断、信号处理与机器学习的研究人员及工程技术人员,用于开展齿轮箱早期故障检测与预测性维护研究。压缩包共15个文件,约5.91MB,包含mat振动信号数据、csv转速与啮合频率记录、py数据处理与振动分析脚本、png时域波形及频谱图、pdf实验数据集说明文档和txt数据解读说明,覆盖无故障、断齿、三齿磨损等多种工况。数据采集自10kHz采样条件下的全负载运行状态,涉及振动、声音、温度、扭矩与转速等关键参数,可用于傅里叶变换、小波分析、特征工程及ARIMA、LSTM等时间序列建模。目前已有844人学习下载,适合希望快速获取真实工况数据、搭建故障分类与预测模型并验证算法效果的读者参考使用。

1. 齿轮箱故障数据.zip:一份能直接跑通诊断流程的振动信号数据集

如果你正在做旋转机械故障诊断,大概率绕不开齿轮箱这个经典对象。它工况复杂、故障类型多、信号非平稳,既是论文里的常客,也是工业现场最头疼的部件之一。但真正动手时,第一个卡住你的往往不是算法,而是数据——公开数据要么采样率对不上,要么标签混乱,要么干脆只有正常样本。这份「齿轮箱故障数据.zip」解决的正是这个前置问题:它把齿轮箱在多种健康状态下的振动信号整理成结构化文件,让你能把时间花在特征提取和模型调参上,而不是花在找数据、洗数据上。适合刚入门故障诊断的学生、需要快速验证算法的工程师,以及想拿真实振动信号练手的人。

2. 拆开压缩包:文件结构、采样参数与标签逻辑

拿到一个数据集,我习惯先不急着写模型,而是把目录结构和参数摸清楚。这一步做扎实,后面能省掉大量返工。

2.1 目录组织与文件命名规律

解压后通常能看到按故障类型分层的文件夹,命名上会体现状态类别和工况编号。常见做法是类似这样的结构:

gear_fault_dataset/ ├── healthy/ │ ├── healthy_01.csv │ ├── healthy_02.csv │ └── ... ├── tooth_root_crack/ │ ├── crack_01.csv │ └── ... ├── tooth_surface_wear/ │ └── ... ├── missing_tooth/ │ └── ... └── README.txt

每个 CSV 文件一般是一列或两列:第一列是时间戳或采样点序号,第二列是振动加速度幅值。有些版本会额外带一列转速或负载标记。文件名里的数字通常代表不同试验批次或工况,不是简单的重复采样,这一点在划分训练集和测试集时要注意——同一批次的数据不能同时出现在训练和测试里,否则准确率会虚高,这是血泪经验。

先跑一段脚本把整体情况摸一遍:

import os import pandas as pd import numpy as np root = "gear_fault_dataset" summary = [] for label in os.listdir(root): label_path = os.path.join(root, label) if not os.path.isdir(label_path): continue for fname in os.listdir(label_path): if not fname.endswith(".csv"): continue fpath = os.path.join(label_path, fname) df = pd.read_csv(fpath) # 假设第二列是振动信号 signal = df.iloc[:, 1].values summary.append({ "label": label, "file": fname, "samples": len(signal), "mean": np.mean(signal), "std": np.std(signal), "peak": np.max(np.abs(signal)) }) summary_df = pd.DataFrame(summary) print(summary_df.groupby("label").agg({ "samples": "mean", "std": "mean", "peak": "mean" }))

这段代码做三件事:遍历所有类别文件夹、读取每个 CSV 的第二列作为振动信号、统计样本数、标准差和峰值。标准差反映信号能量,峰值反映冲击成分。齿轮箱的局部故障(比如断齿、裂纹)往往表现为周期性冲击,峰值会明显偏高;而磨损类故障更多体现在能量分布变化上。先看这几个统计量,能帮你判断数据是否正常、有没有明显异常文件。

参数上要注意:如果 CSV 没有表头,pd.read_csv会把第一行数据当列名,需要加header=None。另外采样点数不一致是常态,后续做特征提取时要统一窗口长度,不能直接整段丢进模型。

2.2 采样率、转速与故障特征的对应关系

采样率决定了你能分析到多高的频率。齿轮箱的故障特征频率通常由齿数和转速决定,比如啮合频率等于转速乘以齿数。如果采样率不够,高频冲击成分会被混叠,后面再怎么调模型也救不回来。

常见做法是采样率设在 10 kHz 到 20 kHz 之间,能覆盖大多数中小型齿轮箱的故障频带。你要做的第一件事是确认数据里的采样率,通常在 README 或文件名里会标注。如果没标,可以通过信号自相关或频谱峰值反推。

假设采样率是 12 kHz,你可以用下面的代码快速看一眼前几个文件的频谱,确认故障特征是否落在合理频段:

from scipy.fft import fft, fftfreq import matplotlib.pyplot as plt fs = 12000 # 采样率,根据实际数据修改 signal = pd.read_csv("gear_fault_dataset/tooth_root_crack/crack_01.csv").iloc[:, 1].values N = len(signal) yf = np.abs(fft(signal))[:N // 2] xf = fftfreq(N, 1 / fs)[:N // 2] plt.plot(xf, yf) plt.xlabel("Frequency (Hz)") plt.ylabel("Amplitude") plt.title("Spectrum of crack_01") plt.show()

逻辑说明:fft把时域信号转到频域,fftfreq生成对应的频率轴。只看前半段是因为实信号的频谱对称。参数fs必须和数据真实采样率一致,填错的话频率轴整体偏移,故障特征频率就对不上了。如果你发现频谱里主要能量集中在几百赫兹以下,而采样率标的是 12 kHz,那要么是数据被降采样过,要么是传感器带宽有限,这时候做包络分析要格外小心。

提示:不同类别的文件数量可能不均衡,这是公开数据集的通病。后面训练时要么做重采样,要么用类别权重,别直接硬训。

3. 从振动信号到特征向量:时域、频域与包络谱的实操路径

数据摸清楚之后,下一步是把原始波形变成模型能吃的特征。齿轮箱故障诊断里,单纯把原始信号拉平丢进分类器效果通常一般,因为信号太长、冗余太大。常见做法是提取统计特征,或者用包络谱抓住冲击成分。

3.1 时域统计特征提取与窗口划分

时域特征计算快、解释性强,适合做第一版基线。我一般会提取均方根、峭度、峰值因子、裕度因子这几个。峭度对冲击特别敏感,齿轮局部故障早期就能看出来。

窗口划分上,常用做法是滑动窗口,窗口长度取 1024 或 2048 点,重叠 50%。这样既能保证每个窗口内有足够的周期信息,又能扩充样本量。

def extract_time_features(signal, window_size=2048, step=1024): features = [] for start in range(0, len(signal) - window_size + 1, step): seg = signal[start:start + window_size] rms = np.sqrt(np.mean(seg ** 2)) kurt = np.mean((seg - np.mean(seg)) ** 4) / (np.std(seg) ** 4 + 1e-12) peak = np.max(np.abs(seg)) crest = peak / (rms + 1e-12) margin = peak / (np.mean(np.abs(seg)) ** 2 + 1e-12) features.append([rms, kurt, crest, margin]) return np.array(features)

逻辑说明:window_size决定每个样本的时间跨度,step决定重叠程度。1e-12是防止除零。峭度公式里减均值再四次方,能放大冲击成分。峰值因子和裕度因子都是无量纲指标,对负载变化有一定鲁棒性。提取完之后,每个窗口变成一个四维向量,可以直接喂给 SVM 或随机森林。

参数怎么改:如果数据采样率高、故障冲击持续时间短,窗口可以缩小到 1024;如果转速低、冲击间隔大,窗口要加大到 4096 甚至更多。判断标准是窗口内至少包含两个以上的冲击周期。

3.2 包络谱与边频带:抓住调制现象

齿轮箱故障的一个典型特征是调制——故障齿轮的振动会被轴的转频调制,在频谱上表现为以啮合频率为中心、间隔为转频的边频带。直接看频谱有时候不够明显,包络谱能把调制信息解出来。

常见做法是先用带通滤波保留高频共振带,再做希尔伯特变换取包络,最后对包络做 FFT。

from scipy.signal import butter, filtfilt, hilbert def envelope_spectrum(signal, fs, lowcut=2000, highcut=5000): # 带通滤波保留共振带 b, a = butter(4, [lowcut / (fs / 2), highcut / (fs / 2)], btype="band") filtered = filtfilt(b, a, signal) # 希尔伯特变换取包络 envelope = np.abs(hilbert(filtered)) # 去均值后做 FFT envelope = envelope - np.mean(envelope) spec = np.abs(fft(envelope))[:len(envelope) // 2] freq = fftfreq(len(envelope), 1 / fs)[:len(envelope) // 2] return freq, spec

逻辑说明:butter设计巴特沃斯带通滤波器,filtfilt做零相位滤波避免时移。hilbert得到解析信号,取模就是包络。包络谱里的峰值对应故障特征频率,边频带间隔对应转频。参数lowcut和highcut要根据实际共振带调整,一般选在频谱中能量较高但远离啮合频率的区域。选错了要么滤掉故障信息,要么引入噪声。

注意:filtfilt要求信号长度大于滤波器阶数的三倍,短信号会报错。窗口太短时改用lfilter,但会有相位延迟。

4. 避坑与排查:这份数据集最容易翻车的五个地方

数据本身不复杂,但用起来翻车的点不少。下面这几条是我自己和身边人踩过的,按现象、原因、解决来写。

现象一:模型准确率冲到 99%,换一批数据就崩。原因:同一批次的数据被随机划分到了训练集和测试集,模型记住了批次特征而不是故障特征。解决:按文件或批次划分,同一文件的所有窗口只能出现在一个集合里。用GroupShuffleSplit或者手动按文件名分组。

现象二:峭度特征全是 NaN 或异常大。原因:信号里有零值段或恒定段,标准差为零,除零导致。解决:提取特征前先检查信号是否有一段完全不变,如果有,跳过该窗口或加极小值保护。上面代码里的1e-12就是干这个的。

现象三:包络谱里找不到故障特征频率。原因:带通滤波的频带选错了,或者采样率填错了。解决:先画原始频谱,找到共振带的大致范围再设lowcut和highcut。采样率一定要从 README 或数据说明里确认,别靠猜。

现象四:不同类别文件数量差好几倍,训练时模型偏向多数类。原因:数据集本身不均衡。解决:用class_weight='balanced',或者对少数类做窗口重叠增强。注意增强只能在训练集上做,测试集保持原样。

现象五:CSV 读取后第一行变成了列名,数据少了一行。原因:文件没有表头,pd.read_csv默认把第一行当列名。解决:加header=None,或者用pd.read_csv(fpath, names=['time', 'amplitude'])显式指定列名。

5. 进阶技巧:用短时傅里叶变换生成时频图喂给 CNN

如果你已经不满足于手工特征加传统分类器,想上深度学习,那这条路径值得一试。齿轮箱的故障在时频域上表现得很直观:正常状态能量分布均匀,裂纹或断齿会在特定时刻出现宽带冲击。把一维信号转成二维时频图,再套一个轻量 CNN,往往比手工调特征省心。

具体做法是用短时傅里叶变换生成频谱图,保存成图片或直接存复数矩阵。下面这段代码把每个窗口转成时频图并归一化:

from scipy.signal import stft def signal_to_spectrogram(signal, fs, nperseg=256, noverlap=128): f, t, Zxx = stft(signal, fs=fs, nperseg=nperseg, noverlap=noverlap) mag = np.abs(Zxx) # 对数压缩,增强弱信号可见度 mag = np.log1p(mag) # 归一化到 0-1 mag = (mag - mag.min()) / (mag.max() - mag.min() + 1e-12) return mag # 示例:生成一张时频图并查看尺寸 sig = pd.read_csv("gear_fault_dataset/missing_tooth/missing_01.csv").iloc[:, 1].values spec = signal_to_spectrogram(sig, fs=12000) print(spec.shape) # (频率维, 时间维)

逻辑说明:stft返回频率轴、时间轴和复数矩阵。取模得到幅度谱,log1p做对数压缩,因为振动信号动态范围大,不压缩的话弱故障特征会被强背景淹没。归一化让不同样本的输入尺度一致。nperseg决定频率分辨率,越大频率越细但时间越粗;noverlap影响时间维平滑度,常用 50% 重叠。

参数怎么选:采样率 12 kHz 时,nperseg=256对应频率分辨率约 47 Hz,对齿轮故障特征频率来说够用。如果特征频率间隔很小,加大到 512。生成的时频图尺寸大概是 129×N,N 取决于信号长度。喂 CNN 前可以裁剪或缩放到固定大小,比如 128×128。

一个容易忽略的点:训练集和测试集的归一化要分别做,不能用全局均值和方差,否则测试集信息泄露到训练里。我一般把归一化写在数据加载管道里,每个 batch 单独算,或者用训练集的统计量去归一化测试集。

从那以后我每次拿到新的振动数据集,都强制先跑一遍文件结构统计和频谱预览,确认采样率和标签没问题再动手写模型。这一步花十分钟,能省掉后面几小时的排查。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询