简介:压缩包提供了一个基于MATLAB的阶次分析脚本,适用于旋转机械振动信号处理、状态监测与故障诊断等场景。核心功能包括转速信号读取、角度重采样以及阶次谱计算,配合steptdm相关思路,可将时域信号映射到角度域,帮助识别齿轮、轴承等部件的周期性振动特征,并进一步定位异常阶次。包内仅含1个MATLAB脚本文件,体积约2KB,代码精简,适合作为算法原型、课程设计或教学示例,便于读者在此基础上扩展数据接口、绘图与结果保存模块。该资源至今已有998人学习,对于正在研究阶次分析、角度重采样或转速计算的工程师与研究生,可直接获取可运行的算法骨架,并参考注释理解从时间域转换到角度域的关键步骤。整体上,这份小体积源码清晰地展示了从转速计算到阶次提取的完整流程,能够为设备健康监测、振动源定位与故障诊断提供实用参考,也可作为后续开发阶次跟踪工具的基础模块。
1. Order_tracing 与阶次分析:转速一变,频谱就“糊”
电机、齿轮箱、泵在升速或降速测试时,常规 FFT 频谱会难以辨认:转速从 1000 r/min 拉到 6000 r/min 的几秒内,转频从 16.7 Hz 漂到 100 Hz,啮合频率跟着漂移,对整段信号做 FFT 得到的是这些漂移成分的时间平均,峰值被抹平拖宽。Order_tracing 这类阶次分析脚本解决的就是这个矛盾:由键相脉冲做转速计算,把等时间采样重采样成等角度采样,再做阶次 FFT,横轴从 Hz 换成倍转频的阶次。转速变化从干扰变成可用信息,升速、降速、变速工况下的振动成分能逐阶识别,旋转机械监测、整车 NVH、电机诊断都会用到。整套流程里最值得调的是重采样角度步长。
2. 转速计算与角度重采样:先把时间轴换成角度轴
2.1 转速计算的输入:键相脉冲与累积转角
阶次分析的第一步不是处理振动信号,而是把转速信号换算成角度基准。常见配置是输入端装一路键相传感器(每转 1 个脉冲)或增量编码器(每转 60 至 100 个脉冲),与振动信号同步采集。每个上升沿对应一个固定的机械角度增量:键相是 360°,编码器是 360/PPR 度。于是脉冲边沿时刻 t_i 与累积角度 θ_i = i × 360/PPR 构成一组稀疏但严格单调递增的 (t, θ) 点,这就是整个角度重采样的锚点。
转速计算的精度直接决定最终阶次谱的质量。假设脉冲间隔有 1% 的抖动,单转角度基准就会偏差约 3.6°,对 20 阶以上成分的相位影响已不可忽略。实际项目里,键相信号线先经过施密特触发放大整形、去除毛刺,再从干净的方波上提取边沿时间;采集卡建议用计数器通道硬件记录脉冲时刻,而不是对低速脉冲做连续采样,否则时间分辨率不够。
2.2 转速计算的两种路径:脉冲平均法与样条求导法
转速计算有两条路。第一路把每个脉冲间隔内的转速当作常数:RPM_i = 60 / (Δt_i × PPR),再把这些值分配到间隔中点。优点是计算量小、抗噪好,缺点是单转内转速波动被平均掉,而往复压缩机、柴油机这类扭振明显的设备,单转内转速可能变化 5% 以上,直接用 RPM_i 做角度映射会产生周期性误差。
第二路是对 (t, θ) 做函数拟合、再求导得到瞬时转速 n(t) = (dθ/dt) × 60/360,dθ/dt 单位是 deg/s。这一路能保留转内转速细节。拟合函数建议用 PCHIP(保单调分段三次插值),它不会产生三次样条那种脉冲间隔突变处的过冲——过冲的 dθ/dt 会算出负转速,在重采样时表现为角度倒退。
import numpy as np from scipy.interpolate import PchipInterpolator def calc_rpm(tach, ppr=1, t_query=None): theta = np.arange(len(tach)) * (360.0 / ppr) # 累积角度 pchip = PchipInterpolator(tach, theta) # 保单调三次插值 if t_query is None: t_query = tach d_theta_dt = pchip.derivative()(t_query) # 角速度, deg/s rpm = d_theta_dt * 60.0 / 360.0 # 转成 r/min return rpm逻辑说明:先从脉冲序号构造出每个边沿对应的累积角度,用 PCHIP 通过全部 (t, θ) 点;对拟合结果求导即得任意时刻的角度变化率。t_query 传振动信号的采样时刻序列时,得到的 rpm 与振动数据自然对齐,后面做阶次谱按时间对齐时不用再插值一次。
参数层面:ppr 必须与硬件倍频一致,编码器 100 PPR 且做了 4 倍频时 ppr=400,写错直接导致转速翻倍或减半,阶次谱上 1 阶会出现在 2 阶或 0.5 阶位置;t_query 越密越能体现转速细节,但也会把脉冲边沿抖动暴露出来,所以工程上通常对 rpm 再做 3~5 点滑动平均。
2.3 角度重采样的步长 steptdm 与每转采样数
角度重采样的目标是把等时间间隔的振动信号 x(t) 转换成等角度间隔的 x(θ)。等角度间隔设置多少,由步长参数决定。在不少 Order_tracing 脚本里,这个步长变量就叫steptdm,含义是从时间域数据(time-domain data)映射到角度域时每一步转过的角度,单位是度,也有脚本命名成 delta_theta 或 step_deg,作用完全相同。每转采样点数 SPR = 360 / steptdm,它相当于阶次域的采样率,直接决定阶次域 Nyquist 频率。
| steptdm (°) | SPR | 阶次域 Nyquist | 适用场景 |
|---|---|---|---|
| 2.0 | 180 | 90 | 低速粗查、内存受限 |
| 1.0 | 360 | 180 | 常规齿轮与电机诊断 |
| 0.5 | 720 | 360 | 含高阶次啮合成分的分析 |
| 0.25 | 1440 | 720 | 阶次追踪图与精密诊断 |
阶次域同样受 Nyquist 制约:能表示的阶次不超过 SPR/2。但插值重建在接近 Nyquist 时幅值明显衰减,工程上建议让 SPR 大于最大关注阶次的 4 倍。例如重点关注 120 阶,steptdm 取 1°(Nyquist=180)是最低标准,想留余量就取 0.5°。
提示:steptdm 越小,角度域数据量越大。转速不变时,重采样信号长度与原始时域信号长度之比是 SPR×60/(fs×平均转速),对 60 s 长数据做 0.25° 重采样,内存开销可能多出 10 倍以上,先按关注阶次反推,不要无脑取小。
2.4 角度重采样的实现路径:正问题与逆映射
具体实现常见两步走。第一步是正问题:在加密的时间网格上计算角度,得到足够密的 (t, θ) 采样;第二步是逆映射:对目标角度序列 θ_target = 0, steptdm, 2·steptdm, …,反查对应的时间 t_res,再对振动信号插值。因为 θ(t) 严格单调递增,逆映射用 np.interp 是安全的,不必做逐点二分求解。
加密网格的疏密是关键。网格间隔应小于最小的脉冲间隔,一般按典型脉冲间隔的 1/8 来取;网格太粗时,逆映射的时间会带着台阶误差,先表现为角域波形上出现等间距的锯齿,再传导为阶次谱的杂散峰。完整函数实现放到下一章。
3. 角度重采样与阶次 FFT:完整的最小实现
3.1 角度重采样最小实现
把上一章的两步路径落成可以直接复制的函数,输入是振动信号的原始时间 t 和幅值 x、键相脉冲边沿时间 tach、每转脉冲数 ppr、角度步长 steptdm。
import numpy as np from scipy.interpolate import PchipInterpolator def angular_resample(t, x, tach, ppr=1, steptdm=1.0, grid_factor=8.0): if len(tach) < 3: raise ValueError("键相脉冲至少需要3个边沿") theta_pulse = np.arange(len(tach)) * (360.0 / ppr) pchip = PchipInterpolator(tach, theta_pulse) # 1) 加密时间网格,计算角度(正问题) dt_med = np.median(np.diff(tach)) # 典型脉冲间隔 n_grid = int((tach[-1] - tach[0]) / dt_med * grid_factor) t_dense = np.linspace(tach[0], tach[-1], n_grid) a_dense = pchip(t_dense) # 单调递增 # 2) 目标角度序列: 从0到末角,每 steptdm 度一个采样 theta_target = np.arange(0.0, a_dense[-1], steptdm) # 3) 逆映射: 角度 -> 时间 t_res = np.interp(theta_target, a_dense, t_dense) # 4) 振动信号在 t_res 处线性插值 x_res = np.interp(t_res, t, x) return theta_target, t_res, x_res逻辑说明:函数分四步走。第 1 步用典型脉冲间隔乘上 grid_factor 决定加密密度,grid_factor 取 8 意味着在最短脉冲间隔里至少插入 8 个采样点,保证逆映射的时间分辨率;第 2 步生成等角度网格,起点取 0°,实际测试时建议把起点改为 tach[0] 对应的角度,避免开头处在拟合边界上;第 3 步和第 4 步都是 np.interp 线性插值,前者用于角度到时间的反查,后者用于振动幅值重建。
需要留意两个边界:t_res 的范围被 tach[0] 和 tach[-1] 包住,振动信号开头和结尾各有一个脉冲间隔的数据会被舍弃,这正是 2.4 提到的边界效应,实际使用可以接受,因为后续阶次谱分段时本来也要裁边;steptdm 传入浮点数即可,函数内部用 np.arange 生成网格,末段不足一步的残余角度会被自然丢弃。
3.2 阶次 FFT 的横轴换算与幅值标定
角度重采样完成后,振动信号变成了以角度为自变量的均匀采样序列,每转 SPR 个点。阶次 FFT 与普通 FFT 的唯一区别是横轴换算:普通频谱用 d=1/fs 代表时间采样间隔,这里用 d=1/SPR 代表“每个采样点转过 1/SPR 转”,FFT 频率轴的单位就是 转/采样点,再乘上 SPR 得到 转/转,也就是阶次。
def order_fft(x_res, steptdm=1.0): x_res = x_res - np.mean(x_res) # 去直流 spr = int(360.0 / steptdm) win = np.hanning(len(x_res)) xw = x_res * win spec = np.fft.rfft(xw) / np.sum(win) * 2.0 # 单边谱 order_axis = np.fft.rfftfreq(len(x_res), d=1.0/spr) return order_axis, np.abs(spec)参数说明:spr 必须与重采样时的 steptdm 严格对应,函数内部重新算一遍是为了防止调用方传错;除以 np.sum(win) 是幅度恢复,乘 2 是单边谱把负频率能量并回来。阶次分辨率 ΔOrder = 1/(总转数),10 s 内从 1200 r/min 升到 4800 r/min 约有 500 转,ΔOrder ≈ 0.002,足够分开相邻 0.1 阶的峰值。
3.3 Order tracing:阶次追踪图的窗口切分
单个阶次谱只反映整段数据的平均状态。现场诊断更需要看阶次随时间(或转速)的演变,这就是阶次追踪图——把角度域信号切成若干固定转数的块,每块做一次阶次 FFT,按时间堆叠成二维的阶次-转速图。块内转数是一个关键权衡:块越长,阶次分辨率越高,但时间轴被抹得越粗,升速快的工况会让阶次轨迹变斜变糊。
def order_colormap(theta, x_res, steptdm=1.0, blk_rev=8, ovlp=0.5): spr = int(360.0 / steptdm) blk = int(blk_rev * spr) hop = max(1, int(blk * (1 - ovlp))) frames, centers = [], [] win = np.hanning(blk) for start in range(0, len(x_res) - blk + 1, hop): seg = x_res[start:start + blk] - np.mean(x_res[start:start + blk]) spec = np.fft.rfft(seg * win) / np.sum(win) * 2.0 frames.append(np.abs(spec)) centers.append(theta[start + blk // 2]) # 块中心角度 return np.array(frames), np.array(centers)说明:ovlp=0.5 表示相邻块重叠一半,可以缓解窗函数引起的幅值调制;blk_rev 建议按转速上升率选择,转速变化率超过 100 (r/min)/s 时 blk_rev 不要超过 8,否则单个块内转速跨度大于 100 r/min,阶次峰会被展宽。输出 frames 的形状是 块数 × 阶次点数,绘图时把 centers 换算成转速作为 x 轴更直观。
4. 阶次分析实战:参数设定、转速截取与故障排查
4.1 先定最大关注阶次,再反推 steptdm
阶次分析的第一步不是打开代码,而是确定最大关注阶次。齿轮箱场景里,啮合阶次等于齿数,边带是啮合阶次±1 或±2;轴承故障的特征频率除以转频通常是小数阶次(比如 3.57),而缺陷冲击会激励到几十阶以上的宽带成分。把关心的最高阶次记作 O_max,按 SPR ≥ 4×O_max 反推:O_max=60 时 SPR≥240,steptdm≤1.5°,保险取 1°;O_max=180 时 steptdm 必须取 0.5°以下。
还要考虑分析转速区间。低速时高阶次的物理频率很低,需要更长的时间窗才够做 FFT,所以低速段通常只分析中低阶次;高速段物理频率高,阶次谱更容易受抗混叠滤波器截止频率的约束。如果数据是固定采样率采集的,重采样前最大物理频率不能超过 fs/2,换算成阶次就是 O_max < fs / (2 × n_max/60)。
4.2 转速段的选取与转速曲线检查
角度重采样只对转速持续变化的区段有意义,匀速段的振动信号用普通 FFT 即可,不必引入插值误差。处理前先画出 rpm 曲线,人工确认三件事:脉冲是否从头到尾连续、是否有明显跳变、是否存在长时间停转段。建议按下面的流程截取:
- 从 rpm 曲线中删除转速为负或接近零的区间,单向旋转设备出现负转速通常是丢脉冲或插值过冲。
- 删除转速变化率 dRPM/dt 超过设备物理上限的区段,比如 0.1 s 内转速突变超过 200 r/min 的片段。
- 把剩余区间按连续单调段拆分,每段单独做重采样与阶次分析,避免把一次升速和一次降速混在同一个角度序列里。
4.3 键相脉冲丢失、抖动与角度基准修复
脉冲丢失是现场最常遇到的问题。判断方法很简单:计算相邻脉冲间隔,若某个间隔超过局部中值的 3 倍,说明中间丢了一个或多个脉冲。只丢一个且转速变化平缓时,可以在两个正常边沿的中点补一个假想边沿,并在代码里标记该点为插值点、不参与 PCHIP 拟合的导数约束;连续丢失超过两个脉冲,不建议修补,直接丢弃该段数据,否则角度基准会整体偏移。
脉冲抖动比丢失更难察觉。编码器安装偏心、键相传感器对齿槽敏感都会让边沿时间出现周期性抖动,反映在重采样信号里就是固定阶次的宽峰。缓和手段是 2.2 里提到的 rpm 滑动平均,以及重采样加密网格时把 grid_factor 从 8 提高到 12,让逆映射误差低于单个角度步长的 1/10。
4.4 插值阶数、窗函数与边界效应
重采样时振动幅值重建用线性插值还是三次插值,取决于信号性质。连续平稳的振动分量(齿轮啮合、不平衡)用线性插值就够,误差在 1% 量级;轴承早期故障的冲击成分是宽带的,线性插值会削平冲击峰值,建议用 InterpolatedUnivariateSpline(k=3) 做三次插值,但同时要对接角域信号做一次带通,避免插值过冲放大高频噪声。
阶次谱的窗函数必不可少。角度域信号首尾不连续,不做窗直接 FFT,阶次峰两侧会出现一整排泄漏旁瓣。逐段分析时对每块加 Hann 窗并重叠 50%,既压低旁瓣,又保证时间连续性。边界上,PCHIP 在首尾脉冲段外的外推误差很大,重采样结果前后各一个脉冲间隔要裁掉再进 FFT。
| 症状 | 原因 | 处理对策 |
|---|---|---|
| 阶次峰宽、拖尾严重 | 转速误算或脉冲抖动 | 修正 ppr,rpm 做滑动平均 |
| 高频阶次幅值明显偏低 | steptdm 过大接近 Nyquist | 减小 steptdm,SPR≥4×O_max |
| 出现小数假阶次 | 重采样时间轴台阶误差 | 加密网格,提高 grid_factor |
| 阶次轨迹中段分叉 | 升速过程扭矩突变 | 截去突变段或减小 blk_rev |
5. 用合成信号验证角度重采样与阶次分析的完整链路
合成信号是验证阶次分析代码最快的方法。构造一组已知阶次、已知转速曲线的信号,跑完转速计算、角度重采样、阶次 FFT 全流程,核对输出阶次和幅值,能暴露 80% 以上的实现错误,而且不依赖现场数据。
fs, T = 25600.0, 10.0 t = np.arange(0, T, 1/fs) rpm = 1200 + (4800-1200) * t / T # 线性升速 rpm += 25 * np.sin(2*np.pi*2*t) # 叠加2Hz转速波动 theta_deg = np.cumsum(rpm / 60.0 * 360.0) / fs # 真实累积角度 x = (1.00*np.sin(2*np.pi*1.0 *theta_deg/360) + 0.60*np.sin(2*np.pi*3.5 *theta_deg/360) + 0.30*np.sin(2*np.pi*23.0*theta_deg/360)) # 已知阶次信号 edge_angles = np.arange(0, theta_deg[-1], 360.0/60) tach = np.interp(edge_angles, theta_deg, t) # ppr=60的脉冲时刻逻辑说明:前三行构造真实转速,其中叠加的 25 r/min 转速波动专门用来检验转速计算是否跟得上细节;信号含 1 阶、3.5 阶小数阶次和 23 阶高次成分,直接验证阶次谱的分辨能力。生成键相脉冲时用 np.interp 从真实角度反查时间,模拟 PPR=60 的编码器输出,这一过程假设转速完全已知,后续噪声只会来自处理链路本身。
跑完 calc_rpm、angular_resample、order_fft 后,按三条标准验收:第一,重采样后对整段信号做阶次 FFT,峰值应精确落在 1.0、3.5、23.0 阶,误差小于 0.01 阶;第二,幅值比应接近 1:0.6:0.3,偏差超过 5% 说明窗函数或插值有问题;第三,用 2.2 的 calc_rpm 与真实 rpm 对比,平滑后的最大误差应小于 0.1%。峰值位置对而幅值不对,优先查窗函数归一化和直流分量;峰值位置偏移,先查 ppr 是否与边沿生成一致,再查逆映射的 t_dense 是否够密。
整条链路通过后,把同样的检查带到现场数据:先看 rpm 曲线有无丢脉冲,再看角域波形是否等角度均匀,最后看阶次谱里 1 阶转频处是否干净。1 阶之外的杂散峰若高于 1 阶幅值的 10%,通常是重采样质量问题的信号,而不是设备故障。
本文还有配套的精品资源,点击获取