旋转机械振动分析:阶次分析与角度重采样MATLAB实现

发布时间:2026/9/23 10:41:36
旋转机械振动分析:阶次分析与角度重采样MATLAB实现 简介面向机械振动分析、故障诊断与旋转机械状态监测的MATLAB阶次分析脚本旨在解决旋转机械振动信号从时间域到角度域转换中的重采样与阶次提取问题适用于设备维护工程师、信号处理方向的高年级学生及振动测试人员。压缩包共1个m文件大小仅2KB轻量精炼已有999人学习下载。脚本覆盖从转速脉冲计算瞬时转速、角度重采样插值到阶次谱绘制的完整流程通过FFT将角度域信号变换为阶次谱清晰识别振动分量与转频的整数倍对应关系可用于齿轮箱、轴承等旋转部件的故障特征定位也适用于NVH测试及课程实验。代码结合Steptdm方法思路注释清晰、变量规范读者可对照理解每一步计算目的亦可修改输入参数后作为模板二次开发快速搭建自己的阶次分析工具。1. 阶次分析不是FFT的替代品先搞懂为什么要把时域信号掰成角度域做旋转机械振动分析的人多半都遇到过这个场景变频器驱动下的设备转速从 800 转拉到 2400 转频谱图上原来清晰的 1 倍频峰值开始“漂移”谱线变得又宽又糊轴承故障特征频率直接淹没在噪声里。普通 FFT 处理平稳信号是神器可一旦转速变化它就成了摆设。阶次分析Order Analysis就是解决这个问题的把以时间为基准的信号重采样成以转轴角度为基准的信号让每个“每转发生一次”的振动分量在谱图上钉死在固定的阶次位置转速怎么变都不影响。这套Order_tracing.zip里的order.m脚本就是围绕转速计算、角度重采样、阶次提取这条链路写的最小可跑实现适合做旋转机械故障诊断、振动信号处理、状态监测的工程师拿来改一改用。2. 转速计算从键相脉冲到转速曲线精度决定整个分析的生死2.1 键相脉冲的原理为什么不能用平均转速角度重采样的第一件事是拿到准确的瞬时转速。这里说的“瞬时”不是仪表盘上那种一秒刷新一次的数而是每个旋转周期内的转速变化细节。绝大多数采集系统会配一个键相传感器Keyphasor常见的是光电传感器对着转轴上的反光条或者电涡流传感器对着轴上开的键槽每转一圈输出一个脉冲。转速变化时脉冲间隔会跟着变。如果偷懒用总脉冲数除以总时长算平均转速再拿这个平均值去做角度重采样结果就是阶次谱上一片模糊。举个例子一个启动过程 5 秒内从 600 RPM 匀加速到 3000 RPM平均转速 1800 RPM但不同时刻的每转振动相位完全不同用平均转速去映射角度相位误差会累积谱峰自然会展宽甚至分裂。所以瞬时转速估计是整条链路里最不能马虎的一步。2.2 瞬时转速估计的三种常见做法第一种最直观脉冲间隔倒数法。记录每个脉冲沿的时间戳两个相邻脉冲的时间差就是一转的周期转速 60 / Δt单位 RPM。优点是不需要额外硬件缺点是转速曲线是逐转跳变的直接拿去做角度映射会有台阶感。第二种是高精度计数法。硬件上用高频时钟比如 100 MHz填充脉冲间隔计数误差只有 10 ns 量级适合转速极高或者需要极细角度分辨率的场合。软件层面做不了这个得靠采集设备支持。第三种是我最常用的在第一种基础上加平滑。脉冲间隔法的离散跳变本质是量化噪声用平滑滤波器滑动平均或 Savitzky-Golay把曲线修圆再用插值把逐转的离散转速变成逐采样点的连续转速。order.m里的做法就是变体先做脉冲沿检测算逐转转速再用样条插值重采样到与振动信号相同的时间轴。2.3 用 MATLAB 写一个最小可用的转速计算脚本% 计算键相脉冲对应的瞬时转速并插值到振动信号时间轴 % t_trigger: 键相脉冲沿时间戳秒每转一个 % t_signal: 振动信号的时间轴秒 % rpm_inst: 逐转瞬时转速RPM dt diff(t_trigger); % 每转间隔秒 rpm_per_rev 60 ./ dt; % 每转瞬时转速 t_rev (t_trigger(1:end-1) t_trigger(2:end)) / 2; % 每转中点时间 % 样条插值到采样点时间轴得到每个振动采样点的瞬时转速 rpm_signal interp1(t_rev, rpm_per_rev, t_signal, spline);逻辑说明diff拿相邻脉冲的时间差倒数乘 60 就是每分钟转速。这里用每转中点时间作为转速的时间锚点是因为这一转的转速值更接近中点时刻的真实值直接挂在触发沿上会有半转延迟。interp1的spline选项比linear平滑但注意如果振动信号的时间轴超出脉冲时间戳范围插值会返回 NaN得用extrap参数补值或者裁剪信号两端。参数说明t_trigger的来源通常是采集设备的数字输入通道记录。如果设备没给时间戳只给脉冲计数可以配合采样率重建时间轴但前提是采样率要足够覆盖脉冲间隔。转速突变剧烈的场景比如急停建议改用pchip插值避免样条过冲产生虚假的转速尖峰。3. steptdm 角度重采样步进时域建模与等角度插值的核心逻辑3.1 为什么采样间隔要按角度而不是时间常规采集是等时间间隔采样每秒采样率固定。角度重采样要的是等角度间隔采样——每转过固定的角度比如 1 度采一个点。两者在转速恒定的时候没有本质区别但转速一变等时间采样就会让“每转采了多少个点”发生波动。阶次分析的本质是把振动信号从时间域映射到角度域然后对角度域信号做 FFT。角度域信号的横坐标是转轴转角纵坐标是振动幅值。这样一个每转发生 3 次的振动分量在角度域里就是周期为 120° 的周期信号FFT 后出现在 3 阶的位置上不管转速是 600 还是 6000这个位置都不变。3.2 steptdm 的核心思路相位由转速积分而来steptdm的完整名字是 Step Time-Domain Model步进时域模型。它的核心思想是不直接做“时间→角度”的一次性映射而是从起始相位出发用瞬时转速逐步积分出每个时间点的转角构建相位-时间关系再据此计算目标角度对应的时间位置最后对原始时域信号做插值。% 从瞬时转速积分出累积转角单位转 % rpm_signal: 每个振动采样点的瞬时转速RPM % fs: 振动信号采样率Hz % phase_turn: 累积转角单位转1转360度 phase_turn cumsum(rpm_signal / 60 / fs); % 每秒转数 / 采样率 每采样点转数 phase_deg phase_turn * 360; % 转到角度度 % 设定重采样角度网格每转固定点数 samples_per_rev delta_deg 360 / samples_per_rev; % 角度步长度 angle_target (0:delta_deg:max(phase_deg)).; % 目标等角度网格 % 反向插值找到每个目标角度对应的时间位置 time_target interp1(phase_deg, t_signal, angle_target, linear); % 正向插值在目标时间位置处取振动信号幅值 signal_angle interp1(t_signal, signal_time, time_target, pchip);逻辑说明cumsum是累加把每个采样点的瞬时转数逐步加起来得到从起点到当前位置总共转了多少圈。然后反向查表——已知相位序列找时间再用目标时间从原始信号里取幅值。这里先反向后正向两次interp1不能省第一次把角度网格映射成非均匀时间位置第二次把原始时域信号映射成等角度间隔的角域信号。参数说明samples_per_rev是核心参数取多少直接决定角度域信号的带宽上限。角度域里每转 N 个点等效采样率就是 N 阶按奈奎斯特定理最高可分析阶次是 N/2。工程里常见取 200~2048对应最高分析阶次 100~1024。取太少会丢高阶故障特征取太多则数据量和计算时间都上去了。3.3 插值方法选择的权衡interp1的linear和pchip是常用组合。角度网格稀疏时linear会带来明显折线误差表现在阶次谱上是产生高频假峰pchip分段三次保形插值在保留原始信号形状上比linear好得多又不会像spline那样在突变处过冲。处理轴承故障这种带冲击成分的信号过冲会直接干扰冲击特征的还原所以我一般推荐pchip。4. order.m 的完整实现从原始信号到阶次谱的流程拆解4.1 order.m 的输入输出结构order.m典型的输入是三样东西一是时域振动信号signal_time二是键相脉冲时间戳t_trigger或者转速信号三是采样率fs。输出则是角度域信号signal_angle、转数轴phase_turn以及最后算出来的阶次谱。实际用的时候如果采集系统没直接给脉冲时间戳给的是一个转速计模拟量信号也能做先用转速信号算出转速曲线再积分出相位剩下的路径一样。这就是为什么有些资料会说 order.m 支持“转速信号直接输入”模式。4.2 阶次谱的计算流程四条链路串起来整个流程可以分成四步转速曲线估计 → 相位积分 → 角度重采样 → 阶次 FFT。前两步我们已经在前两章写过了order.m做的事情就是把它们串起来再加上最后一步的 FFT 和阶次轴映射。% order.m 的核心流程分段示意 % 输入signal_time, t_trigger, fs, samples_per_rev % 输出order_axis, order_spectrum % 1. 转速估计 dt diff(t_trigger); rpm_per_rev 60 ./ dt; t_rev (t_trigger(1:end-1) t_trigger(2:end)) / 2; rpm_signal interp1(t_rev, rpm_per_rev, t_signal, spline, extrap); % 2. 相位积分 phase_turn cumsum(rpm_signal / 60 / fs); phase_deg phase_turn * 360; % 3. 角度重采样 delta_deg 360 / samples_per_rev; angle_target (0:delta_deg:max(phase_deg)).; time_target interp1(phase_deg, t_signal, angle_target, linear); signal_angle interp1(t_signal, signal_time, time_target, pchip); % 4. 阶次FFT L length(signal_angle); window hanning(L); % 加窗抑制频谱泄漏 spectrum fft(signal_angle .* window); amplitude 2 * abs(spectrum(1:floor(L/2))) / sum(window); order_axis (0:floor(L/2)-1) * (samples_per_rev / L); % 阶次轴逻辑说明第一步把键相脉冲转成每个采样点的瞬时转速。第二步用累积求和把转速变成相位——这是时间域到角度域的关键桥梁相位误差会直接决定后续谱峰锐度。第三步反向查找加正向插值目标角度网格是等差数列但对应的时间位置是非均匀的这一步把非均匀采样问题变成了标准均匀采样问题。第四步对角度域信号做标准 FFT因为此时信号已经是“均匀角度间隔”的了。参数说明hanning窗是阶次分析里比较稳妥的默认选项主瓣宽度与旁瓣抑制的平衡好。amplitude里的sum(window)是窗函数的能量补偿避免加窗后幅值被压低。order_axis的计算本质上是把 FFT 的 bin 索引按照“每转 samples_per_rev 个点”换算成阶次第 k 个 bin 对应的阶次 k × samples_per_rev / L。4.3 阶次谱怎么读阶次谱的横轴单位是“阶”Order1 阶就是每转一次2 阶就是每转两次。齿轮的啮合阶次通常等于齿数轴承外圈故障特征阶次可能是 3.2 阶这种非整数这些特征在阶次谱上会以一根根谱线的形式出现。对比普通频谱阶次谱最大的优势是转速变化时同一故障特征始终在同一横坐标位置可以直接对多段数据做平均或趋势对比。5. 角度重采样避坑指南五个最容易翻车的细节5.1 谱图上出现莫名其妙的“鬼峰”现象阶次谱上在某个高阶层位置冒出一根异常谱线幅值很高但对应的机械结构上不应该存在这个阶次。原因键相脉冲信号上有毛刺或丢脉冲。毛刺产生短间隔算出来的瞬时转速瞬间飙高丢脉冲则让间隔加倍转速瞬间减半。相位积分把这些异常累积进去重采样信号里就会混入周期性畸变。解决脉冲沿检测前先做去抖处理。常见做法是设置脉冲间隔合理范围比如 0.5 倍到 2 倍中位数间隔超出范围的间隔标记为异常用前后正常值插值替换。order.m里可以加一步medfilt1对rpm_per_rev做中值滤波窗口取 5 一般就够了既能剔除单点异常又不会过度平滑真实转速波动。5.2 重采样波形两端出现大幅畸变现象角度域信号开头和结尾几十个点幅值异常波形像被拉伸或压缩过阶次谱低频段多了能量。原因interp1在数据范围外的外插值是不可控的。时间轴超出脉冲覆盖范围时转速插值用了extrap线性外推但线性外推的转速与真实转速偏差越来越大相位误差累积后会让重采样信号失真。解决两条路一起走。一是裁剪数据范围只保留脉冲覆盖的时间区间比如valid_range t_trigger(1):1/fs:t_trigger(end);然后在这个区间内做重采样。二是分析完成后直接丢弃角度域信号前 1% 和后 1% 的数据点再做 FFT。5.3 低转速段阶次谱噪声明显偏大现象设备从低速平稳段到高速段的扫频数据低速段的阶次谱底噪比高速段高一截。原因角度网格是均匀的但低转速意味着单位时间内转过的角度少要用更多时间去采集同样角度间隔的数据。如果信号里有随机噪声低速段每个角度间隔里的等效平均次数少噪声抑制效果就差。解决提高samples_per_rev并配合谱平均。把每转采样点从 256 提到 1024然后对角度域信号切段加窗做 50% 重叠平均能把底噪压低不少。代价是高阶分析带宽上升、数据量变大但对确认微弱故障特征值得。5.4 阶次谱峰宽得异常明明转速很稳定现象转速基本恒定理论上阶次峰应该是单根谱线但实际峰占了 3 到 4 个 bin 的宽度。原因瞬时转速曲线被过度平滑了。spline插值本身就有平滑作用如果前面又对rpm_per_rev加了宽窗滑动平均真实存在的微小转速波动就被抹掉了。相位积分对转速误差是累积的转速曲线过于“干净”累积相位反而偏离真实相位。解决调整平滑参数目标是让转速曲线保留真实波动、只滤掉量化跳变。sgolayfilt比滑动平均好它能保形。窗口取 7 到 11多项式阶数取 3一般能在平滑和保真之间找到平衡。判断标准很简单反推转速曲线看它是否还跟原始脉冲间隔的趋势一致。5.5 同一组数据两次计算阶次峰位置差出半个阶次现象对同一组数据分别跑两次中间没改任何参数阶次峰却对不上。原因键相脉冲的触发沿选择不一致。如果脉冲沿检测既触发了上升沿又偶发触发了下降沿比如信号整形电路滞后每转脉冲数会在一和二之间跳变转速直接差一倍阶次位置当然对不上。解决沿检测环节写死只认一种沿并且判断脉冲形状是否有效。经验做法是检查相邻脉冲极性若发现高低电平交替记录说明触发沿混用了直接滤掉极性不对的那些沿。6. 用合成信号验证 order.m 的正确性闭环测试的三个步骤6.1 构造带已知阶次特征的仿真信号拿到一个阶次分析脚本第一件事不是跑真实数据而是先用已知答案的信号验证。真实数据有太多说不清的因素而合成信号里每个特征都是我们自己设的算完对不对一目了然。这也是我拆别人脚本的习惯——先用合成信号建立信任再拿真实数据做判断。% 生成一个变速信号转速 600→3600 RPM 线性升速含 1 阶和 2.5 阶振动分量 fs 5120; % 采样率 t 0:1/fs:10; % 10 秒 rpm 600 (3600-600)/10 * t; % 线性升速 phase cumsum(rpm / 60 / fs) * 360; % 累积转角度 % 1阶分量每转一次幅度 2.02.5阶分量每转2.5次幅度 0.8 signal 2.0 * sind(phase) 0.8 * sind(2.5 * phase 30); % 模拟键相脉冲每转相位过零处产生一个脉冲 trigger_phase mod(phase, 360); trigger_idx find(diff(trigger_phase) 0); % 每当相位回绕到0产生脉冲 t_trigger t(trigger_idx 1); % 脉冲时间戳逻辑说明信号本身由相位直接合成所以 1 阶和 2.5 阶分量的答案天然准确。键相脉冲也是从相位回绕点生成的这模拟了真实键相传感器的行为——每转一圈输出一个脉冲。注意采样率 5120 对应的最高可分析阶次是 5120/60/最高转速 3600 转每秒再乘 0.5这组参数下足够容纳 2.5 阶了。参数说明phase用cumsum生成本质是数值积分与后面order.m的处理路径一致。trigger_idx检测相位从 359° 回绕到 0° 的位置这些位置就是真实键相点。生成完后建议先跑一下rpm 60./diff(t_trigger)看看还原的转速曲线是否符合 600 到 3600 的线性趋势这一步也能顺手验证脉冲检测逻辑。6.2 跑 order.m 并检查阶次峰位置把上述signal和t_trigger交给order.m取samples_per_rev 1024算完阶次谱后检查 1 阶和 2.5 阶位置是否有清晰谱峰。正常的话谱峰幅值应在 2.0 和 0.8 附近幅值误差不超过几个百分点。如果 2.5 阶处没峰但 0.5 阶处冒出来了多半是合成数据里的sind(2.5*phase)相位与脉冲回绕点没对齐检查触发沿位置是否引入了半转偏差。6.3 把这个验证脚本固化成流程从那以后我每次拿到新的阶次分析脚本或改完参数都强制自己先跑一遍合成信号验证。这个习惯帮我揪出过不少翻车问题有一次是插值方向写反了阶次谱镜像翻转有一次是窗函数没归一化幅值低了 40%。绝大多数问题用真实数据根本看不出来但合成验证几秒钟就能暴露。真实数据是检验手段合成信号才是调试工具这套流程值得固化到日常分析里希望帮到你。本文还有配套的精品资源点击获取