news 2026/9/23 10:41:30

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
旋转机械振动分析:阶次分析与角度重采样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 就是每分钟转速。这里用每转中点时间作为转速的时间锚点,是因为这一转的转速值更接近中点时刻的真实值,直接挂在触发沿上会有半转延迟。interp1spline选项比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 插值方法选择的权衡

interp1linearpchip是常用组合。角度网格稀疏时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 阶次谱怎么读

阶次谱的横轴单位是“阶”(Order),1 阶就是每转一次,2 阶就是每转两次。齿轮的啮合阶次通常等于齿数,轴承外圈故障特征阶次可能是 3.2 阶这种非整数,这些特征在阶次谱上会以一根根谱线的形式出现。对比普通频谱,阶次谱最大的优势是:转速变化时,同一故障特征始终在同一横坐标位置,可以直接对多段数据做平均或趋势对比。

5. 角度重采样避坑指南:五个最容易翻车的细节

5.1 谱图上出现莫名其妙的“鬼峰”

现象:阶次谱上在某个高阶层位置冒出一根异常谱线,幅值很高,但对应的机械结构上不应该存在这个阶次。

原因:键相脉冲信号上有毛刺或丢脉冲。毛刺产生短间隔,算出来的瞬时转速瞬间飙高;丢脉冲则让间隔加倍,转速瞬间减半。相位积分把这些异常累积进去,重采样信号里就会混入周期性畸变。

解决:脉冲沿检测前先做去抖处理。常见做法是设置脉冲间隔合理范围(比如 0.5 倍到 2 倍中位数间隔),超出范围的间隔标记为异常,用前后正常值插值替换。order.m里可以加一步medfilt1rpm_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.0;2.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 阶了。

参数说明:phasecumsum生成,本质是数值积分,与后面order.m的处理路径一致。trigger_idx检测相位从 359° 回绕到 0° 的位置,这些位置就是真实键相点。生成完后建议先跑一下rpm = 60./diff(t_trigger)看看还原的转速曲线是否符合 600 到 3600 的线性趋势,这一步也能顺手验证脉冲检测逻辑。

6.2 跑 order.m 并检查阶次峰位置

把上述signalt_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%。绝大多数问题用真实数据根本看不出来,但合成验证几秒钟就能暴露。真实数据是检验手段,合成信号才是调试工具,这套流程值得固化到日常分析里,希望帮到你。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 10:41:27

深度学习OCR实战:deep_ocr环境搭建、参数调优与部署

简介&#xff1a;这是一份面向OCR学习者的深度学习项目代码包&#xff0c;内容围绕卷积神经网络与循环神经网络展开&#xff0c;覆盖图像预处理、文字检测、字符分割与识别等完整流程&#xff0c;适合想快速上手文字识别开发、了解OCR模型训练的读者。压缩包共51个文件&#xf…

作者头像 李华
网站建设 2026/9/23 10:39:17

嵌入式AI编程起点:STM32工程创建的硬件语义对齐

1. 这不是“Hello World”&#xff0c;而是嵌入式AI编程的真正起点很多人看到“第一个STM32工程”就下意识划走——不就是新建个Keil项目、点几下配置、烧个LED闪烁&#xff1f;但如果你正站在2024年嵌入式开发的门槛上&#xff0c;手里攥着AI编程工具、刚下载完DeepSeek-Coder…

作者头像 李华
网站建设 2026/9/23 10:38:44

高新技术企业认定全流程指南与核心技术指标解析

1. 企业资质认证的重要意义高新技术企业认定是我国科技创新领域的一项重要资质认证&#xff0c;它不仅仅是一张证书&#xff0c;更是对企业技术创新能力的全面检验。获得这项认证意味着企业在核心自主知识产权、科技成果转化能力、研发组织管理水平以及成长性指标等方面都达到了…

作者头像 李华
网站建设 2026/9/23 10:38:30

hypervolume_:多目标优化解集质量评估的工程实现与避坑指南

简介&#xff1a;压缩包内含三个MATLAB脚本&#xff08;mode.m、rank_sort_new.m、hypervolume.m&#xff09;&#xff0c;聚焦超体积指标在多目标优化中的应用&#xff0c;主要面向进化算法研究者、研究生以及需要量化帕累托前沿质量的开发人员。hypervolume.m 是核心代码&…

作者头像 李华
网站建设 2026/9/23 10:37:01

小波分解+深度信念网络DBN实现脑电信号分类识别MATLAB实战

简介&#xff1a;面向生物医学工程、神经科学及人机交互领域的研究者&#xff0c;这份MATLAB代码包将小波分解与深度信念网络&#xff08;DBN&#xff09;相结合&#xff0c;针对脑电信号&#xff08;EEG&#xff09;实现手部动作分类识别。小波分解能够同时给出信号的时间与频…

作者头像 李华
网站建设 2026/9/23 10:35:16

OkHttp核心机制深度剖析:拦截器、连接池与缓存策略

聊到Android网络层&#xff0c;绕不开OkHttp。这个由Square团队开源的HTTP客户端&#xff0c;几乎成了整个Android开发圈的事实标准——Retrofit的网络请求默认交给它执行&#xff0c;Glide的图片下载底层也借了它的力&#xff0c;市面上绝大多数App的请求背后都有它的影子。这…

作者头像 李华