资讯动态

基于Matlab的电机故障诊断:从振动信号到特征频率的完整流程

发布时间:2026/9/6 20:33:05 来源:尧图企业网站定制
简介一份基于MATLAB的电机故障诊断学习文档面向电气工程、自动化专业学生及电机运维工程师。内容先阐述电机故障诊断的重要性再系统梳理频谱分析法、Park矢量法、Clerk矢量法和小波分析法重点针对三相鼠笼式异步电动机转子断条故障给出基于小波变换的诊断流程涵盖电流信号采集、预处理、小波分解、频谱分析和结果输出等环节。其中包含实验数据分析与MATLAB程序示例包括FFT频谱分析、Park矢量变换、Clerk变换及小波系数计算并对比了一根断条和三根断条工况下的电流波形采样频率为5000Hz可帮助读者掌握用Matlab提取故障特征、识别断条故障的完整思路。资源为单个docx文档体积约426KB便于打印传阅。已有1139人学习下载适合课程设计、毕业设计或工程入门参考。 电机这东西一旦转起来就没一天让人省心。轴承磨损、转子断条、气隙偏心、绕组匝间短路随便哪一个出了毛病轻则停机停产重则整台设备报废。我在工业现场和设备健康管理这个圈子里摸爬滚打了十来年经手过不少故障案例发现一个经常被忽略的事实电机故障很少是“突然”发生的它总有征兆只是我们没听懂它在“说什么”。“基于matlab的电机故障诊断”这套思路说白了就是让计算机替我们去“听”——采集电机的振动、电流等运行信号用matlab做信号处理和特征提取在故障还没酿成大祸之前把它揪出来。这篇文章我想把从信号采集、预处理、特征计算到诊断判别的完整流程掰开揉碎讲清楚附上可直接复现的matlab代码和实操参数适合做设备维护的工程师、搞故障诊断方向的研究生以及所有想用数据手段预测设备健康状态的人参考。1. 电机故障诊断的核心逻辑与matlab方案选型1.1 电机故障到底在“诊”什么常见故障类型与信号载体做电机故障诊断首先得搞清楚目标是什么。工业现场常见的电机故障大致分四类一是机械类故障以轴承损伤为主包括内圈、外圈、滚动体和保持架的点蚀、剥落、裂纹二是转子类故障典型的比如鼠笼式异步电机的转子断条和端环开裂这类故障和电磁、转速、负载关系密切三是气隙偏心故障表现为电机运行时气隙不均匀严重时会导致定转子扫膛四是电气类故障主要是定子绕组匝间短路、相间短路和绝缘劣化。这四类故障各有各的“脾气”但都有共同点运行中一定会产生异常的信号特征。目前工业界用得最成熟、最可靠的两类信号载体是振动信号和定子电流信号。振动信号的优势是直接反映机械结构和转子动力学状态对轴承故障、转子不平衡、不对中特别敏感定子电流信号的优势是非侵入式检测不用在电机上额外贴传感器用电流互感器卡住电源线就行适合不方便加装振动测点的场合。所以我建议初学者先抓住“振动为主、电流为辅”这条主线不要一上来就把电压、温度、磁通、声发射全测一遍信号多了反而不知道怎么下手。1.2 为什么选matlab这套方案的工具优势与适用人群很多做现场维护的老师傅习惯靠听棒、手摸来判断电机好坏这确实是经验活但问题是主观性太强新手上手慢而且无法量化。现代预测性维护要求的是“用数据说话”这就需要一套能快速处理信号、计算特征、还能做成自动诊断工具的平台。matlab在这个领域几乎是标配原因很简单第一信号处理工具箱非常齐全FFT、滤波、包络分析、小波变换这些函数开箱即用不用自己从头写底层算法第二矩阵化操作让批量处理几百组数据变得很轻松第三matlab的App Designer和实时脚本非常适合做诊断原型验证算法跑通了再移植到C或者Python效率高很多。当然也不是说matlab没有缺点它的商业授权费用不低运行速度也比不上编译型语言信号很长时for循环写不好能把人急死。但对做诊断算法研究、故障特征分析、数据可视化来说matlab的开发效率优势是压倒性的。我个人的建议是如果你正在做设备故障诊断相关的研究课题或者你们工厂有matlab正版授权那用matlab搭诊断框架是最省力的路径如果只是偶尔处理一组数据那可以用它的免费替代品GNU Octave语法几乎一致代码稍微改改就能跑。2. 故障信号采集与预处理实操2.1 传感器选型与采样参数设计决定诊断成败的第一关很多刚入行的朋友一上来就急着写代码处理数据结果发现数据本身质量不行后面怎么算都是白搭。信号采集是电机故障诊断的“第一公里”这步做扎实了后面事半功倍。先讲振动信号采集。现场诊断电机轴承故障最常用的传感器是压电式加速度传感器频响范围一般要覆盖10Hz到10kHz以上灵敏度通常在100mV/g左右。安装方式直接影响采集质量首选磁吸座或胶粘次选M6螺纹安装千万别用长探杆手持去测那会引入大量低频误差和人为抖动。采样率怎么定根据奈奎斯特采样定理采样率至少要大于最高分析频率的2倍工程上一般取2.56倍。假设你要分析到5000Hz那采样率至少设12800Hz稳妥起见直接设20kHz。这里有个关键概念叫抗混叠滤波现代采集仪内部都自带抗混叠滤波器所以软件层面不需要再额外处理混叠问题但采样率设置过低软件是救不回来的。再说电流信号采集。异步电机故障诊断常用的电流信号采集方式是电流互感器加钳形电流探头或者用霍尔传感器直接测相电流。需要注意的是电流信号的同步采样问题如果做的是频谱分析单相电流就够了但做功率分析或者负序电流分析就需要三相电流同步采集。采集仪一般都支持多通道同步采样接线时要确认好相位和量程。2.2 matlab中做数据导入与预处理去直流、去趋势项和滤波数据采回来之后第一步不是急着算FFT而是做预处理。原始的振动信号和电流信号里有太多“杂质”主要包括直流分量、趋势项、工频干扰和高频噪声。预处理做得好不好直接影响后续特征频率提取的准确性。先看一段matlab代码演示从CSV文件读入振动信号并做基本预处理% 读取采集仪导出的CSV文件假设第一列为时间第二列为振动加速度信号 data readmatrix(motor_vibration.csv); t data(:, 1); acc data(:, 2); fs 20000; % 采样率单位Hz % 去除直流分量和趋势项多项式拟合去趋势 acc_detrend detrend(acc, linear); % 线性去趋势消除温漂和积分误差 % 设计带通滤波器只保留10Hz~5000Hz的有效信号 % 这个频段覆盖了轴承故障特征频率和齿轮啮合频率范围 fc_low 10; fc_high 5000; [b, a] butter(4, [fc_low, fc_high]/(fs/2), bandpass); acc_filtered filtfilt(b, a, acc_detrend); % 零相位滤波避免相位偏移 % 查看滤波前后的时域波形 figure; subplot(2, 1, 1); plot(t, acc_detrend); title(去趋势后的振动信号); xlabel(时间(s)); ylabel(加速度(g)); subplot(2, 1, 2); plot(t, acc_filtered); title(带通滤波后的振动信号); xlabel(时间(s)); ylabel(加速度(g));这里重点说两个细节。第一个是detrend函数的作用。加速度传感器在安装后经常会因为温度变化或者预紧力释放产生缓慢漂移表现为信号整体出现一个上升或下降的“趋势线”。如果不做去趋势处理后面做FFT时在低频段会出现很大的虚假能量可能把电机实际转速频率附近的信息都盖住。第二个是filtfilt和filter的区别。filtfilt做的是零相位滤波它会对信号正向滤波一次再反向滤波一次互相抵消滤波器引入的相位延迟。在故障诊断里相位信息有时候并不重要但零相位滤波能保证信号特征的时间位置不发生偏移这对后续做包络分析和时频分析很有帮助。如果信号非常长、实时性要求高才考虑用filter函数加延迟补偿离线分析一律用filtfilt。预处理完还有一个例行检查的工作把信号的基本时域统计量算出来包括峰峰值、均方根值、峭度因子并绘制原始波形和频谱总览。这个步骤的目的有两个一是确认信号本身有没有异常比如削顶、断线二是初步判断当前设备振动水平处于什么量级为后续特征提取做铺垫。3. 核心特征频率计算与matlab特征提取3.1 轴承故障特征频率怎么算从公式到matlab实现做电机故障诊断不懂特征频率计算等于打仗没有地图。电机转动时每一个部件都有自己固有的“节拍”故障发生时就会在这个节拍上产生异常的能量冲击。轴承故障特征频率就是这些“节拍”的具体数值是诊断轴承故障最核心的对照依据。以滚动轴承为例四个关键特征频率的公式如下外圈故障特征频率BPFOBPFO (n × fr) / 2 × (1 - d/D × cosα)内圈故障特征频率BPFIBPFI (n × fr) / 2 × (1 d/D × cosα)滚动体故障特征频率BSFBSF (D × fr) / (2 × d) × (1 - (d/D)² × cos²α)保持架故障特征频率FTFFTF (fr) / 2 × (1 - d/D × cosα)其中n是滚动体数量d是滚动体直径D是节圆直径α是接触角fr是转轴转频单位Hz等于电机转速除以60。公式看着有点唬人但其实就是初中几何加运动学推导。打个比方轴承就像一个小型的“行星齿轮系统”滚动体在内外圈之间既自转又公转内外圈上的缺陷与滚动体接触时每次接触都会产生一次冲击单位时间内的冲击次数就是特征频率。故障越严重冲击次数对应频率处的能量就越突出。在matlab中计算非常直观假设一台型号为6204的深沟球轴承滚动体数n可查手册转速设为1470rpm运行这段代码就能算出理论特征频率% 轴承参数以6204为例实际参数以轴承手册为准 n_balls 8; % 滚动体个数 d_ball 7.14; % 滚动体直径单位mm D_pitch 34.0; % 节圆直径单位mm alpha 0; % 接触角单位rad深沟球轴承近似为0 rpm 1470; fr rpm / 60; % 转频 % 计算四个关键特征频率 BPFO n_balls / 2 * fr * (1 - d_ball / D_pitch * cos(alpha)); BPFI n_balls / 2 * fr * (1 d_ball / D_pitch * cos(alpha)); BSF D_pitch / (2 * d_ball) * fr * (1 - (d_ball / D_pitch)^2 * cos(alpha)^2); FTF fr / 2 * (1 - d_ball / D_pitch * cos(alpha)); fprintf(转频 fr %.2f Hz\n, fr); fprintf(外圈故障特征频率 BPFO %.2f Hz\n, BPFO); fprintf(内圈故障特征频率 BPFI %.2f Hz\n, BPFI); fprintf(滚动体故障特征频率 BSF %.2f Hz\n, BSF); fprintf(保持架故障特征频率 FTF %.2f Hz\n, FTF);算完之后我们就有了一张“理论频率对照表”。比如转频24.5Hz外圈特征频率可能算出来是78.4Hz。后续在频谱图里如果发现78.4Hz处有明显谱峰并且伴随该频率的高次谐波2倍、3倍那基本可以锁定外圈故障。3.2 时域指标、FFT与包络谱分析让故障特征“现出原形”特征频率算出来了下一步就是要从采集到的信号中把这些频率“挖”出来。这里我会用到三个层次的工具时域统计量、频谱分析、包络谱分析。先说时域统计量。时域特征最直观也最容易被忽视。均方根值RMS反映了振动能量整体水平峭度Kurtosis对冲击型故障特别敏感——轴承早期故障往往表现为周期性的脉冲冲击这种冲击会让振动信号的波形变“尖”峭度值随之升高。正常轴承信号近似高斯分布峭度接近3当峭度大于4甚至更高时就要高度怀疑有冲击性故障。matlab里直接调用kurtosis函数即可。然后是经典频谱分析。功率谱估计用periodogram或者pwelch都行pwelch的优势是可以加窗、分段平均谱线更平滑更适合工程使用。下面是一段完整的频谱分析和峰值搜索代码% 对滤波后的振动信号做功率谱分析 [pxx, f] pwelch(acc_filtered, hann(4096), 2048, 8192, fs); figure; plot(f, 10*log10(pxx)); xlabel(频率 (Hz)); ylabel(功率谱密度 (dB/Hz)); title(振动信号功率谱); xlim([0 1000]); % 搜索频谱峰值找出Top10的峰值点 [pks, locs] findpeaks(10*log10(pxx), MinPeakHeight, -20, MinPeakDistance, 2); [~, idx_sorted] sort(pks, descend); topN min(10, length(idx_sorted)); fprintf(频率及幅值Top%d\n, topN); for i 1:topN fprintf(f %.2f Hz, 幅值 %.2f dB\n, f(locs(idx_sorted(i))), pks(idx_sorted(i))); end频率分辨率是理解这段代码的关键。pwelch输出频率分辨率约等于fs/8192 ≈ 2.44Hz够不够用要看诊断对象。如果是高速电机转频几百赫兹2.44Hz分辨率勉强能用但对低速重载设备比如风机转频10Hz以下2.44Hz的分辨率远远不够它可能把10Hz以内的故障特征频率都模糊掉了。提高分辨率的方法是增加FFT点数比如改成16进制即16384点分辨率能提高到1.2Hz左右。当然点数越大计算越慢权衡着来就行。最后重头戏是包络谱分析也叫包络解调或高频共振解调技术。它的思路是轴承早期故障的冲击能量往往集中在系统固有的高频共振频率附近几千赫兹直接看低频频谱很难发现故障特征频率。包络分析先带通滤波把高频共振成分提取出来再做希尔伯特变换求包络信号最后对包络信号做FFT这样故障特征频率就会在低频段清晰显现。matlab的envelope函数或者专门做包络谱分析的envspectrum函数需要Signal Processing Toolbox都可以用% 带通滤波选择系统共振频带以实测为准通常先看原始频谱找共振峰 [b_hi, a_hi] butter(4, [2000, 5000]/(fs/2), bandpass); acc_bp filtfilt(b_hi, a_hi, acc_filtered); % 希尔伯特变换求包络 env abs(hilbert(acc_bp)); % 对包络信号再做功率谱得到包络谱 [pxx_env, f_env] pwelch(env, hann(4096), 2048, 8192, fs); figure; plot(f_env, 10*log10(pxx_env)); xlabel(频率 (Hz)); ylabel(包络谱幅值 (dB)); title(包络谱分析); xlim([0 500]);用包络谱分析轴承故障是我在实际项目里用得最顺手的方法。记得有次处理一台立式水泵电机的数据直接用功率谱看80Hz附件只有一点点凸起很不明显做了2000到5000Hz频带的包络解调后78.5Hz处的峰值一下子跳出来了跟理论BPFO值算的一模一样后来拆机检查果然外圈滚道一整圈点蚀。那一次让我彻底信了包络谱的实用价值。4. 诊断模型搭建与matlab代码级实现4.1 基于特征频率对照的规则判定最实用的第一套诊断逻辑特征提取完了最后一步是下结论。很多初学者栽在这里——特征频率算了一堆峰值也找到了可是怎么判断电机到底有没有故障答案是建立一套“规则判定”逻辑门槛低、可解释性强特别适合工程落地。规则判定的核心逻辑很简单找到频谱或包络谱中的显著峰值看它的频率是否落在某个理论特征频率附近考虑一定容差再看有没有该特征频率的高次谐波和边频带。如果都满足就判定对应部位存在故障并根据峰值幅值大小估计故障严重程度。在matlab里实现这个逻辑核心是写一个“频率匹配”函数function [is_fault, matched_freq] match_fault_frequency(spectrum_freq, spectrum_amp, target_freq, tol_ratio) % 在频谱中寻找与目标频率接近的峰值 % tol_ratio 是容差比例比如0.02表示允许2%偏差 idx find(abs(spectrum_freq - target_freq) target_freq * tol_ratio); if isempty(idx) is_fault false; matched_freq NaN; else [~, idx_max] max(spectrum_amp(idx)); is_fault true; matched_freq spectrum_freq(idx(idx_max(1))); end end然后对四个理论特征频率以及它们的0.5倍、2倍、3倍频逐个调用匹配函数统计命中次数。命中次数越多对应部位的故障可信度越高。容差比例怎么定严格来说轴承特征频率理论上和转速严格成正比所以容差主要来源于两种误差一是转速波动电网频率波动、负载变化会引起转速小幅波动二是FFT分辨率限制。根据我的经验取2%~5%的容差是合理的。转速波动大的场合比如风机类负载可以把容差放宽到5%否则容易漏报。4.2 引入机器学习做自动分类从“规则”到“智能”的进阶路径规则判定方法有一个天然瓶颈特征的阈值和容差需要人工设定不同电机、不同工况下最优参数不一样很难通用。当故障数据积累到一定程度后比如你已经保存了大量带标签的故障波形就应该让机器学习模型自动学这些规律。我的建议是这个方向就是把时域特征RMS、峭度、峰值因数、频域特征特征频率处的幅值、频谱能量集中度和包络谱特征拼接成一个特征向量然后用分类器做多分类。matlab的Classification Learner App可以图形化完成这个流程不用写一行代码就能对比决策树、支持向量机、随机森林等模型的准确率。数据量不大时优先尝试决策树或者线性SVM可解释性更好数据量上千条时随机森林和梯度提升树的效果会更稳定。给一个特征提取的示例把三类特征合并成一个特征向量function feature_vec extract_features(acc_signal, fs, freq_table) % 时域特征 rms_val rms(acc_signal); kurt_val kurtosis(acc_signal); peak_val max(abs(acc_signal)); [pxx, f] pwelch(acc_signal, hann(4096), [], 8192, fs); % 频域特征在已知特征频率附近取频带能量占比 fault_energy zeros(1, length(freq_table)); total_energy sum(pxx); for i 1:length(freq_table) idx_band find(abs(f - freq_table(i)) 5); % 特征频率±5Hz区间 fault_energy(i) sum(pxx(idx_band)) / total_energy; end feature_vec [rms_val, kurt_val, peak_val, fault_energy]; end把这套特征提取函数用到所有历史数据上打上“正常”、“外圈故障”、“内圈故障”、“断条”等标签就可以训练分类器了。这里强调一下标签的重要性不带标签的数据对监督学习来说一文不值所以平时做设备巡检时一定要记录好每次采集对应的设备实际状态哪怕只写一句“外观正常”、“听诊有异响”积累起来都是宝贝。5. 常见问题与排查技巧实录5.1 采样率不够导致频谱混叠数据救不回的第一类错误做诊断这行最怕的不是算法不会写而是数据采坏了还不自知。采样率不足引起的频谱混叠就是典型例子。比如你想分析到2000Hz结果采样率只设了3000Hz那么实际在2500Hz处的噪声能量会被“折叠”到500Hz附近造出虚假的谱峰可能正好覆盖在某个故障特征频率上直接把你带沟里。怎么排查混叠一个简单技巧固定测试点用两倍以上的采样率重新采集一次数据对比两次频谱。如果两次频谱中同一个可疑峰值位置偏移或幅值明显改变那就说明低频段被混叠污染了。采样的黄金法则是“采样率宁高勿低”存储空间够就尽量往高了设实在不行后期再降采样处理比数据坏了无法补采强太多。5.2 工频干扰淹没故障特征电流信号诊断的麻烦事用电流信号做电机故障诊断时最大的麻烦是工频分量电网50Hz基波远远盖过了故障分量。转子断条故障的边频带通常在转差率频率附近和50Hz差几个赫兹幅值可能比基波小几百倍在频谱图上根本看不清。我常用的处理办法是自适应陷波器在matlab中可以用带阻滤波器精确滤掉50Hz及它的整数倍谐波% 50Hz陷波器设计带宽1Hz wo 50 / (fs/2); bw wo / 35; % 带宽系数可根据干扰强度调整 [b_notch, a_notch] iircomb(fs/50, bw, notch); current_notched filtfilt(b_notch, a_notch, current_signal);滤掉基波之后再做频谱分析边频带就清晰多了。有一点要多说一句陷波器是“削足适履”会把基波附近的真实故障信息也一起滤掉一部分所以陷波器带宽不能设太大以刚好滤掉干扰为准。5.3 转速波动导致频率模糊低速设备的特别注意事项低速重载设备比如回转窑辅传、立磨主电机是故障诊断里的老大难。转速本身不高转频可能只有2~5Hz对应的轴承特征频率都在10Hz以下一方面FFT分辨率难以区分这么低的频率另一方面转速波动会让特征频率“漂移”频谱上的峰值被磨成一个宽包幅值也降低了。我的经验是改用阶比分析或者同步平均技术。阶比分析的核心是把等时域采样信号重采样为等转域信号这样特征频率和转速脱钩转速波动的影响就被消除了。matlab的rpmtrack和orderwaveform函数可以处理这类问题不过前提是你采集了同步转速脉冲信号键相脉冲没有的话只能靠包络谱加多段平均凑合处理。5.4 误报与漏报的排查思路诊断系统最怕的就是误报和漏报。排查这类问题我的习惯是先回到原始数据画出波形图直接看不要只盯着算法输出的结论。有一次系统报警说有内圈故障我查看原始波形发现是一个外部冲击旁边有工人用电锤打孔混了进去不是电机本身的问题。这就是典型的误报解决办法是在采集端增加抗干扰措施并在算法里增加时域冲击的持续时间判断把偶发冲击排除掉。漏报的情况多半出在参数设置上。比如特征频率算错了轴承型号查错、容差设得太窄、包络分析的带通范围没对准系统共振频带。处理措施很朴素用已知故障的历史数据进行算法回测调参调到能准确识别已知故障为止再拿正常样本验证不误报加个一票否决的规则比如只用频谱特征明显超过基线阈值才报故障。提示做电机故障诊断功夫一半在算法上一半在数据管理上。每台设备的型号参数、轴承型号、负载特性、历史检修记录都要做好台账诊断结果才有据可查。千万别指望一个模型走天下数据积累越多诊断参数才能调得越贴合现场的实际情况。6. 结尾一点个人的实操体会最后再分享一个我经常挂在嘴边的心得。很多刚接触matlab电机故障诊断的朋友总想着把算法写得很炫神经网络、深度学习轮番上结果到现场一测发现数据噪声大到根本没法看。我的经验是先把最基础的工具用扎实——轴承参数算对、采样率设对、包络谱做对这比一百个复杂模型都管用。matlab对我来说最大的价值不是那些高级工具箱而是让我能快速验证“这个频率到底存不存在”这个基本问题。做诊断这些年我一直坚持先手动分析、再自动化判断的原则每一步都亲手画图、亲自确认等积累出足够信心再放手交给程序跑。如果你也想上手这个方向找一台能稳定采集振动信号的小型电机从一组正常数据、一组模拟故障数据开始跑通一遍本文里的流程你会很快建立起对特征频率和故障诊断的直觉。这个能力比会调任何现成工具都珍贵。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价