简介:这份资源面向机械工程、设备维护与信号处理方向的学习者和研究人员,围绕凯斯西储大学轴承数据,提供轴承故障特征频率计算的MATLAB实现,帮助解决故障诊断中特征频率提取与故障类型定位的问题。压缩包共3个文件,包含1个m脚本文件和2张png图片,整体约91KB,脚本用于读取振动信号、数字滤波、傅里叶变换与频谱绘制,图片则展示特征频率计算截图及JEMSKF深沟球轴承结构,便于对照理解。资源还配有轴承故障特征频率步骤分析基础讲解,梳理数据预处理、特征提取与故障判断的完整流程,适合初学者按步骤复现,也方便有经验者快速核对计算公式与仿真结果。目前已有4135人学习下载,可作为轴承故障分析入门与工程实践的参考工具。
1. 从一段“看起来像噪声”的振动信号说起
如果你手头有一段电机驱动端加速度传感器采回来的振动数据,画出来密密麻麻,FFT 之后能看到几个尖峰,但你不确定哪个峰对应内圈、哪个对应外圈、哪个是滚动体,那这份凯斯西储大学轴承故障特征频率 MATLAB 源代码就是冲着你来的。它解决的不是“怎么采数据”,而是“已知转速和轴承几何参数,怎么把理论故障特征频率算准,再拿它去比对实测频谱里的峰”。适合做旋转机械状态监测、故障诊断算法验证、以及需要给深度学习模型打标签之前先做机理确认的从业者。很多人跳过这一步直接上模型,结果标签错了都不知道,后面全白干。
2. 轴承故障特征频率的力学推导与参数映射
2.1 四个核心频率到底怎么来的
轴承故障特征频率不是拍脑袋定的,它来自滚动体通过缺陷位置时的周期性冲击。常见的有四个:外圈故障频率 BPFO、内圈故障频率 BPFI、滚动体故障频率 BSF、保持架故障频率 FTF。推导的起点是“接触角”和“节径”这两个几何量。假设外圈固定、内圈随轴旋转,滚动体公转速度由内外圈相对运动决定,单个滚动体自转又叠加了公转带来的影响。把线速度换成频率,就得到一组只跟转速、滚动体数、滚动体直径、节径、接触角有关的公式。
这里最容易翻车的地方是单位。转速通常给的是 rpm,公式里要的是 Hz,必须除以 60。节径和滚动体直径只要单位一致就行,但很多人一个用毫米一个用英寸,算出来的频率偏了几倍还以为是数据问题。另一个坑是接触角,深沟球轴承接触角接近零,角接触轴承可能十几度,代错了 cos 值直接让 BPFO 和 BPFI 的系数对不上。
2.2 把公式写成可复用的 MATLAB 函数
下面这段代码是我一般会先跑一遍的骨架,输入转速和轴承参数,输出四个特征频率。注意注释里标了每个参数的单位和典型取值范围。
function [BPFO, BPFI, BSF, FTF] = bearing_freq(rpm, n, d, D, theta_deg) % rpm 转速,单位转/分钟 % n 滚动体个数 % d 滚动体直径,单位与 D 一致 % D 节径(滚道中径),单位与 d 一致 % theta_deg 接触角,单位度 fr = rpm / 60; % 转频 Hz theta = deg2rad(theta_deg); % 角度转弧度 ratio = (d / D) * cos(theta); % 直径比与接触角耦合项 BPFO = (n / 2) * fr * (1 - ratio); % 外圈故障频率 BPFI = (n / 2) * fr * (1 + ratio); % 内圈故障频率 BSF = (D / (2 * d)) * fr * ... (1 - ratio^2); % 滚动体故障频率 FTF = (fr / 2) * (1 - ratio); % 保持架故障频率 end逻辑说明:先统一转频,再把几何耦合项 ratio 算出来,四个频率都是 fr 乘以一个跟 n、d/D、cosθ 有关的系数。参数说明:n 一般是 8 到 12,d/D 常见在 0.2 到 0.4 之间,theta_deg 深沟球轴承填 0,角接触填实际角度。跑完这个函数,你会得到一组理论值,下一步才是拿它去频谱里找峰。
2.3 从理论频率到实测频谱的对应关系
有了理论值,不能直接说“频谱里 120 Hz 有峰就是外圈故障”。实际频谱里还有转频、倍频、电源频率、齿轮啮合频率。常见做法是先把转频 fr 标出来,再看 BPFO、BPFI 附近有没有边带。外圈故障通常 BPFO 及其谐波明显,内圈故障会在 BPFI 两侧出现 fr 的边带,滚动体故障则可能出现 BSF 的两倍频。这些对应关系不是绝对的,但能帮你排除明显不合理的峰。我一般会画一张叠加图:理论频率用竖线标在频谱上,一眼就能看出哪些峰值得追。
3. 用 MATLAB 把理论频率和实测数据对上的完整流程
3.1 数据导入与预处理的最小闭环
假设你手头是 CWRU 格式的 .mat 文件,里面通常有驱动端加速度数据和时间戳。第一步不是直接 FFT,而是先确认采样率和数据长度。采样率不对,频率轴全错。下面这段是导入和去均值、加窗的常规操作。
load('bearing_data.mat'); % 假设变量名为 X 和 fs x = X(:, 1); % 取第一通道 fs = 12000; % 常见采样率,按实际改 x = x - mean(x); % 去直流 w = hann(length(x)); % 汉宁窗 xw = x .* w; N = length(xw); f = (0:N-1) * (fs / N); % 频率轴 Xf = abs(fft(xw)) / N * 2; % 幅值归一化 Xf = Xf(1:floor(N/2)); f = f(1:floor(N/2)); plot(f, Xf); xlabel('Frequency (Hz)'); ylabel('Amplitude');逻辑说明:去均值是为了去掉传感器零漂,加窗是为了减少频谱泄漏,幅值归一化是为了让不同长度的数据可比。参数说明:fs 必须跟采集时一致,N 建议取 2 的幂次附近,不是强制但快。跑完这一步,你应该能看到几个明显的峰。
3.2 理论频率叠加与峰值搜索
把第 2 章的 bearing_freq 函数拿过来,算出四个频率,然后在频谱上找最近峰。下面这段是叠加和简单峰值检测。
rpm = 1750; n = 9; d = 0.00794; D = 0.03904; theta_deg = 0; [BPFO, BPFI, BSF, FTF] = bearing_freq(rpm, n, d, D, theta_deg); hold on; for f0 = [BPFO, BPFI, BSF, FTF] xline(f0, '--r'); end [pks, locs] = findpeaks(Xf, 'MinPeakHeight', 0.01); f_peaks = f(locs); for i = 1:length(f_peaks) fprintf('Peak at %.2f Hz, amplitude %.4f\n', f_peaks(i), pks(i)); end逻辑说明:xline 把理论频率画成竖线,findpeaks 找出超过阈值的峰。参数说明:MinPeakHeight 要根据你的幅值量级调,太小会出一堆噪声峰,太大会漏掉真实峰。我一般先看整体频谱再定这个阈值。跑完你会得到一张图,理论线和实测峰对得上,说明参数没代错;对不上,先回去查 d、D、theta_deg 和 rpm。
3.3 包络谱在早期故障里的作用
早期故障的冲击很弱,直接 FFT 可能被转频和噪声淹没。这时候常见做法是带通滤波后做包络谱。先选一个以某个共振频率为中心的带通,然后希尔伯特变换取包络,再对包络做 FFT。
bp_lo = 2000; bp_hi = 4000; % 带通范围,按实际共振区改 [b, a] = butter(4, [bp_lo bp_hi]/(fs/2), 'bandpass'); x_bp = filtfilt(b, a, x); env = abs(hilbert(x_bp)); env = env - mean(env); N2 = length(env); f2 = (0:N2-1) * (fs / N2); Ef = abs(fft(env)) / N2 * 2; Ef = Ef(1:floor(N2/2)); f2 = f2(1:floor(N2/2)); plot(f2, Ef); xlabel('Frequency (Hz)'); ylabel('Envelope Amplitude');逻辑说明:filtfilt 是零相位滤波,避免包络偏移;hilbert 取解析信号幅值就是包络。参数说明:bp_lo 和 bp_hi 要选在共振峰附近,通常看原始频谱里 2k 到 5k 之间哪个区域能量高。包络谱里如果 BPFO 或 BPFI 的峰更干净,说明早期故障确实存在。
4. 避坑与排查:参数代错、单位混乱、峰值误判
4.1 现象:理论频率和实测峰差了一个转频的整数倍
原因:转速填的是额定转速,实际运行有滑差,或者数据采集时转速波动。解决:先用频谱里的转频反推实际转速,再代回公式。如果转频是 29.2 Hz,那 rpm 就是 1752,不是铭牌上的 1750。
4.2 现象:BPFO 和 BPFI 算出来几乎一样
原因:d/D 太小或者接触角代错,导致 ratio 接近零,两个系数都趋近 n/2。解决:检查 d 和 D 是不是同一个单位,接触角是不是填了弧度而不是度。深沟球轴承 theta_deg 填 0,角接触填实际角度。
4.3 现象:包络谱里找不到理论频率
原因:带通范围选错了,或者传感器方向不对。解决:先看原始频谱的共振区在哪,把带通中心对准共振峰。如果还是找不到,换一个通道或者换一段数据,排除单次采集异常。
4.4 现象:峰值搜索出一堆无关峰
原因:MinPeakHeight 设太低,或者数据里有工频干扰。解决:先做一次全频谱观察,把阈值设到明显高于噪声底。工频干扰通常在 50 Hz 及其倍频,可以用陷波器先滤掉。
4.5 现象:不同数据段算出来的特征频率对不上
原因:转速在变,或者轴承参数记错了。解决:每段数据单独估转速,不要用同一组参数套所有数据。如果转速变化大,考虑做阶次分析而不是固定频率分析。
5. 进阶:把特征频率做成批量验证脚本
单次跑通只是开始,真正省时间的是批量处理。我一般会写一个循环,遍历所有 .mat 文件,自动估转速、算理论频率、找峰、输出一张对照表。下面是一个简化版框架。
files = dir('*.mat'); results = []; for k = 1:length(files) load(files(k).name); x = X(:, 1); x = x - mean(x); N = length(x); f = (0:N-1) * (fs / N); Xf = abs(fft(x)) / N * 2; Xf = Xf(1:floor(N/2)); f = f(1:floor(N/2)); [~, idx] = max(Xf(f > 20 & f < 60)); % 估转频 fr_est = f(find(f > 20 & f < 60, 1) + idx - 1); rpm_est = fr_est * 60; [BPFO, BPFI, BSF, FTF] = bearing_freq(rpm_est, 9, 0.00794, 0.03904, 0); results = [results; rpm_est, BPFO, BPFI, BSF, FTF]; end disp(results);逻辑说明:先估转频,再算理论频率,最后把结果堆到一个矩阵里。参数说明:转频搜索范围 20 到 60 Hz 对应 1200 到 3600 rpm,按实际工况改。这个脚本跑完,你能一眼看出哪些文件的理论频率跟实测峰对得上,哪些对不上。对不上的单独拎出来查,效率比一个个手动跑高得多。
验证方法上,我习惯拿已知故障类型的数据做回测:如果外圈故障数据算出来的 BPFO 跟频谱峰吻合,内圈故障数据算出来的 BPFI 吻合,那这套参数和流程就是可信的。如果只有一部分吻合,先怀疑转速估计,再怀疑轴承参数。从那以后我每次拿到新数据,都强制先跑一遍转频估计和理论频率对照,再决定要不要上更复杂的算法。希望帮到你。
本文还有配套的精品资源,点击获取