核心流程 “信号采集→预处理→特征提取→故障识别”,其中特征提取是连接原始信号与故障诊断的关键环节。
一、准备工作
1. 数据来源
使用西储大学轴承数据集(Case Western Reserve University Bearing Data),包含:
- 正常状态(Normal)、内圈故障(Inner Race Fault)、外圈故障(Outer Race Fault)、滚动体故障(Ball Fault)等10类状态;
- 采样频率:12kHz(主流)、48kHz(高频);
- 每种状态200个样本(1×1024长度)。
2. 工具包依赖
- MATLAB Signal Processing Toolbox(信号处理);
- MATLAB Deep Learning Toolbox(深度学习);
- Statistics and Machine Learning Toolbox(统计分析)。
二、核心步骤与MATLAB实现
1. 信号预处理
目的:去除噪声、趋势项,增强故障特征。
方法:小波去噪(Wavelet Denoising)+ 趋势项去除(Detrending)。
MATLAB代码:
function clean_signal = preprocess_signal(raw_signal)
% 小波去噪(使用db4小波,分解层数4)
wname = 'db4';
level = 4;
[c, l] = wavedec(raw_signal, level, wname);
% 阈值处理(软阈值)
thr = wdcbm2(c, l, 'sqtwolog');
sorh = 's'; % 软阈值
keepapp = 0; % 不保留近似分量
denoised_signal = wdencmp('lvd', c, l, wname, thr, sorh, keepapp);
% 去除趋势项(多项式拟合,阶数2)
x = 1:length(denoised_signal);
p = polyfit(x, denoised_signal, 2);
trend = polyval(p, x);
clean_signal = denoised_signal - trend;
end
2. 特征提取
特征提取是滚动轴承故障诊断的核心,需结合时域、频域、时频域特征,全面反映故障信息。
(1)时域特征
时域特征反映信号的幅值分布和时间相关性,适用于早期故障检测。
常见时域特征:均方根(RMS)、峰值(Peak)、峰峰值(Peak-to-Peak)、峭度(Kurtosis)、偏度(Skewness)、脉冲因子(Pulse Factor)。
MATLAB代码:
function time_features = extract_time_features(signal)
% 均方根(RMS)
time_features.rms = rms(signal);
% 峰值(Peak)
time_features.peak = max(abs(signal));
% 峰峰值(Peak-to-Peak)
time_features.peak_to_peak = max(signal) - min(signal);
% 峭度(Kurtosis)
time_features.kurtosis = kurtosis(signal);
% 偏度(Skewness)
time_features.skewness = skewness(signal);
% 脉冲因子(Pulse Factor)
time_features.pulse_factor = time_features.peak / time_features.rms;
end
(2)频域特征
频域特征反映信号的频率分布,是滚动轴承故障诊断的核心依据(故障特征频率可通过频域分析识别)。
常见频域特征:重心频率(Spectral Centroid)、均方频率(Mean Square Frequency)、频率方差(Frequency Variance)、频谱峭度(Spectral Kurtosis)、频带能量(Band Energy)。
MATLAB代码:
function freq_features = extract_freq_features(signal, fs)
% 计算FFT
N = length(signal);
fft_data = fft(signal);
fft_mag = abs(fft_data(1:floor(N/2)+1)); % 归一化前幅值
fft_mag_norm = fft_mag / max(fft_mag); % 归一化
% 频率轴
freq_axis = (0:floor(N/2)) * fs / N;
% 计算功率谱密度(PSD)
[psd, freq_psd] = pwelch(signal, hanning(256), 128, 256, fs);
% 1. 重心频率(Spectral Centroid)
freq_features.centroid = sum(freq_axis .* fft_mag_norm) / sum(fft_mag_norm);
% 2. 均方频率(Mean Square Frequency)
freq_features.ms_freq = sum(freq_axis.^2 .* fft_mag_norm) / sum(fft_mag_norm);
% 3. 频率方差(Frequency Variance)
freq_features.var_freq = sum((freq_axis - freq_features.centroid).^2 .* fft_mag_norm) / sum(fft_mag_norm);
% 4. 频谱峭度(Spectral Kurtosis)
pdf = fft_mag_norm / sum(fft_mag_norm); % 概率密度函数
freq_features.skew_freq = sum((freq_axis - freq_features.centroid).^3 .* pdf) / (freq_features.var_freq^(3/2));
freq_features.kurt_freq = sum((freq_axis - freq_features.centroid).^4 .* pdf) / (freq_features.var_freq^2);
% 5. 频带能量(Band Energy):分为5个频带(0-10%、10-20%、…、40-50%)
bands = [0, 0.1*fs/2; 0.1*fs/2, 0.2*fs/2; 0.2*fs/2, 0.3*fs/2; 0.3*fs/2, 0.4*fs/2; 0.4*fs/2, 0.5*fs/2];
for i = 1:size(bands, 1)
band_mask = (freq_axis >= bands(i,1)) & (freq_axis <= bands(i,2));
freq_features.(['band_energy_', num2str(i)]) = sum(fft_mag_norm(band_mask));
end
end
(3)时频域特征
滚动轴承故障信号多为非平稳信号(如冲击故障),时频域特征(如小波包能量、希尔伯特黄变换)能同时反映信号的时间和频率信息,更适用于非平稳信号分析。
常见时频域特征:小波包能量(Wavelet Packet Energy)、希尔伯特黄变换(HHT)边际谱。
MATLAB代码(小波包能量):
function wt_features = extract_wt_features(signal, fs)
% 小波包分解(使用db4小波,分解层数4)
wname = 'db4';
level = 4;
[wt, ~] = wpdec(signal, level, wname);
% 计算各节点能量
energy = zeros(1, 2^level);
for i = 0:2^level - 1
node_coef = wpcoef(wt, i);
energy(i+1) = sum(node_coef.^2);
end
% 归一化能量
wt_features.normalized_energy = energy / sum(energy);
% 提取能量熵(Energy Entropy)
prob = wt_features.normalized_energy / sum(wt_features.normalized_energy);
wt_features.energy_entropy = -sum(prob .* log2(prob + eps));
end
(4)故障特征频率计算
滚动轴承的故障特征频率是其故障诊断的关键标识,可通过轴承参数计算(如内圈、外圈、滚动体故障频率)。
计算公式(以深沟球轴承为例):
- 内圈故障频率:$f_{BPFI}=\frac{n}{60}⋅f_r⋅(1+\frac{d}{D}cosϕ)$
- 外圈故障频率:$f_{BPFO}=\frac{n}{60}⋅f_r⋅(1+\frac{d}{D}cosϕ)$
- 滚动体故障频率:$f_{BSF}=\frac{D}{2d}⋅f_r⋅(1−(\frac{d}{D}cosϕ)^2)$
- 保持架故障频率:$f_{FTF}=\frac{1}{2}⋅f_r⋅(1−\frac{d}{D}cosϕ)$
参数说明:
- n:滚动体数量;
- $f_r$:轴旋转频率($H_z,f_r=\frac{rpm}{60}$);
- d:滚动体直径(mm);
- D:轴承节径(mm);
- ϕ:接触角(°)。
MATLAB代码:
function fault_freq = calculate_fault_frequency(n, rpm, d, D, phi)
% 轴旋转频率(Hz)
fr = rpm / 60;
% 内圈故障频率(BPFI)
bpfi = fr * (1 + (d/D) * cosd(phi)) / 2;
% 外圈故障频率(BPFO)
bpfo = fr * (1 - (d/D) * cosd(phi)) / 2;
% 滚动体故障频率(BSF)
bsf = (D/(2*d)) * fr * (1 - (d/D * cosd(phi))^2);
% 保持架故障频率(FTF)
ftf = fr * (1 - (d/D) * cosd(phi)) / 2;
% 返回故障特征频率
fault_freq = struct('bpfi', bpfi, 'bpfo', bpfo, 'bsf', bsf, 'ftf', ftf);
end
3. 故障识别
目的:通过提取的特征,识别轴承的故障类型(如正常、内圈故障、外圈故障等)。
方法:支持向量机(SVM)(适用于小样本、高维数据)或卷积神经网络(CNN)(适用于时频域特征)。
(1)SVM分类
MATLAB代码:
function svm_model = train_svm(features, labels)
% 特征归一化(Z-score)
features_normalized = zscore(features);
% 划分训练集与测试集(7:3)
rng(42); % 固定随机种子,保证结果可重复
cv = cvpartition(size(features_normalized, 1), 'HoldOut', 0.3);
train_features = features_normalized(training(cv), :);
train_labels = labels(training(cv), :);
test_features = features_normalized(test(cv), :);
test_labels = labels(test(cv), :);
% 训练SVM模型(使用RBF核)
svm_model = fitcsvm(train_features, train_labels, 'KernelFunction', 'rbf', 'BoxConstraint', 1, 'KernelScale', 'auto');
% 测试模型
predictions = predict(svm_model, test_features);
accuracy = sum(predictions == test_labels) / length(test_labels);
disp(['SVM分类准确率:', num2str(accuracy * 100), '%']);
end
(2)CNN分类
MATLAB代码(使用1DCNN处理时频域特征):
function cnn_model = train_cnn(features, labels)
% 特征归一化(Z-score)
features_normalized = zscore(features);
% 划分训练集与测试集(7:3)
rng(42);
cv = cvpartition(size(features_normalized, 1), 'HoldOut', 0.3);
train_features = features_normalized(training(cv), :);
train_labels = categorical(labels(training(cv), :));
test_features = features_normalized(test(cv), :);
test_labels = categorical(labels(test(cv), :));
% 定义1DCNN模型
layers = [
sequenceInputLayer(size(train_features, 2)) % 输入层(特征维度)
convolution1dLayer(32, 5, 'Padding', 'same') % 卷积层(32个滤波器,核大小5)
batchNormalizationLayer() % 批量归一化
reluLayer() % ReLU激活
maxPooling1dLayer(2, 'Stride', 2) % 最大池化
convolution1dLayer(64, 3, 'Padding', 'same') % 卷积层(64个滤波器,核大小3)
batchNormalizationLayer()
reluLayer()
maxPooling1dLayer(2, 'Stride', 2)
fullyConnectedLayer(numel(categories(train_labels))) % 全连接层(输出类别数)
softmaxLayer() % Softmax层
classificationLayer() % 分类层
];
% 训练选项
options = trainingOptions('adam', ...
'MaxEpochs', 50, ...
'MiniBatchSize', 32, ...
'ValidationData', {
test_features, test_labels}, ...
'Plots', 'training-progress', ...
'Verbose', 1);
% 训练CNN模型
cnn_model = trainNetwork(train_features, train_labels, layers, options);
end
三、完整流程示例
1. 加载数据
% 加载西储大学轴承数据(示例:内圈故障)
load('bearing_IR_fault.mat'); % 数据包含:vibration(振动信号)、rpm(转速)、d(滚动体直径)、D(节径)、phi(接触角)、n(滚动体数量)
2. 预处理信号
clean_signal = preprocess_signal(vibration);
3. 提取特征
% 时域特征
time_features = extract_time_features(clean_signal);
% 频域特征
freq_features = extract_freq_features(clean_signal, 12000); % 采样频率12kHz
% 时频域特征(小波包能量)
wt_features = extract_wt_features(clean_signal, 12000);
% 合并特征
features = [time_features, freq_features, wt_features];
% 计算故障特征频率
fault_freq = calculate_fault_frequency(n, rpm, d, D, phi);
4. 训练SVM模型
% 假设labels为故障类型(1=正常,2=内圈故障,3=外圈故障,4=滚动体故障)
svm_model = train_svm(features, labels);
5. 测试模型
% 输入测试样本(如内圈故障样本)
test_signal = ...; % 测试信号
test_clean = preprocess_signal(test_signal);
test_time = extract_time_features(test_clean);
test_freq = extract_freq_features(test_clean, 12000);
test_wt = extract_wt_features(test_clean, 12000);
test_features = [test_time, test_freq, test_wt];
prediction = predict(svm_model, test_features);
disp(['测试样本故障类型:', num2str(prediction)]);
四、性能优化技巧
- 特征选择:使用拉普拉斯分值(Laplacian Score)或ReliefF算法筛选关键特征,减少特征维度(如从20维筛选到10维),提升模型训练速度。
- 数据增强:对训练数据进行加噪、时间平移、幅度缩放等增强,提高模型泛化能力。
- 模型融合:使用集成学习(如随机森林、AdaBoost)融合多个模型(如SVM、CNN),提升分类准确率。
参考代码 matlab提取滚动轴承故障特征 www.youwenfan.com/contentalg/44821.html
五、注意事项
- 数据质量:确保采集的振动信号无噪声干扰(可使用硬件滤波器或软件去噪)。
- 参数调整:根据轴承类型(如深沟球轴承、圆锥滚子轴承)调整故障特征频率计算参数(如n、d、D、ϕ)。
- 实时性:若需实时诊断,可使用轻量级模型(如SVM)或模型量化(如TensorFlow Lite),减少计算时间。
六、扩展应用
- 多故障诊断:支持同时诊断多种故障(如内圈+滚动体故障),只需扩展标签集。
- 变工况诊断:使用迁移学习(如Domain Adaptation),将实验室数据迁移至工业现场(变工况)进行诊断。
- 智能预警:结合异常检测(如One-Class SVM),实现轴承故障的早期预警(如故障萌芽阶段)。
总结
MATLAB滚动轴承故障诊断的核心是特征提取(时域、频域、时频域)和智能分类(SVM、CNN)。通过上述流程,可实现高精度、高鲁棒性的轴承故障诊断,适用于工业设备健康管理(如风电、冶金、汽车)。