一、滚动轴承故障诊断原理
滚动轴承故障诊断是通过分析振动信号来识别轴承运行状态的技术。当轴承出现故障时,会产生周期性冲击信号,其特征频率与故障类型和轴承几何参数相关。
1. 外圈故障特征频率
外圈故障特征频率公式:
$f_{out}=\frac{n}{2}(1−\frac{d}{D}cosα)f_r$
其中:
- n:滚动体数量
- d:滚动体直径
- D:节圆直径
- α:接触角
- $f_r$:轴旋转频率
2. 诊断流程
- 信号采集:获取轴承振动信号
- 预处理:去噪、滤波
- 特征提取:时域、频域、时频域特征
- 故障识别:模式分类(正常/外圈故障)
二、MATLAB实现步骤
1. 参数设置与信号模拟
clear; clc; close all;
% ==================== 轴承参数设置 ====================
n = 8; % 滚动体数量
d = 7.94e-3; % 滚动体直径(m)
D = 39.04e-3; % 节圆直径(m)
alpha = 0; % 接触角(度)
fr = 25; % 轴旋转频率(Hz) - 1500 RPM
fs = 10000; % 采样频率(Hz)
T = 1; % 信号时长(s)
% 计算外圈故障特征频率
f_out = (n/2)*(1 - d/D*cosd(alpha))*fr;
% ==================== 模拟振动信号 ====================
t = 0:1/fs:T-1/fs; % 时间向量
N = length(t);
% 正常轴承信号(基频振动 + 噪声)
x_normal = 0.5*sin(2*pi*30*t) + 0.2*randn(1, N);
% 外圈故障信号(基频振动 + 周期性冲击 + 噪声)
impulse_period = 1/f_out; % 冲击周期
impulse_times = 0:impulse_period:T-impulse_period;
x_fault = 0.5*sin(2*pi*30*t); % 基频成分
% 添加周期性冲击
for i = 1:length(impulse_times)
idx = round(impulse_times(i)*fs);
if idx > 0 && idx <= N
% 冲击波形(高斯脉冲)
pulse_width = 0.005; % 脉冲宽度(s)
pulse_samples = round(pulse_width*fs);
t_pulse = linspace(-pulse_width/2, pulse_width/2, pulse_samples);
pulse = exp(-50*(t_pulse).^2); % 高斯脉冲
% 添加冲击
start_idx = max(1, idx-floor(pulse_samples/2));
end_idx = min(N, idx+floor(pulse_samples/2)-1);
seg_len = end_idx - start_idx + 1;
x_fault(start_idx:end_idx) = x_fault(start_idx:end_idx) + 0.8*pulse(1:seg_len);
end
end
x_fault = x_fault + 0.2*randn(1, N); % 添加噪声
% 可视化信号
figure;
subplot(2,1,1);
plot(t, x_normal);
title('正常轴承振动信号');
xlabel('时间(s)'); ylabel('振幅');
xlim([0, 0.2]);
subplot(2,1,2);
plot(t, x_fault);
title('外圈故障轴承振动信号');
xlabel('时间(s)'); ylabel('振幅');
xlim([0, 0.2]);
2. 信号预处理(小波去噪)
% ==================== 小波去噪 ====================
% 正常信号去噪
[cA_normal, cD_normal] = dwt(x_normal, 'db4');
thresh_normal = thselect(cD_normal, 'sqtwolog'); % 阈值选择
cD_normal_thresh = wthresh(cD_normal, 's', thresh_normal);
x_normal_denoised = idwt(cA_normal, cD_normal_thresh, 'db4');
% 故障信号去噪
[cA_fault, cD_fault] = dwt(x_fault, 'db4');
thresh_fault = thselect(cD_fault, 'sqtwolog');
cD_fault_thresh = wthresh(cD_fault, 's', thresh_fault);
x_fault_denoised = idwt(cA_fault, cD_fault_thresh, 'db4');
% 可视化去噪效果
figure;
subplot(2,1,1);
plot(t, x_normal, 'b', t, x_normal_denoised, 'r');
legend('原始信号', '去噪信号');
title('正常信号去噪效果');
xlim([0, 0.1]);
subplot(2,1,2);
plot(t, x_fault, 'b', t, x_fault_denoised, 'r');
legend('原始信号', '去噪信号');
title('故障信号去噪效果');
xlim([0, 0.1]);
3. 特征提取
(1) 时域特征
% ==================== 时域特征提取 ====================
features = @(x) [rms(x), % 均方根
peak2peak(x), % 峰峰值
kurtosis(x), % 峭度
skewness(x), % 偏度
crestfactor(x)]; % 峰值因子
% 计算正常信号特征
feat_normal = features(x_normal_denoised);
% 计算故障信号特征
feat_fault = features(x_fault_denoised);
% 显示特征
fprintf('正常信号时域特征:\n');
fprintf('RMS: %.4f, Peak2Peak: %.4f, Kurtosis: %.4f, Skewness: %.4f, CrestFactor: %.4f\n', feat_normal);
fprintf('\n故障信号时域特征:\n');
fprintf('RMS: %.4f, Peak2Peak: %.4f, Kurtosis: %.4f, Skewness: %.4f, CrestFactor: %.4f\n', feat_fault);
(2) 频域特征(FFT分析)
% ==================== 频域特征提取 ====================
NFFT = 2^nextpow2(N); % FFT点数
f = fs/2*linspace(0,1,NFFT/2+1); % 频率向量
% 正常信号频谱
Y_normal = fft(x_normal_denoised, NFFT)/N;
P_normal = 2*abs(Y_normal(1:NFFT/2+1));
% 故障信号频谱
Y_fault = fft(x_fault_denoised, NFFT)/N;
P_fault = 2*abs(Y_fault(1:NFFT/2+1));
% 计算特征频率处的幅值
[~, idx_out] = min(abs(f - f_out)); % 外圈故障特征频率索引
feature_freq_amplitude = [P_normal(idx_out), P_fault(idx_out)];
% 可视化频谱
figure;
subplot(2,1,1);
plot(f, P_normal);
title('正常信号频谱');
xlabel('频率(Hz)'); ylabel('幅值');
xlim([0, 500]);
subplot(2,1,2);
plot(f, P_fault);
hold on;
plot([f_out, f_out], [0, max(P_fault)], 'r--'); % 标记故障特征频率
title('故障信号频谱');
xlabel('频率(Hz)'); ylabel('幅值');
legend('频谱', '外圈故障特征频率');
xlim([0, 500]);
(3) 包络分析(解调)
% ==================== 包络分析 ====================
% 希尔伯特变换提取包络
env_normal = abs(hilbert(x_normal_denoised));
env_fault = abs(hilbert(x_fault_denoised));
% 包络谱分析
Y_env_normal = fft(env_normal, NFFT)/N;
P_env_normal = 2*abs(Y_env_normal(1:NFFT/2+1));
Y_env_fault = fft(env_fault, NFFT)/N;
P_env_fault = 2*abs(Y_env_fault(1:NFFT/2+1));
% 可视化包络谱
figure;
subplot(2,1,1);
plot(f, P_env_normal);
title('正常信号包络谱');
xlabel('频率(Hz)'); ylabel('幅值');
xlim([0, 500]);
subplot(2,1,2);
plot(f, P_env_fault);
hold on;
plot([f_out, f_out], [0, max(P_env_fault)], 'r--'); % 标记故障特征频率
title('故障信号包络谱');
xlabel('频率(Hz)'); ylabel('幅值');
legend('包络谱', '外圈故障特征频率');
xlim([0, 500]);
4. 故障诊断(模式识别)
(1) 特征矩阵构建
% ==================== 构建特征矩阵 ====================
% 生成更多样本(实际应用中应从实验获取)
num_samples = 50; % 每种状态样本数
% 正常样本特征
features_normal = zeros(num_samples, 6);
for i = 1:num_samples
% 添加随机噪声模拟不同工况
noise_level = 0.1 + 0.1*rand();
x = x_normal_denoised + noise_level*randn(1, N);
features_normal(i, 1:5) = features(x);
features_normal(i, 6) = feature_freq_amplitude(1) * (0.8 + 0.4*rand());
end
% 故障样本特征
features_fault = zeros(num_samples, 6);
for i = 1:num_samples
noise_level = 0.1 + 0.1*rand();
x = x_fault_denoised + noise_level*randn(1, N);
features_fault(i, 1:5) = features(x);
features_fault(i, 6) = feature_freq_amplitude(2) * (0.8 + 0.4*rand());
end
% 合并特征矩阵
features_all = [features_normal; features_fault];
labels = [zeros(num_samples, 1); ones(num_samples, 1)]; % 0=正常, 1=故障
(2) SVM分类器训练与测试
% ==================== SVM分类器 ====================
% 划分训练集和测试集
rng(42); % 设置随机种子
cv = cvpartition(size(features_all, 1), 'HoldOut', 0.3);
trainIdx = training(cv);
testIdx = test(cv);
X_train = features_all(trainIdx, :);
y_train = labels(trainIdx);
X_test = features_all(testIdx, :);
y_test = labels(testIdx);
% 训练SVM分类器
svm_model = fitcsvm(X_train, y_train, 'KernelFunction', 'rbf', 'BoxConstraint', 1);
% 测试分类器
y_pred = predict(svm_model, X_test);
% 计算准确率
accuracy = sum(y_pred == y_test) / numel(y_test);
conf_mat = confusionmat(y_test, y_pred);
fprintf('分类准确率: %.2f%%\n', accuracy*100);
disp('混淆矩阵:');
disp(conf_mat);
(3) 诊断结果可视化
% ==================== 可视化结果 ====================
% 特征空间可视化(前两维)
figure;
gscatter(features_all(:,1), features_all(:,2), labels);
hold on;
plot(svm_model.SupportVectors(:,1), svm_model.SupportVectors(:,2), 'ko', 'MarkerSize', 10, 'LineWidth', 2);
title('特征空间分布 (RMS vs 峰峰值)');
xlabel('均方根(RMS)');
ylabel('峰峰值');
legend('正常', '故障', '支持向量');
grid on;
% ROC曲线
[y_score, scores] = predict(svm_model, X_test);
[X_roc, Y_roc, T_roc, AUC] = perfcurve(y_test, scores(:,2), 1);
figure;
plot(X_roc, Y_roc, 'LineWidth', 2);
title(sprintf('ROC曲线 (AUC = %.2f)', AUC));
xlabel('假阳性率');
ylabel('真阳性率');
grid on;
三、实际应用与扩展
1. 真实数据采集建议
% ==================== 真实数据采集 ====================
% 使用加速度传感器采集振动信号
% 示例代码(需硬件支持):
%
% % 创建数据采集对象
% daqreset;
% s = daq.createSession('ni');
% addAnalogInputChannel(s, 'Dev1', 0, 'Voltage');
% s.Rate = fs;
% s.DurationInSeconds = T;
%
% % 采集正常轴承信号
% data_normal = s.startForeground();
%
% % 采集外圈故障轴承信号(人工模拟)
% data_fault = s.startForeground();
2. 高级特征提取方法
% ==================== 小波包能量特征 ====================
% 小波包分解
wpt = wpdec(x_fault_denoised, 4, 'db4');
% 计算各节点能量
nodes = [5, 6, 9, 10, 13, 14, 17, 18]; % 选择节点
energy = zeros(1, length(nodes));
for i = 1:length(nodes)
node_data = wprcoef(wpt, nodes(i));
energy(i) = sum(node_data.^2);
end
% 能量占比作为特征
energy_ratio = energy / sum(energy);
3. 深度学习诊断方法
% ==================== CNN故障诊断 ====================
% 构建CNN模型
layers = [
imageInputLayer([1 1024 1])
convolution2dLayer([1 64], 16, 'Padding', 'same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer([1 4], 'Stride', [1 4])
convolution2dLayer([1 32], 32, 'Padding', 'same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer([1 4], 'Stride', [1 4])
fullyConnectedLayer(64)
reluLayer
fullyConnectedLayer(2)
softmaxLayer
classificationLayer
];
% 训练选项
options = trainingOptions('adam', ...
'MaxEpochs', 30, ...
'MiniBatchSize', 32, ...
'ValidationData', {
X_val, y_val}, ...
'Plots', 'training-progress');
% 训练网络
net = trainNetwork(X_train, y_train, layers, options);
四、诊断结果分析与工程应用
1. 典型诊断结果
- 时域特征:故障信号峭度值显著高于正常信号(>3 vs <3)
- 频域特征:故障信号在外圈特征频率处有明显谱峰
- 包络分析:故障信号包络谱在特征频率处出现明显峰值
- 分类准确率:SVM分类器在模拟数据上可达95%以上准确率
2. 工程应用建议
- 传感器布置:在轴承座径向安装加速度传感器
- 采样参数:采样频率≥10倍最高分析频率(通常5-20kHz)
- 诊断流程: 实时采集振动信号 预处理(去噪、滤波) 特征提取(时域+频域+时频域) 模式识别(阈值判断/SVM/神经网络)
- 预警阈值: 峭度>5 → 潜在故障 特征频率幅值>3倍基线 → 明确故障
3. 扩展方向
- 复合故障诊断:同时识别内圈、外圈、滚动体故障
- 变工况诊断:考虑转速变化对特征频率的影响
- 迁移学习:利用预训练模型解决小样本问题
- 边缘计算:部署轻量级模型到嵌入式设备
参考代码 实现滚动轴承故障诊断 www.youwenfan.com/contentalg/83047.html
五、总结
本MATLAB实现展示了滚动轴承外圈故障诊断的完整流程:
- 信号模拟:生成正常和外圈故障振动信号
- 预处理:小波去噪提高信噪比
- 特征提取:时域(峭度、峰值因子)、频域(特征频率幅值)、时频域(包络谱)
- 故障识别:SVM分类器实现高精度诊断
通过调整轴承参数和故障严重程度,可模拟不同工况下的故障特征。实际应用中,建议使用凯斯西储大学轴承数据中心(CWRU Bearing Data Center)的真实数据验证算法性能。
注意:人工模拟信号仅用于算法验证,实际诊断需使用真实采集的振动信号。工业应用中建议结合温度、油液分析等多传感器信息进行综合诊断。