☰
变转速工况下阶次分析MATLAB实现:从FFT失效到角度域重采样完整代码
2026/10/14 19:48:24 网站建设 项目流程

简介:这份资源面向振动分析与故障诊断方向的工程师、研究人员及高校学生,提供一套基于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 与 cumtrapz

MATLAB 里做角度域重采样,常见三条路:

第一条是直接用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/2+1)); 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_time
calc_angle.m脉冲转累积角度pulse_time, ttheta_cum
resample_angle.m等角度重采样t, x, theta_cum, N_per_revx_angle, order_axis
order_spectrum.m阶次谱计算x_angle, N_per_revP, order_axis
order_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 / L,L 是角度域信号长度。L 越长分辨率越高,但 L 受限于总转数。比如采了 10 转,N_per_rev=256,L=2560,分辨率就是 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/2+1); % 存起来做阶次追踪 end

这段的关键参数是 seg_rev 和 overlap。seg_rev=4 意味着每段 4 转,对应阶次分辨率 N_per_rev/(4*N_per_rev)=0.25 阶。overlap=50% 保证时间轴上的连续性。

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_order+2)); 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_rev=64,最高分析阶次只有 32,60 阶混叠到了 4 阶位置。

解决:N_per_rev 至少取关心最高阶次的 2 倍,实际取 2.5 倍留余量。改完重跑,混叠峰消失。

4.4 角度域信号首尾不连续导致泄漏

现象:阶次谱底噪整体抬高,小阶次成分被淹没。

原因:重采样后的角度域信号不是整转截断,首尾相位不连续,FFT 泄漏严重。

解决:加 hanning 窗;或者截取整数转的数据再做 FFT;两者叠加效果最好。

4.5 转速脉冲丢失导致角度轴断裂

现象:阶次谱上出现一系列等间隔的假峰,间隔对应丢失脉冲的位置。

原因:键相脉冲在某个转速区间丢失,累积角度出现台阶。

解决:先做脉冲间隔检查,把间隔超过中位数 1.5 倍的段标记出来,用相邻脉冲线性补一个;如果丢失太多,这段数据直接弃用,别硬补。

5. 从跑通到用好:阶次分析的三个进阶习惯

第一个习惯是永远拿 FFT 做对照。阶次谱出来之后,我会在同一段数据上做一次短时 FFT,看时频图上转频脊线的走向,和阶次谱的峰值位置互相印证。如果对不上,先怀疑角度轴,别怀疑信号。这个对照习惯帮我省过很多次「以为算法错了其实是数据接错」的时间。

第二个习惯是参数扫描。N_per_rev 从 64 扫到 512,seg_rev 从 2 扫到 8,看阶次谱形态怎么变。真正稳定的阶次成分,在这些参数下位置不变、幅值变化在 10% 以内;如果某个峰随参数漂移,那多半是重采样伪影,不是真实成分。这个扫描过程跑一次也就几分钟,但能帮你建立对参数的直觉。

第三个习惯是留一份原始数据和处理链的中间结果。我一般会把 t_uniform、x_angular、每段的 P_seg 都存成 mat 文件。后面如果发现某个阶次追踪曲线不对,可以逐段回查,看是重采样错了还是谱计算错了。没有中间结果,排查就是黑匣子。

最后一个具体技巧:如果你要做在线阶次追踪,别每来一帧就重算整段。维护一个滑动缓冲,每次只更新最新一段的阶次谱,旧段的结果直接复用。这样计算量从 O(n²) 降到 O(n),在嵌入式上也能跑。我自己在一台普通工控机上用这个思路做过 512 点 N_per_rev 的实时阶次追踪,单帧耗时不到 2ms。

希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询