资讯动态

变转速工况下阶次分析MATLAB实现:从FFT失效到角度域重采样完整代码

发布时间:2026/10/14 19:48:29 来源:尧图企业网站定制
简介这份资源面向振动分析与故障诊断方向的工程师、研究人员及高校学生提供一套基于MATLAB的阶次分析完整实现代码帮助解决旋转机械变转速工况下故障特征频率难以准确提取的问题。压缩包共3个文件约13.72MB包含1个m脚本文件、1个mat数据文件和1个jpg图形说明文件脚本文件承载阶次分析的核心算法流程涵盖信号导入、预处理、阶次跟踪与频谱分析等环节mat文件保存了配套的采集或处理数据可直接加载运行验证jpg文件则以图示方式辅助理解阶次分析的概念与过程。目前已有357人学习关注。读者可借助这套代码快速搭建阶次分析实验环境对照数据复现从时间信号到阶次信号的转换过程理解阶次跟踪与故障特征频率识别的实现思路并在此基础上迁移到自身采集的振动数据中开展分析适合作为入门学习与工程实践的参考脚本。1. 阶次分析为什么在变转速工况下比 FFT 更靠谱做过旋转机械振动测试的人多半遇到过这个场景电机升速过程中采了一段振动信号丢进 FFT 一看频谱糊成一片转频对应的峰值找不到边频带也散了。这不是信号有问题而是 FFT 的底层假设——信号在分析窗内频率稳定——在变转速工况下直接失效了。阶次分析就是冲着这个痛点来的它把时间域的非平稳信号通过转速参考信号重采样到角度域让「每转发生多少次」这个物理量代替「每秒发生多少次」于是升速、降速、启停过程中的齿轮啮合、轴承故障特征反而变得干净可读。MATLAB 实现阶次分析完整代码文件这个标题背后其实是一整条链路转速脉冲采集、角度域重采样、阶次谱计算、阶次追踪、以及和 FFT 结果的对照验证。它适合两类人一类是刚接触旋转机械故障诊断、手里有振动和转速两路信号但不知道怎么处理的工程师另一类是想把阶次分析从商业软件里「抠」出来、自己掌控每一步参数的人。下面我按自己实际跑通的顺序把这条链路拆开讲代码可以直接抄参数我会标清楚为什么这么设。2. 阶次分析的数学底座与 MATLAB 实现选型2.1 从等时间采样到等角度采样核心公式推导阶次分析的本质是一次坐标变换。假设转速为 n(t) 转/分转频 f_r(t) n(t)/60那么第 k 阶对应的瞬时频率就是 f_k(t) k · f_r(t)。等时间采样下采样率 fs 固定信号 x(t) 的频率随时间漂移等角度采样下我们以每转固定点数 N_per_rev 重新采样得到 x(θ)此时第 k 阶在角度域就是一个固定频率 k 的正弦。关键公式是重采样时刻的计算t_i t_0 (i / N_per_rev) · (60 / n(t_i))这是一个隐式方程因为 n 本身是时间的函数。工程上常用两种解法一是用转速脉冲的到达时刻做线性插值二是用键相脉冲累积角度。前者实现简单后者精度更高。我一般先用脉冲到达时刻法跑通再根据阶次谱的边带干净程度决定要不要换累积角度法。重采样之后角度域采样率就是 N_per_rev对应的「阶次采样率」为 N_per_rev 阶/转。根据奈奎斯特能无混叠分析的最高阶次是 N_per_rev/2。所以如果你关心 50 阶以内的齿轮啮合N_per_rev 至少取 128关心 100 阶以上取 256 或 512。2.2 三种实现路径的取舍resample、interp1 与 cumtrapzMATLAB 里做角度域重采样常见三条路第一条是直接用resample函数但它要求输入是等间隔的变转速场景下不能直接用必须先构造等角度时间轴。第二条是interp1把原始信号 x(t) 和重采样时刻 t_i 一起插值。这是最直观的做法代码短适合快速验证。缺点是插值精度受原始采样率影响如果 fs 不够高高频阶次会失真。第三条是累积角度法先用转速积分得到角度 θ(t)再找 θ 均匀分布对应的时刻。这条路的精度最高因为角度是直接累积的不依赖瞬时转速的微分噪声。代价是要处理积分漂移。我的建议先用 interp1 跑通全流程确认阶次谱形态对了再换累积角度法做精细分析。下面两节分别给代码。2.3 用 interp1 跑通最小可复现示例先构造一段模拟的变转速振动信号再走完重采样和阶次谱计算。% 模拟变转速振动信号转频从 10Hz 线性升到 30Hz fs 5000; % 原始采样率 Hz T 2; % 信号时长 s t (0:1/fs:T-1/fs); % 时间轴 f_r 10 10*t; % 转频随时间线性变化 10-30 Hz % 构造 3 阶和 7 阶成分幅值分别为 1 和 0.5 phase 2*pi*cumtrapz(t, f_r); % 转频积分得相位 x 1.0*sin(3*phase) 0.5*sin(7*phase) 0.1*randn(size(t)); % 构造等角度重采样时间轴 N_per_rev 128; % 每转采样点数 theta_uniform (0:N_per_rev*floor(max(phase)/(2*pi))-1) * (2*pi/N_per_rev); % 由相位反查时间phase 是单调的用 interp1 反插 t_uniform interp1(phase, t, theta_uniform, linear, extrap); % 角度域重采样 x_angular interp1(t, x, t_uniform, linear, extrap); % 阶次谱对角度域信号做 FFT L length(x_angular); X fft(x_angular .* hanning(L)); P abs(X(1:L/21)); order_axis (0:L/2) * (N_per_rev / L); % 阶次轴 plot(order_axis, P); xlabel(阶次); ylabel(幅值); title(阶次谱);这段代码的逻辑链条是先有瞬时转频 f_r积分得到相位 phase再用 phase 反查等角度对应的时间 t_uniform最后把原始信号插值到这些时刻上。参数上N_per_rev 决定最高分析阶次128 对应 64 阶hanning 窗用来抑制角度域截断带来的泄漏order_axis 的换算关系是「阶次 角度域频率 × L / N_per_rev」因为角度域采样率就是 N_per_rev。跑完你会看到 3 阶和 7 阶处各有一个尖峰底噪平坦。如果换成直接对 x 做 FFT这两个峰会被抹成一片。2.4 累积角度法精度更高但要多做一步累积角度法的核心是把转速脉冲的到达时刻转成累积角度再均匀分角度找时刻。% 假设 pulse_time 是键相脉冲到达时刻秒每转一个脉冲 pulse_time [0; 0.05; 0.098; 0.145; 0.19]; % 示例实际从采集卡读 pulse_angle (0:length(pulse_time)-1) * 2*pi; % 每个脉冲对应 2*pi % 累积角度随时间的变化 theta_cum interp1(pulse_time, pulse_angle, t, linear, extrap); % 找等角度时刻 theta_target (0:N_per_rev*floor(max(theta_cum)/(2*pi))-1) * (2*pi/N_per_rev); t_angle interp1(theta_cum, t, theta_target, linear, extrap); % 重采样 x_angle2 interp1(t, x, t_angle, linear, extrap);和 interp1 法的区别在于这里用脉冲时刻直接定义角度不依赖瞬时转速的微分所以对转速波动更鲁棒。代价是脉冲丢失或抖动会直接污染角度轴实际用之前要先做脉冲质量检查——看脉冲间隔的方差超过 5% 就要先做异常剔除。3. 完整代码文件的结构与关键参数怎么设3.1 文件组织五个函数各管一件事一个能复用的阶次分析代码包我一般拆成五个文件文件名职责输入输出load_signal.m读振动和转速数据文件路径t, x, pulse_timecalc_angle.m脉冲转累积角度pulse_time, ttheta_cumresample_angle.m等角度重采样t, x, theta_cum, N_per_revx_angle, order_axisorder_spectrum.m阶次谱计算x_angle, N_per_revP, order_axisorder_track.m阶次追踪x_angle, N_per_rev, ordersamp_vs_time这样拆的好处是每一步都能单独验证。比如重采样对不对直接看 x_angle 的时域波形是不是等角度周期阶次谱对不对看已知阶次的峰值位置。3.2 N_per_rev 与频率分辨率的权衡N_per_rev 是阶次分析里最关键的参数没有之一。它同时决定三件事最高分析阶次、阶次分辨率、计算量。最高分析阶次 N_per_rev / 2。如果你要分析 80 阶N_per_rev 至少 160实际取 256 留余量。阶次分辨率 N_per_rev / LL 是角度域信号长度。L 越长分辨率越高但 L 受限于总转数。比如采了 10 转N_per_rev256L2560分辨率就是 0.1 阶。计算量随 N_per_rev 线性增长但现代机器上 512 以内都不是瓶颈。我的经验值齿轮箱取 256轴承取 512电机取 128。如果阶次谱上边带模糊先加 N_per_rev别急着调窗函数。3.3 窗函数与重叠角度域和时域的差别角度域做 FFT 时窗函数的选择逻辑和时域一样但要注意一点角度域信号的首尾如果不连续泄漏会更明显因为角度域的「周期」是物理上的整转。所以 hanning 窗几乎是默认选择除非你做的是整周期采样且首尾严格对齐。重叠方面如果要做阶次追踪看某个阶次随时间的幅值变化需要分段做 FFT段间重叠 50% 是常规操作。段长取 2 到 4 转太短分辨率不够太长时间定位模糊。% 分段阶次谱每段 4 转重叠 50% seg_rev 4; seg_len seg_rev * N_per_rev; overlap seg_len / 2; n_seg floor((length(x_angle2) - seg_len) / (seg_len - overlap)) 1; for k 1:n_seg idx (k-1)*(seg_len-overlap) (1:seg_len); seg x_angle2(idx) .* hanning(seg_len); P_seg abs(fft(seg)); P_seg P_seg(1:seg_len/21); % 存起来做阶次追踪 end这段的关键参数是 seg_rev 和 overlap。seg_rev4 意味着每段 4 转对应阶次分辨率 N_per_rev/(4*N_per_rev)0.25 阶。overlap50% 保证时间轴上的连续性。3.4 阶次追踪把某个阶次的幅值随时间画出来阶次追踪是阶次分析最实用的输出之一。比如你知道某个齿轮的啮合阶次是 23想看它在升速过程中幅值怎么变就在每段阶次谱里取 23 阶附近的峰值。target_order 23; order_res N_per_rev / seg_len; idx_order round(target_order / order_res) 1; amp_track zeros(n_seg, 1); for k 1:n_seg % P_seg 是第 k 段的阶次谱 amp_track(k) max(P_seg(max(1,idx_order-2):idx_order2)); end plot(amp_track); xlabel(段序号); ylabel(幅值); title([阶次 num2str(target_order) 追踪]);取 idx_order 附近 ±2 个点取最大值是为了容忍转速波动带来的阶次微小偏移。如果转速波动大这个窗口要加宽但加太宽会把相邻阶次混进来。4. 避坑与排查阶次分析最常见的五个翻车点4.1 阶次谱上全是毛刺找不到主阶次现象重采样后做 FFT谱线密密麻麻已知阶次位置对不上。原因九成是脉冲时刻和振动信号的时间轴没对齐。采集卡两路信号如果有固定延迟角度轴就整体偏移了。解决先做互相关找脉冲和振动里同一转事件的时延补偿后再重采样。或者用同一触发源同时启动两路采集。4.2 升速段阶次幅值异常跳变现象阶次追踪曲线上某个阶次在特定转速区间突然掉下去又弹回来。原因那个转速区间正好是某个共振点或者原始信号里该阶次被噪声淹没了。还有一种可能是重采样时该段转速变化太快线性插值跟不上。解决检查原始时域信号在该区间的信噪比把重采样从线性换成样条插值如果确认是共振那这个跳变本身就是有用信息别当故障处理。4.3 N_per_rev 取小了导致高阶混叠现象明明只关心 30 阶但 60 阶附近出现一个不该有的峰。原因N_per_rev64最高分析阶次只有 3260 阶混叠到了 4 阶位置。解决N_per_rev 至少取关心最高阶次的 2 倍实际取 2.5 倍留余量。改完重跑混叠峰消失。4.4 角度域信号首尾不连续导致泄漏现象阶次谱底噪整体抬高小阶次成分被淹没。原因重采样后的角度域信号不是整转截断首尾相位不连续FFT 泄漏严重。解决加 hanning 窗或者截取整数转的数据再做 FFT两者叠加效果最好。4.5 转速脉冲丢失导致角度轴断裂现象阶次谱上出现一系列等间隔的假峰间隔对应丢失脉冲的位置。原因键相脉冲在某个转速区间丢失累积角度出现台阶。解决先做脉冲间隔检查把间隔超过中位数 1.5 倍的段标记出来用相邻脉冲线性补一个如果丢失太多这段数据直接弃用别硬补。5. 从跑通到用好阶次分析的三个进阶习惯第一个习惯是永远拿 FFT 做对照。阶次谱出来之后我会在同一段数据上做一次短时 FFT看时频图上转频脊线的走向和阶次谱的峰值位置互相印证。如果对不上先怀疑角度轴别怀疑信号。这个对照习惯帮我省过很多次「以为算法错了其实是数据接错」的时间。第二个习惯是参数扫描。N_per_rev 从 64 扫到 512seg_rev 从 2 扫到 8看阶次谱形态怎么变。真正稳定的阶次成分在这些参数下位置不变、幅值变化在 10% 以内如果某个峰随参数漂移那多半是重采样伪影不是真实成分。这个扫描过程跑一次也就几分钟但能帮你建立对参数的直觉。第三个习惯是留一份原始数据和处理链的中间结果。我一般会把 t_uniform、x_angular、每段的 P_seg 都存成 mat 文件。后面如果发现某个阶次追踪曲线不对可以逐段回查看是重采样错了还是谱计算错了。没有中间结果排查就是黑匣子。最后一个具体技巧如果你要做在线阶次追踪别每来一帧就重算整段。维护一个滑动缓冲每次只更新最新一段的阶次谱旧段的结果直接复用。这样计算量从 O(n²) 降到 O(n)在嵌入式上也能跑。我自己在一台普通工控机上用这个思路做过 512 点 N_per_rev 的实时阶次追踪单帧耗时不到 2ms。希望帮到你。本文还有配套的精品资源点击获取

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

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

免费获取报价 →
↑