资讯动态

齿轮箱故障数据.zip:振动信号数据集诊断流程实战指南

发布时间:2026/10/20 2:40:44 来源:尧图企业网站定制
简介这份齿轮箱故障数据集面向从事机械故障诊断、信号处理与机器学习的研究人员及工程技术人员用于开展齿轮箱早期故障检测与预测性维护研究。压缩包共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会把第一行数据当列名需要加headerNone。另外采样点数不一致是常态后续做特征提取时要统一窗口长度不能直接整段丢进模型。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_size2048, step1024): 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, lowcut2000, highcut5000): # 带通滤波保留共振带 b, a butter(4, [lowcut / (fs / 2), highcut / (fs / 2)], btypeband) 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_weightbalanced或者对少数类做窗口重叠增强。注意增强只能在训练集上做测试集保持原样。现象五CSV 读取后第一行变成了列名数据少了一行。原因文件没有表头pd.read_csv默认把第一行当列名。解决加headerNone或者用pd.read_csv(fpath, names[time, amplitude])显式指定列名。5. 进阶技巧用短时傅里叶变换生成时频图喂给 CNN如果你已经不满足于手工特征加传统分类器想上深度学习那这条路径值得一试。齿轮箱的故障在时频域上表现得很直观正常状态能量分布均匀裂纹或断齿会在特定时刻出现宽带冲击。把一维信号转成二维时频图再套一个轻量 CNN往往比手工调特征省心。具体做法是用短时傅里叶变换生成频谱图保存成图片或直接存复数矩阵。下面这段代码把每个窗口转成时频图并归一化from scipy.signal import stft def signal_to_spectrogram(signal, fs, nperseg256, noverlap128): f, t, Zxx stft(signal, fsfs, npersegnperseg, noverlapnoverlap) 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, fs12000) print(spec.shape) # (频率维, 时间维)逻辑说明stft返回频率轴、时间轴和复数矩阵。取模得到幅度谱log1p做对数压缩因为振动信号动态范围大不压缩的话弱故障特征会被强背景淹没。归一化让不同样本的输入尺度一致。nperseg决定频率分辨率越大频率越细但时间越粗noverlap影响时间维平滑度常用 50% 重叠。参数怎么选采样率 12 kHz 时nperseg256对应频率分辨率约 47 Hz对齿轮故障特征频率来说够用。如果特征频率间隔很小加大到 512。生成的时频图尺寸大概是 129×NN 取决于信号长度。喂 CNN 前可以裁剪或缩放到固定大小比如 128×128。一个容易忽略的点训练集和测试集的归一化要分别做不能用全局均值和方差否则测试集信息泄露到训练里。我一般把归一化写在数据加载管道里每个 batch 单独算或者用训练集的统计量去归一化测试集。从那以后我每次拿到新的振动数据集都强制先跑一遍文件结构统计和频谱预览确认采样率和标签没问题再动手写模型。这一步花十分钟能省掉后面几小时的排查。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑