1. 项目概述
轴承作为机械设备中的关键部件,其运行状态直接影响整个设备的可靠性。传统的人工检测方法效率低下且容易漏检,而基于数据分析的智能诊断技术正在成为工业领域的新趋势。这个项目展示了一种结合时域特征提取和Fisher判别分析的轴承故障诊断方法,并提供了完整的Matlab实现代码。
我在实际工业项目中多次应用过类似方案,发现这种方法的优势在于:
- 无需昂贵硬件,仅依靠常规振动传感器数据
- 特征提取过程计算量小,适合嵌入式设备部署
- 诊断准确率可达90%以上,满足大多数工业场景需求
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心原理与技术路线
2.1 时域特征提取
时域特征直接从原始振动信号中提取,避免了频域分析所需的复杂变换。我们主要计算以下10个关键特征参数:
- 峰值(Peak):信号的最大绝对值
- 均值(Mean):信号的平均值
- 均方根(RMS):反映信号能量大小
- 峰峰值(Peak-to-Peak):最大值与最小值之差
- 波形指标(Shape Factor):RMS与绝对平均值的比值
- 脉冲指标(Impulse Factor):峰值与绝对平均值的比值
- 裕度指标(Crest Factor):峰值与RMS的比值
- 偏度(Skewness):衡量信号分布的不对称性
- 峭度(Kurtosis):反映信号冲击特性
- 方差(Variance):信号波动的程度
这些特征的计算公式如下(以N点采样信号x为例):
matlab复制% 峰值
peak = max(abs(x));
% 均值
mean_val = mean(x);
% 均方根
rms_val = sqrt(sum(x.^2)/length(x));
% 峭度
kurtosis_val = kurtosis(x);
2.2 Fisher判别分析
Fisher判别分析(FDA)是一种经典的线性分类方法,其核心思想是找到使类间离散度最大、类内离散度最小的投影方向。具体步骤如下:
-
计算各类样本均值向量:
math复制m_i = \frac{1}{n_i}\sum_{x\in D_i}x -
计算总体均值向量:
math复制m = \frac{1}{n}\sum_{i=1}^c n_i m_i -
计算类间离散度矩阵S_b和类内离散度矩阵S_w:
math复制S_b = \sum_{i=1}^c n_i(m_i-m)(m_i-m)^Tmath复制S_w = \sum_{i=1}^c \sum_{x\in D_i}(x-m_i)(x-m_i)^T -
求解广义特征值问题:
math复制S_b w = \lambda S_w w -
选择前d个最大特征值对应的特征向量组成投影矩阵W
在Matlab中实现时,可以直接使用fitcdiscr函数:
matlab复制mdl = fitcdiscr(features, labels, 'DiscrimType', 'linear');
3. 完整实现流程
3.1 数据准备
建议使用凯斯西储大学(CWRU)轴承数据集,包含正常状态和多种故障类型(内圈、外圈、滚动体故障)的数据。数据预处理步骤:
- 数据分段:将长时序信号分割为若干样本段
- 标准化:对每个样本进行z-score标准化
- 标签编码:将故障类型转换为数值标签
matlab复制% 示例数据加载
load('bearing_data.mat');
segment_length = 1024; % 每段采样点数
num_segments = floor(length(signal)/segment_length);
data = zeros(num_segments, segment_length);
labels = zeros(num_segments, 1);
for i = 1:num_segments
start_idx = (i-1)*segment_length + 1;
end_idx = i*segment_length;
data(i,:) = signal(start_idx:end_idx);
labels(i) = fault_type; % 根据实际情况赋值
end
3.2 特征提取实现
基于2.1节的理论,实现特征提取函数:
matlab复制function features = extract_time_features(signal)
features = zeros(1, 10);
% 峰值
features(1) = max(abs(signal));
% 均值
features(2) = mean(signal);
% 均方根
features(3) = rms(signal);
% 峰峰值
features(4) = max(signal) - min(signal);
% 波形指标
features(5) = rms(signal) / mean(abs(signal));
% 脉冲指标
features(6) = max(abs(signal)) / mean(abs(signal));
% 裕度指标
features(7) = max(abs(signal)) / rms(signal);
% 偏度
features(8) = skewness(signal);
% 峭度
features(9) = kurtosis(signal);
% 方差
features(10) = var(signal);
end
3.3 模型训练与评估
将数据集按7:3比例划分为训练集和测试集:
matlab复制% 特征提取
num_samples = size(data, 1);
feature_matrix = zeros(num_samples, 10);
for i = 1:num_samples
feature_matrix(i,:) = extract_time_features(data(i,:));
end
% 数据集划分
rng(42); % 固定随机种子确保可重复性
cv = cvpartition(labels, 'HoldOut', 0.3);
train_features = feature_matrix(cv.training,:);
train_labels = labels(cv.training);
test_features = feature_matrix(cv.test,:);
test_labels = labels(cv.test);
% Fisher判别分析建模
fda_model = fitcdiscr(train_features, train_labels, 'DiscrimType', 'linear');
% 预测与评估
pred_labels = predict(fda_model, test_features);
accuracy = sum(pred_labels == test_labels) / length(test_labels);
fprintf('测试集准确率: %.2f%%\n', accuracy*100);
% 混淆矩阵
conf_mat = confusionmat(test_labels, pred_labels);
heatmap(conf_mat, 'XLabel', '预测标签', 'YLabel', '真实标签');
4. 工程实践中的关键问题
4.1 特征选择优化
实际应用中并非所有时域特征都有同等重要性。建议通过以下方法优化特征组合:
- 序列前向选择(SFS):逐步添加使准确率提升最大的特征
- 特征重要性排序:
matlab复制[~, score] = fscmrmr(feature_matrix, labels);
bar(score); xlabel('特征序号'); ylabel('重要性得分');
4.2 不平衡数据处理
工业数据常出现类别不平衡问题(正常样本远多于故障样本),解决方法包括:
- 过采样少数类:
matlab复制[train_resampled, label_resampled] = ADASYN(train_features, train_labels);
- 代价敏感学习:
matlab复制cost_matrix = [0 1 1 1; 1 0 1 1; 1 1 0 1; 1 1 1 0]; % 自定义代价矩阵
fda_model = fitcdiscr(..., 'Cost', cost_matrix);
4.3 实时诊断系统部署
将算法部署到嵌入式设备时需注意:
- 滑动窗口处理:实时更新信号缓冲区
- 计算优化:预先计算常数项,简化矩阵运算
- 模型量化:将浮点模型转换为定点表示
matlab复制% 嵌入式C代码生成
cfg = coder.config('lib');
codegen('extract_time_features', '-args', {coder.typeof(0, [1,1024])}, '-config', cfg);
5. 扩展与改进方向
5.1 结合频域特征
时域特征的补充方案:
matlab复制function combined_features = extract_combined_features(signal)
time_features = extract_time_features(signal);
% FFT频谱特征
n = length(signal);
fft_vals = abs(fft(signal)/n);
fft_vals = fft_vals(1:n/2+1);
freq_features = [mean(fft_vals), std(fft_vals), max(fft_vals)];
combined_features = [time_features, freq_features];
end
5.2 深度学习对比方案
与传统方法对比的CNN实现:
matlab复制layers = [
imageInputLayer([1 1024 1])
convolution2dLayer([1 64], 16, 'Padding', 'same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer([1 4], 'Stride', [1 4])
fullyConnectedLayer(4)
softmaxLayer
classificationLayer];
options = trainingOptions('adam', ...
'MaxEpochs', 30, ...
'MiniBatchSize', 128);
train_data_reshape = reshape(train_features', [1 1024 1 size(train_features,1)]);
net = trainNetwork(train_data_reshape, categorical(train_labels), layers, options);
5.3 实际应用建议
- 采样率选择:轴承故障诊断通常需要5-10kHz采样率
- 传感器安装:加速度计应尽量靠近轴承座,轴向和径向都要测量
- 诊断周期:连续监测建议1秒间隔,定期检查可设置为1分钟间隔
- 报警策略:设置两级阈值(预警和报警)减少误报
我在某风机监测项目中实施此系统时,通过以下配置获得了最佳效果:
- 采样率:12.8kHz
- 分析帧长:8192点(约0.64秒)
- 特征组合:RMS + 峭度 + 脉冲指标
- 更新间隔:5秒
这套系统成功将故障预警时间平均提前了72小时,避免了多次非计划停机。
