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

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:3rng(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:3rng(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个滤波器,核大小5batchNormalizationLayer() % 批量归一化
        reluLayer() % ReLU激活
        maxPooling1dLayer(2, 'Stride', 2) % 最大池化
        convolution1dLayer(64, 3, 'Padding', 'same') % 卷积层(64个滤波器,核大小3batchNormalizationLayer()
        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)]);

四、性能优化技巧

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

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

五、注意事项

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

六、扩展应用

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

总结

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

相关文章
|
14天前
|
人工智能 前端开发 搜索推荐
AI聊天居然有17种姿势?提示工程师的武功秘籍大公开
想让ChatGPT更听话?别只会说'请帮我...'了!从零样本到思维树,从检索增强到自动推理,17种提示工程技术让你的AI助手从'憨憨'变'大神'。掌握这些技巧,告别低效对话,让AI真正为你所用!#人工智能 #提示工程 #ChatGPT #大模型
143 11
|
24天前
|
机器学习/深度学习 运维 Cloud Native
别再拍脑袋扩容了:用 ML 做容量预测,才是云成本和性能的最优解
别再拍脑袋扩容了:用 ML 做容量预测,才是云成本和性能的最优解
117 17
|
24天前
|
存储 弹性计算 固态存储
阿里云服务器租用价格:实例配置、带宽、云盘收费标准与云服务器活动价格参考
对于初次选购阿里云服务器的用户而言,云服务器的收费标准与活动价格是大家最为关注的问题,而在实际选购中,通常都是选择2核4G、4核8G、8核16G,2核8G、4核16G、8核32G,2核16G、4核32G、8核64G这些热门配置。本文为大家整理了阿里云服务器的收费模式,实例与配置收费标准,带宽与云盘收费标准,以及2核4G、4核8G、2核8G、4核16G、8核32G,2核16G等热门配置当下活动价格情况,以供大家参考。
226 20
|
24天前
|
运维 监控 数据挖掘
运维数据分析:别再只会翻日志了,真正的价值在“洞察”
运维数据分析:别再只会翻日志了,真正的价值在“洞察”
107 16
|
21天前
|
敏捷开发 测试技术 持续交付
微服务技术栈
单元测试是保障代码质量的基石。它快速、稳定,能精准定位问题,提升代码可维护性与团队协作效率。通过“测试金字塔”模型,单元测试作为底层支撑,占比应达80%。相比端到端测试,它显著降低维护成本,助力持续交付。写单测不是踩刹车,而是为软件研发提速。
71 9
|
9天前
|
人工智能 开发框架 机器人
宝塔部署AstrBot及Napcat防踩坑教程
本教程详述了在宝塔面板11上,通过Docker容器部署AstrBot与Napcat,实现QQ机器人接入AI的全过程。内容涵盖环境搭建、关键配置(如容器网络互通、WebSocket连接及平台适配器设置)等。
宝塔部署AstrBot及Napcat防踩坑教程
|
25天前
|
测试技术 芯片 C++
Python 安装
本文介绍Windows下安装Python 3.14.2的方法,包括版本选择、自定义安装选项、环境变量配置及安装验证,帮助用户快速搭建Python环境。
401 8
Python 安装
|
14天前
|
存储 弹性计算 缓存
阿里云服务器型u1实例2核4G5M80G云盘199元1年简单测评:看看是否值得选择?
目前,阿里云服务器2核4G配置价格最低的是一款199元一年的云服务器,目前活动中推出了一款极具吸引力的通用算力型u1实例云服务器,配置为2核4G、5M带宽、80G ESSD Entry云盘,活动优惠价仅为199元/年。而且续费价格不变,这一价格相较于日常价有着非常大的优惠,那么,这款云服务器究竟是否值得选择呢?本文从价格、续费、实例性能等多个方面为大家分析,以供选择参考。
105 12
|
16天前
|
数据采集 机器学习/深度学习 人工智能
AI编程正在"腐烂",而解决方案在40年前就存在了
文章探讨了AI编程中"上下文腐烂"的问题,分析了三大根源(注意力衰减、代码异味传播、沟通问题),提出用Unix管道架构作为解决方案,通过进程隔离、标准IO和组合能力来构建AI友好的编程范式。
82 13
|
21天前
|
SQL Java 关系型数据库
二、Hive安装部署详细过程
手把手教你完成 Hive 的安装、配置和可视化连接,适合初学者快速搭建自己的大数据分析平台。内容涵盖从环境准备、Metastore配置,到 DataGrip 连接的全流程,并附带实用的排错指南,助你轻松迈出 Hive 入门第一步。
262 14

热门文章

最新文章