尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

滚动轴承故障特征频率计算详解:从CWRU数据集到Python实现

滚动轴承故障特征频率计算详解:从CWRU数据集到Python实现 简介滚动轴承是旋转机械中最易受损的部件之一其故障诊断长期依赖振动信号分析。在频谱上识别轴承故障核心依据是外圈、内圈、滚动体和保持架各自对应的特征频率BPFO、BPFI、BSF、FTF这些频率由轴承几何参数和转速决定是包络谱分析、边带识别等后续算法的基础。掌握特征频率的物理含义与计算公式能帮助工程师快速定位故障类型避免误判。基于凯斯西储大学CWRU公开轴承数据集本文从公式推导出发给出了一套可复现的Python计算脚本并详细讨论了单位混用、接触角近似、转速偏差、包络谱频带选择等实际工程中的常见问题。无论你是做科研验证还是设备状态监测理解特征频率的来龙去脉才能让频谱上的每一根峰值都真正为你所用。1. 打开压缩包前先把“特征频率计算”这事掰扯清楚凯斯西储大学CWRU轴承数据集是故障诊断领域绕不开的一套公开数据哪怕到了深度学习烂大街的今天它依然是验证新算法、跑通诊断流程的首选基准。很多人从各种渠道下载到凯斯西储轴承故障特征频率计算.zip这个压缩包解压后面对一堆.mat文件和几段说明文档第一反应往往是这些数据我认识但特征频率到底怎么算、算出来干什么用、为什么网上搜到的公式算出来的数总是对不上先给结论特征频率计算不是整套诊断流程里最有技术含量的一步但它决定了你后面所有分析是否站得住脚。频谱图上哪个峰是外圈故障、哪个峰是内圈故障、哪个峰只是转频的倍频全靠这几个数去定位。算错了后面什么包络谱、边带分析、特征能量占比全都是在错误的地图上找路。这个压缩包本质上就是帮你把这件事标准化把CWRU数据集的轴承参数、转速、采样率、四个特征频率公式串成一条稳定可复现的计算链路。这篇文章适合正在使用CWRU数据集做科研、准备毕业设计、或者刚入行做设备状态监测的朋友。我会从四个特征频率的物理含义开始把公式推一遍再给出一套可以直接跑的Python计算脚本最后重点聊几个我实际使用中踩过、也看身边人反复踩的坑。保证你看完能直接把自己手头的数据算明白也能看懂那些网上流传的“系数表”到底怎么来的而不是只会抄公式。2. 先搞清楚你算的是哪四个频率BPFO、BPFI、BSF、FTF都不是瞎记的2.1 一个轴承故障为什么会有四种特征频率滚动轴承的结构不复杂内圈套在轴上外圈固定在轴承座里中间是一圈滚珠或滚子还有一个保持架把滚珠隔开。任何一个部件出现局部损伤比如外圈滚道上剥落了一小块滚珠每滚过这个损伤点一次就会产生一次冲击这个冲击在频谱上就会对应一个频率。由于每个部件相对传感器的运动关系不同这套冲击频率的表达式也不同于是就有了四个经典特征频率外圈故障频率BPFOBall Pass Frequency Outer滚珠通过外圈上某一个固定损伤点的频率。内圈故障频率BPFIBall Pass Frequency Inner滚珠通过内圈上某一个固定损伤点的频率。滚动体故障频率BSFBall Spin Frequency滚动体自转时滚动体表面同一点接触内外圈滚道的频率。这个量对应的是滚动体自身某处剥落时产生的冲击。保持架故障频率FTFFundamental Train Frequency保持架转一圈的频率也就是滚动体公转的频率。保持架本身或滚动体位置异常时这个频率会变得突出。这四个频率都和轴的转频也就是转速除以60单位Hz成正比。用一个通俗的类比转速好比鼓点的节奏特征频率则是这个节奏下不同演奏者各自敲击的固定节拍倍数。转换成一个标准公式就是BPFO (n/2) × fr × (1 - (d/D) × cos²α)BPFI (n/2) × fr × (1 (d/D) × cos²α)BSF (D/(2d)) × fr × (1 - (d/D)² × cos²α)FTF (1/2) × fr × (1 - (d/D) × cosα)其中n是滚动体数量d是滚动体直径D是节圆直径滚珠中心所在圆周的直径α是接触角fr是转频。2.2 为什么内外圈频率的公式里一正一负很多初学者背这四个公式的时候觉得难记关键是没有理解里边的几何关系。你可以想象一个极端情况如果滚动体的直径无限小小到只剩一个点那滚动体基本上就是贴在内圈和外圈之间随保持架公转此时内外圈上同一点被滚过的频率都约等于保持架转速。但真实滚动体有直径它的滚动方向是沿着节圆切线方向滚动体既随保持架公转又绕自身轴线自转因此它在内外圈走过的路径长度不一样内圈滚道周长短外圈滚道长。结果是滚动体相对内圈的通过频率略高于保持架转速相对外圈的通过频率略低于保持架转速。外圈固定、内圈旋转的工况下传感器一般固定在外壳上所以BPFO直接对应外圈损伤点的冲击频率BPFI则需要根据轴每转一圈、损伤点相对承载区的位置变化产生调制。这是做边带分析时的物理基础后面会单独说。因此(1 - d/D×cosα)和(1 d/D×cosα)这两个因子本质上是在修正滚动体直径带来的速度差而不是什么人为拼凑的经验系数。把这一点想通了这四个公式基本不会记混。2.3 SKF6205轴承的实测参数与数值计算CWRU数据集绝大多数实验使用的是SKF6205深沟球轴承这也是目前公开的CWRU文档里写明的型号。SKF6205的典型几何参数如下滚动体数量 n 9滚动体直径 d 7.94 mm约0.3126英寸节圆直径 D 39.04 mm约1.537英寸接触角 α 0°把参数代入以1797 rpm这是CWRU数据集中最常见的电机转速之一为例fr 1797 / 60 29.95 Hz可以得到BPFO ≈ 29.95 × 3.048 ≈ 91.28 HzBPFI ≈ 29.95 × 4.948 ≈ 148.19 HzBSF ≈ 29.95 × 1.989 ≈ 59.57 HzFTF ≈ 29.95 × 0.398 ≈ 11.92 Hz3.048、4.948、1.989、0.398 这四个倍数就是网上流传的“SKF6205轴承特征频率系数”很多诊断软件里直接把它当作固定配置。但这里要提醒一句这些系数只在接触角为0、几何参数完全匹配时成立。如果你用的轴承是其他型号或者接触角不为0系数必须重新计算。这也是为什么我坚持用完整公式而不是背系数的原因——系数好抄但很容易失效。3. 用Python手写一套特征频率计算脚本顺便把数据加载也解决了3.1 从.mat文件里正确读取CWRU数据别被索引带偏CWRU数据的.mat文件有好几个版本早期版本是MATLAB 5.0格式直接用scipy.io.loadmat读取即可。不过读取之后你会发现数据文件里是一个嵌套的结构体比如X097_DE_time是驱动端加速度数据X097_FE_time是风扇端加速度数据RPM字段可能是一个数组而非标量。常见问题有两个一是直接loadmat之后数据类型是numpy.ndarray形状可能是 (1, N)需要ravel()压平二是有些文件用-1作为无效转速值读取后要做合法性判断。我在处理时常用一个封装函数把可用的转速值和采样率一起返回方便后续所有计算直接用import scipy.io as sio import numpy as np def load_cwru_mat(file_path, signal_keyNone): mat sio.loadmat(file_path) # CWRU常见key if signal_key is None: candidates [k for k in mat.keys() if k.endswith(_DE_time)] if not candidates: candidates [k for k in mat.keys() if k.endswith(_FE_time)] if not candidates: raise ValueError(未找到加速度信号字段) signal_key candidates[0] data mat[signal_key].ravel().astype(np.float64) # 采样率CWRU驱动端加速度通常为12000 Hz故障频率段通常恒定 fs 12000 rpm_value None if RPM in mat: rpm_arr np.asarray(mat[RPM]).ravel() # 过滤敏感点多数文件RPM是单一值但某些版本是动态数组 valid_rpm rpm_arr[rpm_arr 0] if valid_rpm.size 0: rpm_value float(valid_rpm[0]) return data, fs, rpm_value这个函数不复杂但省掉了所有.mat文件打开时的繁琐索引也规避了不同版本CWRU数据字段命名差异的问题。如果你用MATLAB把loadmat换成load后做相同的字段判断即可逻辑完全一致。3.2 核心计算函数输入轴承几何参数输出四个特征频率计算脚本的核心就是把刚才的公式转成代码。为了保证可读性和复用性我会写一个轴承类把几何参数和转速传进去一次性输出四个频率和对应的倍频系数def bearing_fault_frequencies(n_balls, ball_diameter, pitch_diameter, contact_angle, rpm): 计算滚动轴承四个特征频率。 参数单位统一使用mm或inch只要一致即可。 fr rpm / 60.0 cos_a np.cos(np.deg2rad(contact_angle)) bpfo_coef n_balls / 2.0 * (1 - ball_diameter / pitch_diameter * cos_a) bpfi_coef n_balls / 2.0 * (1 ball_diameter / pitch_diameter * cos_a) bsf_coef pitch_diameter / (2.0 * ball_diameter) * (1 - (ball_diameter / pitch_diameter * cos_a) ** 2) ftf_coef 0.5 * (1 - ball_diameter / pitch_diameter * cos_a) return { fr: fr, BPFO: bpfo_coef * fr, BPFI: bpfi_coef * fr, BSF: bsf_coef * fr, FTF: ftf_coef * fr, coefs: (bpfo_coef, bpfi_coef, bsf_coef, ftf_coef) }实际调用方式可以是freqs bearing_fault_frequencies( n_balls9, ball_diameter7.94, pitch_diameter39.04, contact_angle0, rpm1797 )这个函数输出结果后我习惯把四个频率和系数打印成一张对照表同时另存一份CSV方便做实验记录。如果你的研究涉及多个转速工况只需要外层加一个循环把每个RPM对应的频率都计算并标注清楚。3.3 一个容易忽略的细节公制参数和英制参数的混用我在最开始写这个脚本时踩过一个大坑CWRU官方文档中SKF6205参数有两种单位标注比如滚珠直径7.94 mm和0.3126 inch是同一个数但在代码里如果不小心把毫米和英寸混着算结果会差到完全不可用。这不是简单的单位换算错误而是公式推导本身要求d/D是一个无量纲比值因此只要保持分子分母单位一致即可不必刻意统一成公制或英制。这一点一定要写进注释里否则半年后自己回来看代码都可能犯迷糊。# 注意ball_diameter 和 pitch_diameter 必须同单位 # 推荐统一使用 mmCWRU官方参数可直接用4. 实战中反复踩过的坑为什么你算出来的频率和论文对不上4.1 接触角取0°是近似不是物理事实深沟球轴承在承受轴向载荷时接触角会从0°变为一个较小的值通常几度到十几度不等。CWRU数据集中SKF6205轴承的接触角在名义上确实是0°但在实际运行中并不是严格为0。接触角的变化会直接影响(1 - d/D×cosα)这个系数cosα在0°到20°之间变化很平缓0°时cos120°时cos≈0.94对应的特征频率差异大约在1%到3%之间。这个差异在频谱图上往往不足以区分不同故障类型但在做高精度频率定位时就不可忽视。如果做的是基于特征频率的定量分析比如计算故障频率能量占比建议用实测接触角重算而不是直接用0°。我见过不少人在论文里把BPFO写成了93.1 Hz后来发现是因为用了网上流传的“SKF6205系数表”直接乘转速但那个系数表是按节圆直径39.04mm、滚动体直径8.18mm算的——这是NSK的尺寸和CWRU的SKF6205并不完全相同。所以再次强调参数要对型号不能只对轴承大小。4.2 转速单位转速源是电机输出轴但数据采集时负载会带来转差CWRU数据集的实验台结构是电机通过轴承支撑负载转速表给出的往往是电机的同步转速或实际反馈转速。例如1.5kW的电机在空载时实际转速接近同步转速但略低在加载后转速会由于转差而下降。CWRU的mat文件里通常直接给出实验时的转速值比如1797。这已经是实测值而非理想值所以直接用这个数值做计算没问题。但在实际工业诊断中如果你拿着铭牌上的额定转速去算特征频率通常会遇到频谱峰值偏移几十赫兹的情况这是因为电机在负载状态下实际转速可能比额定转速低2%到5%。正确做法是用转速计实测或者从频谱上找一个高信噪比的转频峰值来反推实际转速。这个方法在CWRU数据上不常用但在现场诊断中是保命技能。4.3 BSF和FTF在频谱上经常“消失”这是正常的BSF对应的是滚动体自身某点的剥落它的幅值通常比其他两个频率低得多。原因是滚动体故障信号传递路径复杂滚动体在内外圈之间运动时损伤点时而接触内圈、时而接触外圈且受到保持架位置和润滑状态的影响冲击幅值被分散了。FTF同样微弱通常只能在包络谱的低频段勉强识别。因此如果你用快速傅里叶变换FFT直接分析看不到BSF和FTF是很正常的事不一定代表计算错误。遇到这种情况我一般会先做带通滤波然后提取包络再做一次FFT也就是包络谱分析。对滚动轴承早期故障来说包络谱是最有效的手段之一后面第5节会展示具体流程。4.4 采样率和频谱分辨率的配合CWRU驱动端加速度数据的采样率有12 kHz和48 kHz两种风扇端是12 kHz。特征频率通常只有几百赫兹单看频率分辨率12 kHz完全够用而且数据量更小处理更快。但如果你打算用高阶边带分析或共振解调48 kHz的优势就体现出来了你可以更灵活地选择带通滤波的频带不需要担心高频共振分量被采样率限制。需要特别注意的是FFT点数选择。假设数据长度固定选择过大的FFT点数不仅不会提高真实分辨率分辨率本质由数据时长决定即 Δf 1/T还会在频谱上制造虚假的插值效果。正确做法是先用短数据段估算T再设置合适的FFT点数。我习惯把单段分析长度设为1到2秒这样频率分辨率在0.5到1 Hz之间已经能清楚区分各个特征频率及其边带。5. 算完频率不是终点把频率标到频谱和包络谱上才算闭环5.1 在频谱图上画出特征频率线快速判断故障类型将计算得到的特征频率放到频谱图上并画出对应位置的竖线是最直观的验证方法。这里有一个实用技巧不要只标注BPFO、BPFI、BSF、FTF的基频还要标注它们的2倍频、3倍频。原因是很多轴承故障信号的谐波非常丰富尤其是外圈故障往往在BPFO的2倍频处出现明显峰值而基频处可能因为传递路径的影响反而较弱。一个简单的标注实现可以是import matplotlib.pyplot as plt def plot_spectrum_with_features(freqs, psd, fs, label)): plt.figure(figsize(16, 6)) plt.plot(freqs, psd, linewidth0.5) for name, fval in freqs.items(): if name ! fr: for mult in range(1, 4): xval fval * mult plt.axvline(xxval, linestyle--, linewidth1, alpha0.8) plt.text(xval, plt.ylim()[1]*0.9, f{name}{mult}x, rotation45, fontsize8) plt.xlim(0, 500) plt.xlabel(频率 (Hz)) plt.ylabel(幅值) plt.title(label) plt.tight_layout() plt.show()实际使用时我通常会同时看原始频谱和包络谱两个图。原始频谱上如果外圈故障特征频率及其谐波处有峰基本可以断定外圈故障但内圈故障往往在原始频谱上表现为BPFI及其以转频为间隔的边带这时就要看边带间隔是否等于fr。5.2 边带的意义内圈故障为什么总带一串“裙子”内圈故障的冲击点随轴一起旋转传感器位于外壳上冲击到传感器之间的传递路径随轴旋转而周期性变化。结果是BPFI的幅值被fr周期性调制于是频谱图上BPFI两侧会出现以fr为间隔的边带。这个特征是内圈故障与外圈故障的重要区分点外圈故障位置固定传递路径不变所以边带通常不明显内圈故障则因为旋转调制边带非常典型。判断的时候如果只看到BPFI一处有峰没有边带我会先怀疑是不是频率算错了或者数据里根本没有内圈故障。在CWRU数据集中内圈故障的样本比如IR007_0通常都能在频谱上看到清晰的边带这是一个很好的自检样例。5.3 做包络谱时先选对共振带包络谱的实现并不复杂但效果好坏很大程度上取决于带通滤波的频带选择。轴承故障冲击会激发轴承座或传感器的固有共振频率这些共振频率通常远高于特征频率比如几千赫兹。包络解调的核心就是把这段共振频带单独滤出来再求包络最后对包络做FFT。这样故障信号被放大低频干扰和转频成分被大幅抑制。在CWRU数据上我常用的带通频带是2000 Hz到8000 Hz。这个范围能覆盖大部分由故障冲击激发的结构共振。如果信号噪声较大可以先做一次谱分析观察哪个频段有较明显的能量隆起再针对性选带效果更好。下面给一个完整的包络谱分析函数可以直接跑通from scipy.signal import butter, lfilter, hilbert def envelope_spectrum(data, fs, band(2000, 8000), fft_points8192): low, high band b, a butter(4, [low / (fs/2), high / (fs/2)], btypeband) filtered lfilter(b, a, data) analytic hilbert(filtered) env np.abs(analytic) n len(env) win np.hanning(n) spectrum np.fft.rfft(env * win, nfft_points) freqs np.fft.rfftfreq(fft_points, d1/fs) return freqs, np.abs(spectrum)用这个函数处理CWRU内圈故障样本时应该能清楚看到BPFI处有峰且两侧有fr间隔的边带处理外圈故障样本时BPFO处有峰谐波也明显。无论数据来自哪个工况这套流程都可以直接套用。6. 我自己沉淀下来的几条实操经验做CWRU特征频率计算这个方向的这段时间我最有感触的一点是特征频率计算本身是机械性的公式套用但真正拉开差距的是对数据背后物理过程的敏感度。有几点经验分享给正要开始做类似工作的朋友。第一永远保留原始参数和计算过程的记录。我在最初做批量实验时把所有工况的转速、轴承参数、计算结果分别存成CSV并且把公式版本和代码Git提交记录也保留下来。这样论文写作、实验复现、甚至审稿人质疑的时候都能直接拿出证据来省去很多麻烦。做科研也好做工程报告也好这个习惯非常重要。第二不要直接相信网上下载的“计算器”或“系数表”。CWRU数据集的规格在不同文档版本里确实有细微差异。有的文档里SKF6205的节圆直径写39.04mm有的写39.03mm有的滚动体直径写7.94mm有的写7.93mm。这些微小差异在单个频率计算中只差零点几赫兹但在谐波放大或故障定位时可能会产生影响。所以我推荐自己写脚本参数用官方文档核对一遍然后固定下来不再改动。第三做故障诊断时不要把鸡蛋放在一个篮子里。特征频率只是初步的故障类型判别依据CWRU数据集里同样是内圈故障损伤直径0.007英寸、0.014英寸、0.021英寸的样本频谱特征会有明显差别早期微弱故障尤其需要结合时域统计指标、峰值因子、峭度等做多维度判断。特征频率计算和包络谱分析是主线但不能替代所有的特征工程。最后如果你准备把CWRU上的方法迁移到实际工业场景中一定要记住实验室数据是理想状态下的数据轴承型号明确、转速恒定、载荷稳定而现场轴承的载荷、转速、润滑状态都在动态变化特征频率的峰值会变得模糊。这时候比算法更关键的是对工况的理解和对数据质量的把控。实测转速、确认传递路径、评估环境噪声这些功夫花得越多后面算法分析就越省力。本文还有配套的精品资源点击获取
返回列表