实现MATLAB滚动轴承故障诊断

核心流程 "信号采集→预处理→特征提取→故障识别 ",其中特征提取是连接原始信号与故障诊断的关键环节。

一、准备工作

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代码

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代码

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代码

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代码(小波包能量)

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)故障特征频率计算

滚动轴承的故障特征频率 是其故障诊断的关键标识,可通过轴承参数计算(如内圈、外圈、滚动体故障频率)。

计算公式(以深沟球轴承为例):

  • 内圈故障频率:fBPFI=n60⋅fr⋅(1+dDcosϕ)f_{BPFI}=\frac{n}{60}⋅f_r⋅(1+\frac{d}{D}cosϕ)fBPFI=60n⋅fr⋅(1+Ddcosϕ)
  • 外圈故障频率:fBPFO=n60⋅fr⋅(1+dDcosϕ)f_{BPFO}=\frac{n}{60}⋅f_r⋅(1+\frac{d}{D}cosϕ)fBPFO=60n⋅fr⋅(1+Ddcosϕ)
  • 滚动体故障频率:fBSF=D2d⋅fr⋅(1−(dDcosϕ)2)f_{BSF}=\frac{D}{2d}⋅f_r⋅(1−(\frac{d}{D}cosϕ)^2)fBSF=2dD⋅fr⋅(1−(Ddcosϕ)2)
  • 保持架故障频率:fFTF=12⋅fr⋅(1−dDcosϕ)f_{FTF}=\frac{1}{2}⋅f_r⋅(1−\frac{d}{D}cosϕ)fFTF=21⋅fr⋅(1−Ddcosϕ)

参数说明

  • nnn:滚动体数量;
  • frf_rfr:轴旋转频率(Hz,fr=rpm60H_z,f_r=\frac{rpm}{60}Hz,fr=60rpm);
  • ddd:滚动体直径(mmmmmm);
  • DDD:轴承节径(mmmmmm);
  • ϕϕϕ:接触角(°°°)。

MATLAB代码

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代码

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处理时频域特征):

matlab 复制代码
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. 加载数据

matlab 复制代码
% 加载西储大学轴承数据(示例:内圈故障)
load('bearing_IR_fault.mat'); % 数据包含:vibration(振动信号)、rpm(转速)、d(滚动体直径)、D(节径)、phi(接触角)、n(滚动体数量)

2. 预处理信号

matlab 复制代码
clean_signal = preprocess_signal(vibration);

3. 提取特征

matlab 复制代码
% 时域特征
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模型

matlab 复制代码
% 假设labels为故障类型(1=正常,2=内圈故障,3=外圈故障,4=滚动体故障)
svm_model = train_svm(features, labels);

5. 测试模型

matlab 复制代码
% 输入测试样本(如内圈故障样本)
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)]);

四、性能优化技巧

  1. 特征选择 :使用拉普拉斯分值(Laplacian Score)ReliefF算法筛选关键特征,减少特征维度(如从20维筛选到10维),提升模型训练速度。
  2. 数据增强 :对训练数据进行加噪时间平移幅度缩放等增强,提高模型泛化能力。
  3. 模型融合:使用**集成学习(如随机森林、AdaBoost)**融合多个模型(如SVM、CNN),提升分类准确率。

参考代码 matlab提取滚动轴承故障特征 www.youwenfan.com/contentcsv/44821.html

五、注意事项

  1. 数据质量:确保采集的振动信号无噪声干扰(可使用硬件滤波器或软件去噪)。
  2. 参数调整:根据轴承类型(如深沟球轴承、圆锥滚子轴承)调整故障特征频率计算参数(如n、d、D、ϕ)。
  3. 实时性 :若需实时诊断,可使用轻量级模型(如SVM)模型量化(如TensorFlow Lite),减少计算时间。

六、扩展应用

  • 多故障诊断:支持同时诊断多种故障(如内圈+滚动体故障),只需扩展标签集。
  • 变工况诊断 :使用迁移学习(如Domain Adaptation),将实验室数据迁移至工业现场(变工况)进行诊断。
  • 智能预警 :结合异常检测(如One-Class SVM),实现轴承故障的早期预警(如故障萌芽阶段)。

总结

MATLAB滚动轴承故障诊断的核心是特征提取 (时域、频域、时频域)和智能分类 (SVM、CNN)。通过上述流程,可实现高精度、高鲁棒性的轴承故障诊断,适用于工业设备健康管理(如风电、冶金、汽车)。

相关推荐
gihigo199814 小时前
matlab实现三维四面体单元的有限元解法
开发语言·matlab
fengfuyao98514 小时前
Chen混沌系统 — 基于自适应控制的MATLAB仿真实现
开发语言·机器学习·matlab
chao18984414 小时前
基于压缩感知的SAR图像处理MATLAB实现方案
图像处理·人工智能·matlab
yong999014 小时前
MATLAB的卷积码的编码和译码的实现
开发语言·matlab
hoiii18715 小时前
matlab基础贝叶斯变换的压缩感知
算法·机器学习·matlab
不会C语言的男孩15 小时前
C++ Primer Plus 第2章:开始学习C++
开发语言·c++
鹏晨互联15 小时前
《Kotlin高阶函数完全指南:从入门到精通的15个核心函数》
android·开发语言·kotlin
c2385615 小时前
MySrting的模拟实现
开发语言·c++·算法
Rabitebla15 小时前
C++ 继承详解(下):默认成员函数、虚继承底层与设计取舍
c语言·开发语言·数据结构·c++·算法·leetcode