MATLAB实现滚动轴承故障诊断(外圈故障)

简介: MATLAB实现滚动轴承故障诊断(外圈故障)

一、滚动轴承故障诊断原理

滚动轴承故障诊断是通过分析振动信号来识别轴承运行状态的技术。当轴承出现故障时,会产生周期性冲击信号,其特征频率与故障类型和轴承几何参数相关。

1. 外圈故障特征频率

外圈故障特征频率公式:

$f_{out}=\frac{n}{2}(1−\frac{d}{D}cosα)f_r$

其中:

  • n:滚动体数量
  • d:滚动体直径
  • D:节圆直径
  • α:接触角
  • $f_r$:轴旋转频率

2. 诊断流程

  1. 信号采集:获取轴承振动信号
  2. 预处理:去噪、滤波
  3. 特征提取:时域、频域、时频域特征
  4. 故障识别:模式分类(正常/外圈故障)

二、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. 工程应用建议

  1. 传感器布置:在轴承座径向安装加速度传感器
  2. 采样参数:采样频率≥10倍最高分析频率(通常5-20kHz)
  3. 诊断流程: 实时采集振动信号 预处理(去噪、滤波) 特征提取(时域+频域+时频域) 模式识别(阈值判断/SVM/神经网络)
  4. 预警阈值: 峭度>5 → 潜在故障 特征频率幅值>3倍基线 → 明确故障

3. 扩展方向

  • 复合故障诊断:同时识别内圈、外圈、滚动体故障
  • 变工况诊断:考虑转速变化对特征频率的影响
  • 迁移学习:利用预训练模型解决小样本问题
  • 边缘计算:部署轻量级模型到嵌入式设备

参考代码 实现滚动轴承故障诊断 www.youwenfan.com/contentalg/83047.html

五、总结

本MATLAB实现展示了滚动轴承外圈故障诊断的完整流程:

  1. 信号模拟:生成正常和外圈故障振动信号
  2. 预处理:小波去噪提高信噪比
  3. 特征提取:时域(峭度、峰值因子)、频域(特征频率幅值)、时频域(包络谱)
  4. 故障识别:SVM分类器实现高精度诊断

通过调整轴承参数和故障严重程度,可模拟不同工况下的故障特征。实际应用中,建议使用凯斯西储大学轴承数据中心(CWRU Bearing Data Center)的真实数据验证算法性能。

注意:人工模拟信号仅用于算法验证,实际诊断需使用真实采集的振动信号。工业应用中建议结合温度、油液分析等多传感器信息进行综合诊断。

相关文章
|
15天前
|
算法 安全 量子技术
量子来了,RSA要凉?聊聊后量子加密的未来与现实(含代码!)
量子来了,RSA要凉?聊聊后量子加密的未来与现实(含代码!)
106 11
|
1月前
|
运维 监控 数据可视化
故障发现提速 80%,运维成本降 40%:魔方文娱的可观测升级之路
魔方文娱携手阿里云构建全栈可观测体系,实现故障发现效率提升 80%、运维成本下降 40%,并融合 AI 驱动异常检测,迈向智能运维新阶段。
300 35
|
21天前
|
人工智能 数据挖掘 BI
被格式折磨的日子,终于有AI懂我了
被格式折磨的日子,终于有AI懂我了
|
15天前
|
存储 自然语言处理 JavaScript
TypeWords:让英语学习更高效的打字练习神器
TypeWords是一款开源英语学习工具,将打字与背单词、文章背诵结合,通过智能记忆曲线和多种练习模式,让英语学习更高效有趣。支持在线使用或本地部署,已获5.9k GitHub星标。
304 161
TypeWords:让英语学习更高效的打字练习神器
|
15天前
|
存储 PyTorch 算法框架/工具
PyTorch推理扩展实战:用Ray Data轻松实现多机多卡并行
单机PyTorch推理难以应对海量数据,内存、GPU利用率、I/O成瓶颈。Ray Data提供轻量方案,仅需微调代码,即可将原有推理逻辑无缝扩展至分布式,支持自动批处理、多机并行、容错与云存储集成,大幅提升吞吐效率,轻松应对百万级图像处理。
84 13
PyTorch推理扩展实战:用Ray Data轻松实现多机多卡并行
|
26天前
|
存储 SQL 分布式计算
手把手教你搞定大数据上云:数据迁移的全流程解析
本文深入探讨了企业数据迁移的核心价值与复杂挑战,重点分析了离线大数据平台在物理传输、系统耦合与数据校验三方面的难题。文章系统阐述了存储格式、表格式、计算引擎等关键技术原理,并结合LHM等工具介绍了自动化迁移的实践演进,展望了未来智能化、闭环化的数据流动方向。
424 14
手把手教你搞定大数据上云:数据迁移的全流程解析
|
15天前
|
弹性计算 搜索推荐 应用服务中间件
阿里云服务器收费标准_云服务器ECS价格表_轻量优惠活动
阿里云服务器优惠汇总:轻量应用服务器200M带宽38元起/年,ECS云服务器2核2G 99元/年,2核4G 199元/年,4核16G 89元/月,8核32G 160元/月,香港轻量服务器25元/月起,支持按小时计费,新老用户同享,续费同价,限时秒杀低至1折。
158 18
|
15天前
|
人工智能 缓存 算法
为什么你学了那么多算法,代码性能还是“一塌糊涂”?
本文针对开发者普遍存在的“学了算法却写不出高性能代码”的痛点,提供了一套系统化的“算法优化AI指令”。该指令旨在引导开发者建立“分析-设计-验证”的工程化思维,通过结构化的提问框架,让AI成为辅助性能优化的“私人教练”,从而将零散的算法知识转化为体系化的实战能力。
150 7
|
18天前
|
Kubernetes Cloud Native Nacos
MCP 网关实战:基于 Higress + Nacos 的零代码工具扩展方案
本文介绍一种基于开源 Higress 与 Nacos 的私有化 MCP 智能体网关架构,实现工具动态注册、Prompt 实时更新、多租户安全隔离,并支持在无外网、无 Helm 的生产环境中一键部署。
225 25
MCP 网关实战:基于 Higress + Nacos 的零代码工具扩展方案
|
12天前
|
人工智能 运维 Serverless
一杯咖啡成本搞定多模态微调:FC DevPod + Llama-Factory 极速实战
告别显存不足、环境配置难、成本高昂的微调困境!基于阿里云函数计算FC与Llama-Factory,5分钟搭建微调流水线,一键完成多模态模型的微调。
171 18
下一篇