尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
MATLAB振动故障诊断:从频谱分析到特征频率识别
简介面向设备健康监测与故障预测场景的MATLAB振动故障诊断源码包适合机械工程、自动化及故障诊断方向的学生与工程师学习也可作为课程设计或毕业设计的参考。资源围绕振动信号时域、频域及复频域分析框架覆盖数据预处理、FFT、小波变换、希尔伯特变换等算法实现以及峭度、峰值因子等统计特征提取和SVM、神经网络等模式识别建模流程。共26个文件以25个.m脚本为主辅以1个说明文档压缩包仅49KB轻量且便于直接运行验证。目前已有337人学习下载。通过运行源码可系统掌握从振动信号处理到故障类型识别的完整链路理解频谱异常、幅值增大等特征背后的机械故障机理还可在示例基础上扩展自己的诊断方法是理论与实践结合的优质参考。1. 振动故障诊断为什么绕不开MATLAB把加速度传感器贴在电机轴承座上采一段振动数据时域波形看起来只是杂乱无章的“毛刺”。但同样的信号经过傅里叶变换展开到频域转频、倍频、边频带依次浮现轴承外圈故障的特征频率就藏在某个峰值下面——这就是振动故障诊断的基本盘。MATLAB在这个领域里几乎是默认工作台原因不复杂它同时具备信号处理工具箱、统计工具箱和深度学习工具箱从原始波形到故障判据可以在同一个脚本里走完。对于旋转机械、齿轮箱、泵和风机这类设备的预测性维护振动故障诊断的价值在于把“坏了再修”变成“有趋势再停机”。这篇内容面向做设备健康管理、状态监测或工业数据分析的工程师目标是让你拿到振动数据后能自己跑通从频谱分析到故障判据的整条链路。2. 振动故障诊断技术的原理从时域到频域的信号解构2.1 时域特征为什么容易误判振动故障诊断技术最早期的做法是看时域指标比如峰值、均方根值RMS、峭度Kurtosis和波形因子。RMS 反映振动能量总体水平峭度对冲击型故障敏感这套指标在设备劣化趋势监测里至今仍在使用。但它的局限性很明确时域指标是全局统计量无法区分“转子不平衡”和“轴承外圈点蚀”这两种完全不同性质的故障它们可能表现出相近的 RMS 增量。换句话说时域指标能告诉你“设备状态变了”但说不清“哪里变了”。2.2 FFT频谱分析把振动信号拆成频率分量频域分析是振动故障诊断技术的核心支撑。对一段离散振动信号 x[n] 做离散傅里叶变换得到的是各频率分量的幅值分布转频 f_r 及其谐波、齿轮啮合频率 f_m f_r × ZZ 为齿数、轴承故障特征频率都会以谱峰形式出现。MATLAB 里一次fft(x)就能完成变换但有三个参数必须自己确认采样率 Fs、采样点数 N、窗函数类型。频率分辨率 Δf Fs / N采样时长 T N / Fs 决定你能分辨多近的两根谱线。例如 Fs 12800 Hz采样 1 秒Δf 就是 1 Hz这通常够用来分离转频和轴承故障频率如果采样只采 0.1 秒Δf 变成 10 Hz两根相距 5 Hz 的谱峰就会糊成一根故障特征直接丢失。Fs 12800; % 采样率 12.8 kHz N Fs * 1; % 采样 1 秒 t (0:N-1) / Fs; % 模拟一个转频 25 Hz、带 2 倍频成分的信号 x 1.0 * sin(2*pi*25*t) 0.4 * sin(2*pi*50*t) 0.3 * randn(1, N); X fft(x); f (0:N-1) * Fs / N; % 频率轴单边谱取前 N/2 个点 X_mag abs(X(1:N/2)) / (N/2); f_half f(1:N/2); plot(f_half, X_mag); xlim([0 200]);这段代码里X_mag的归一化是除以 N/2原因是 MATLAB 的fft结果是对称的单边谱幅值要乘 2 再除以 N 才能还原真实幅值。频率轴f (0:N-1) * Fs / N的单位是 Hz取前 N/2 个点对应奈奎斯特频率以内的正频率部分。如果不做归一化谱峰幅值会随采样点数变化后续做幅值对比就失去意义。2.3 包络谱与阶次分析定位轴承和齿轮故障频率滚动轴承的故障特征频率不是直接出现在原始频谱上的。外圈点蚀产生的冲击会激发轴承座固有频率形成高频调制载波是结构共振频率包络是故障冲击频率。直接看原始频谱看到的是一簇高频共振峰故障频率藏在边频带里。处理办法是先用带通滤波器把共振频带切出来再做 Hilbert 变换得到包络信号最后对包络信号做 FFT得到包络谱。故障特征频率在这个谱图上以明显峰值出现。各部件特征频率与转频 f_r 的关系如下表Z 为滚动体个数d 为滚动体直径D 为节圆直径α 为接触角故障位置特征频率计算公式外圈故障 (BPFO)f_o Z × f_r / 2 × (1 - d/D × cosα)内圈故障 (BPFI)f_i Z × f_r / 2 × (1 d/D × cosα)滚动体故障 (BSF)f_b D × f_r / (2d) × (1 - (d/D × cosα)^2)保持架故障 (FTF)f_c f_r / 2 × (1 - d/D × cosα)齿轮啮合频率f_m f_r × Z包络谱分析对轴承早期故障尤其敏感因为冲击能量分散在宽带共振里包络解调把分散的能量重新集中到故障特征频率上。内圈故障调制现象比外圈更明显包络谱上会出现 f_i 以及 f_i ± f_r 的边频带这个边频特征本身就是判据。齿轮故障则看啮合频率 f_m 两侧的边频带间隔齿面磨损时 f_m 幅值上升断齿时 f_m ± f_r 边频带显著增强。2.4 时频分析非平稳信号的补充手段FFT 假设信号是平稳的但变转速工况下的振动信号频率随时间变化直接用 FFT 会把瞬态成分平均掉。短时傅里叶变换STFT把信号切成短窗口再做 FFT得到时间-频率二维谱图能看出频率成分随时间的变化轨迹。MATLAB 里spectrogram(x, window, noverlap, nfft, Fs)一行就能出图。但这个工具箱函数的输出是复数矩阵调用时要留意参数顺序window是窗函数向量noverlap是重叠点数nfft是 FFT 点数Fs用于频率轴标注。变转速场景下阶次跟踪比 STFT 更实用恒定转速设备用 STFT 或小波变换已经足够。3. 用MATLAB实现振动故障诊断的最小流程3.1 从CSV导入振动数据到MATLAB工业现场采集的振动数据大多以 CSV 格式保存常见布局是每行一个采样点列包含时间戳和加速度值也可能一列存一个测点序列。readtable读入后先确认变量类型时间列是datetime类型振动数据必须是double。如果 CSV 里时间戳是字符串用datetime(str, InputFormat, yyyy-MM-dd HH:mm:ss)转换。导入后第一件事不是做频谱而是检查数据质量有没有 NaN、有没有毛刺、传感器有没有饱和削顶。data readtable(vibration_data.csv); t_raw data.timestamp; x_raw data.acc_x; % 假设加速度列名为 acc_x % 检查缺失值 fprintf(NaN count: %d\n, sum(isnan(x_raw))); % 去除趋势项消除传感器零漂 x_detrend detrend(x_raw, linear);detrend默认消除线性趋势对零漂和缓慢热漂移有效。注意detrend不改变采样率只改幅值基线。如果数据里有明显的离群尖峰幅值超过均值加 10 倍标准差建议先做中值滤波或直接剔除该段数据再做后续分析否则 FFT 后会出现全频段抬高。3.2 用滤波器把关注频带切出来包络谱分析的第一步是带通滤波频带选择直接决定分析质量。如果已知轴承座的共振频带可通过敲击测试或历史数据分析获得直接在该频带内滤波。未知时常见做法是用傅里叶变换先看共振峰集中在哪个频段再选择覆盖它的频带。MATLAB 里推荐用designfilt而不是老式的butterfiltfilt前者的参数校验更友好滤波器阶数和波纹指标可以在一条语句里配完。bpFilt designfilt(bandpassiir, FilterOrder, 4, ... HalfPowerFrequency1, 2000, ... HalfPowerFrequency2, 6000, ... SampleRate, Fs); x_band filtfilt(bpFilt, x_detrend);这里HalfPowerFrequency1和HalfPowerFrequency2是通带边界频率单位 Hz对应 -3 dB 点。FilterOrder为 4 时滤波器的陡降特性比较温和适合现场数据如果频带很窄或者干扰很强可以提高到 8但要留意filtfilt是零相位滤波不产生相位偏移这是包络分析必须的条件——Hilbert 变换对相位敏感任何非线性相位误差都会污染包络波形。3.3 计算包络谱并标记特征频率滤波完成后做 Hilbert 变换取包络再对包络信号做 FFT得到包络谱。现在的关键操作是在包络谱上画出特征频率的标记线并读取目标频点的幅值。env abs(hilbert(x_band)); % Hilbert 变换取包络 % 去掉包络中的直流分量再做 FFT env_ac env - mean(env); N_env length(env_ac); EnvSpec abs(fft(env_ac)) / (N_env/2); f_env (0:N_env/2-1) * Fs / N_env; EnvSpec_half EnvSpec(1:N_env/2); % 定义特征频率转频已知 25 Hz轴承外圈故障系数 3.05 为例 fr 25; coef_BPFO 3.05; % 外圈故障系数 f_BPFO fr * coef_BPFO; hold on; xline(f_BPFO, --r, BPFO); [~, idx] min(abs(f_env - f_BPFO)); fprintf(BPFO amplitude: %.3f\n, EnvSpec_half(idx));这段代码的最后一步用最小绝对值误差找到离理论特征频率最近的谱线读取该点幅值。xline在图上画竖线标记--r是红色虚线样式。注意hilbert返回的是解析信号abs(hilbert(x))得到的才是包络。包络信号的幅值单位与原始信号相同但物理意义已经变成冲击幅度的时变轨迹谱峰幅值代表该频率冲击成分的强度。3.4 输出特征矩阵用于趋势记录单次诊断结果不足以支撑决策振动故障诊断的工程价值在于趋势同一个特征频率的幅值随时间的增长率比它的绝对大小更重要。每次分析后把特征频率幅值写入一张表追加保存后续可以做劣化曲线。result_row table(datetime(now), fr, f_BPFO, EnvSpec_half(idx), ... VariableNames, {Time, RotSpeedHz, BPFO_Hz, BPFO_Amp}); if isfile(diagnosis_history.csv) writetable(result_row, diagnosis_history.csv, WriteMode, Append); else writetable(result_row, diagnosis_history.csv); endWriteMode参数在writetable中的取值是Append或Overwrite。第一次运行时文件不存在直接writetable之后再运行时加WriteMode, Append追加行。这样积累两周数据后用plot画 BPFO 幅值随时间的曲线劣化趋势比任何单次阈值判断都可靠。4. 从特征到故障识别阈值判据与机器学习4.1 基于特征频率比对的阈值判据振动故障诊断最常见的落地方式不是训练模型而是“频率比对 幅值判据”把包络谱或频谱里的显著峰值频率与理论特征频率对比误差在 ±0.5% 以内视为匹配匹配后看幅值是否超过报警阈值。阈值设定有两种来源一是 ISO 10816 这类标准给出的振动速度均方根值分段二是设备自身历史数据的 90 分位数。前者偏保守适合通用设备后者更贴合实际但要保证历史数据覆盖正常运行工况。幅值判据有一个容易出错的地方不同测点、不同工况下同一故障的绝对幅值差异巨大。轴承座垂直方向和水平方向的幅值可能差一倍以上负载 50% 和 100% 时特征频率幅值也没有可比性。因此阈值必须按测点和工况分组设定不能全局共用一个值。实际做法是在特征矩阵里增加工况列转速、负载按组别统计阈值实时数据只跟同组历史数据比较。4.2 用MATLAB训练一个简单的故障分类器当设备种类多、故障模式多频率比对脚本会变成一大串 if-else维护成本高。这时可以用机器学习方法替代人肉判据。常见做法是提取每组数据的特征向量——包括时域的 RMS、峭度、峰值因子频域的 1 倍频幅值、2 倍频幅值、特征频率幅值、边频带能量——构成特征矩阵用带标签的历史数据训练分类器。MATLAB 的fitcecoc多类 SVM和fitcknnK 近邻是两类典型的入门选项。% 假设 feat_mat 是 n x m 的特征矩阵label_vec 是 n x 1 的分类标签 % 数据先划分训练集和测试集 cv cvpartition(label_vec, HoldOut, 0.3); X_train feat_mat(training(cv), :); Y_train label_vec(training(cv), :); X_test feat_mat(test(cv), :); Y_test label_vec(test(cv), :); % 特征标准化对 SVM 和 KNN 至关重要 [X_train_s, mu, sigma] zscore(X_train); X_test_s (X_test - mu) ./ sigma; mdl fitcecoc(X_train_s, Y_train); pred predict(mdl, X_test_s); acc sum(pred Y_test) / length(Y_test); fprintf(Classification accuracy: %.2f%%\n, acc * 100);这段代码里的特征标准化是决定分类效果的关键点。SVM 和 KNN 都依赖样本间距离如果某个特征如 RMS量纲远大于其他特征模型会忽略小量纲特征。zscore把每个特征变成零均值单位方差保证各特征在距离计算中权重一致。cvpartition的HoldOut参数表示随机抽取 30% 样本做测试集分类器在剩余 70% 上训练。这类模型的输出结果是“故障类别”适合故障模式明确的场景如果故障样本很少类别不均衡会严重降低准确率需要配合Prior参数设置先验概率或使用fitcensemble集成方法。4.3 深度学习的边界样本量与可解释性深度学习近年被引入振动故障诊断领域MATLAB 的深度学习工具箱也提供了从 LSTM 到 Transformer 的完整工具链。基于 BiLSTM 的时序分类模型确实能直接从原始振动波形学习特征省去人工特征工程在学术数据集上准确率可以达到 95% 以上。但工程现场的现实是故障样本极其稀少一个正常运行的工厂很难采集到“外圈点蚀”“保持架断裂”“齿轮断齿”各几百段标注数据。深度学习模型在样本不足时容易过拟合预测结果又缺乏可解释性——它告诉你“这是内圈故障”但不告诉你依据哪条特征频率维修人员没法核验。因此在工程部署中深度学习更适合作为“第二层判断”先用频谱比对和包络谱判据筛出可疑样本再用深度模型在疑似样本里做细分类或者反过来用深度模型做异常检测发现偏离正常分布的数据后转人工用频谱分析确认故障类型。特征频率计算是物理依据机器学习是统计规律两者结合是目前工业界落地最稳的路径。5. 调参、验证与MATLAB诊断里的易踩坑5.1 采样率与频谱分辨率先定这两个参数现场采集参数如果定错了后续所有分析都是白费。采样率至少要覆盖到你需要观察的最高频率的 2.56 倍这是工程上考虑抗混叠滤波器过渡带后的常用系数。比如要分析到 5 kHz采样率至少 12.8 kHz。频率分辨率取决于采样时长Δf Fs / N 1 / T要分辨 1 Hz 以内的边频带采样时长至少 1 秒。高速设备转频 100 Hz 以上建议采样时长覆盖至少 20 转低速设备转频 1 Hz则需要 30-60 秒数据才能把故障特征频率分辨清楚。MATLAB 里可以用N 2^nextpow2(Fs * T)来取 2 的幂次长度配合fft计算效率更高。5.2 验证诊断结果的三条路径诊断结论不能只靠一次分析就下。第一个验证方法是仿真信号验证用正弦叠加冲击脉冲构造已知特征的信号跑同一套分析代码确认算法本身没有 bug。第二个方法是多测点交叉验证同一个轴承故障在轴向和径向测点上的特征频率相同但幅值分布不同如果只在一个测点看到特征峰另一个测点没有可能是传感器安装位置距离故障源太远。第三个方法是趋势验证连续监测数据里特征频率幅值呈单调上升趋势比单次高幅值更可信启动、停机、变载瞬间的瞬态冲击也可能产生伪谱峰但这些峰不会稳定出现在每次测量的同一频率位置。5.3 MATLAB实现中的5个常见坑第一个坑是fft结果的幅值归一化很多人直接把abs(fft(x))当幅值用导致同一信号不同采样点数时幅值不一致。正确做法是单边谱乘 2 除 N。第二个坑是频率轴计算错误f (0:N-1) * Fs / N得到的是从 0 到 Fs-Fs/N 的双边频率轴画单边谱时只取前 N/2 个点去掉后面一半如果直接画完整频率轴会看到对称的镜像频谱误以为存在两倍数量的频率成分。第三个坑是滤波器的相位污染用filter而不是filtfilt做带通滤波会让包络产生几十个采样点的延迟导致后续频谱分析的相位信息失真。第四个坑是 CSV 导入时数据类型的隐式转换某些 CSV 的加速度列是整数类型readtable读进来后double()转换不及时后续fft计算时出现意外截断。第五个坑是抗混叠滤波器的前提被忽略如果数据采集时没有硬件抗混叠滤波高于采样率一半的信号会折叠进低频段频谱上出现虚假峰值对这种数据先用lowpass(x, 0.48*Fs, Fs)做一次软件抗混叠是补救手段但效果取决于原始频谱中高频成分的强度。验证仿真代码是对抗这些坑最直接的训练。用已知频率和幅值的正弦信号注入分析流程对比输出值与理论值的误差任何归一化、频率轴或滤波器的错误都会在误差里暴露。振动故障诊断做久了会发现算法本身不难难的是每一步都确认“这个数的单位是什么、物理意义是什么”把 MATLAB 当计算器用还是当分析工具用区别就在这些细节里。本文还有配套的精品资源点击获取
RELATED

相关推荐

niri 手势完全指南:鼠标、触摸板、触摸屏与数位板交互及 gestures 配置详解

niri 手势完全指南:鼠标、触摸板、触摸屏与数位板交互及 gestures 配置详解

niri 手势完全指南:鼠标、触摸板、触摸屏与数位板交互及 gestures 配置详解 【免费下载链接】niri A scrollable-tiling Wayland compositor. 项目地址: https://gitcode.com/GitHub_Trending/ni/niri niri 是一个可横向滚动的平铺式 Wayland 合成器&#xf…

📅 2026/9/12 0:26:51
Haystack Generators API 深度指南:从 OpenAIChatGenerator 到 Fallback 容灾的完整生成器家族

Haystack Generators API 深度指南:从 OpenAIChatGenerator 到 Fallback 容灾的完整生成器家族

Haystack Generators API 深度指南:从 OpenAIChatGenerator 到 Fallback 容灾的完整生成器家族 【免费下载链接】haystack Open-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines…

📅 2026/9/12 0:26:50
research 技能实战指南:在 skills13/skills 中用后台 Agent 完成主源文献研究,产出带引用的 Markdown 文件

research 技能实战指南:在 skills13/skills 中用后台 Agent 完成主源文献研究,产出带引用的 Markdown 文件

research 技能实战指南:在 skills13/skills 中用后台 Agent 完成主源文献研究,产出带引用的 Markdown 文件 【免费下载链接】skills Skills for Real Engineers. Straight from my .agents directory. 项目地址: https://gitcode.com/GitHub_Trending/…

📅 2026/9/12 0:26:50
MORE NEWS

更多资讯

📰

降AI率工具深度测评:8款主流工具原理、效果与选型建议

1. 写在测评前面:先搞清楚检测器到底在抓什么1.1 为什么2026年“降AI率”成了绕不开的话题这半年我手里经手的稿件,十篇里有七篇要过“AI检测”这关。很多人一上来就问:“有没有一款神器,粘进去点一下,AI率直接归零&am…

📰

GDevelop 架构深度解析:Core、GDJS、Extensions、GDevelop.js 与 newIDE 五大模块的设计与协作

GDevelop 架构深度解析:Core、GDJS、Extensions、GDevelop.js 与 newIDE 五大模块的设计与协作 【免费下载链接】GDevelop 🎮 Open-source, cross-platform 2D/3D/multiplayer game engine designed for everyone. 项目地址: https://gitcode.com/GitH…

📰

Django二手商城mymall源码部署与运行故障排查指南

简介:这是一套基于Django框架开发的二手商品交易平台(mymall)完整源码,面向Python Web开发初学者与Django进阶实践者,解决从零构建电商类应用的核心需求,涵盖用户管理、商品发布、购物车、订单处理及支付宝…

📰

PaddleOCR doc2md:无需 OCR 即可将 Word、Excel 与 PowerPoint 一键转换为 Markdown

PaddleOCR doc2md:无需 OCR 即可将 Word、Excel 与 PowerPoint 一键转换为 Markdown 【免费下载链接】PaddleOCR Turn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDF…

📰

PWM电机开环控制完全指南:从占空比原理到STM32落地

从任务板上的P0标签说起——在一个真实的产品开发流程里,P0意味着“优先级最高、阻塞一切、必须先跑通”。而PWM电机开环控制,恰恰就是几乎所有电机应用的第一块多米诺骨牌:轮式机器人要动起来先靠它,风机水泵要转起来先靠它&…

📰

Actual 账户管理完全指南:从预算账户的创建、关闭到重命名

Actual 账户管理完全指南:从预算账户的创建、关闭到重命名 【免费下载链接】actual A local-first personal finance app 项目地址: https://gitcode.com/GitHub_Trending/ac/actual 本篇技术指南以 Actual 官方文档《Accounts Overview》为骨架,…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬