
简介面向从事变转速设备状态监测与故障诊断的工程师和研究人员这份MATLAB代码资源围绕脉冲转速、阶次分析与阶次跟踪等关键技术展开适用于风机、电动汽车电机等旋转机械在变速工况下的振动信号处理与故障特征提取。压缩包内共2个文件均为.m脚本覆盖振动信号预处理、脉冲时刻识别、等角度重采样、数字跟踪滤波与样条插值等核心环节可帮助读者完整复现阶次分析流程并在此基础上根据自身数据调整参数完成变转速故障的识别与诊断验证。资源包仅4KB轻量精简适合具备一定MATLAB和信号处理基础的学习者参考。目前已有1060人学习下载代码结构清晰、可直接运行是理解变转速阶次跟踪算法与开展二次开发的实用工具。1. 变转速故障诊断为什么要换到阶次域风电主轴承、电驱压缩机和车辆传动系统里设备很少老老实实转在额定转速上。升降速、负载波动带来的变转速工况让传统的定频FFT分析变得很难看转频在变啮合频率在变边带在变频谱上所有特征都在“漂”。你盯着一个0500Hz的频谱找故障特征其实谱线已经被转速均值抹平了时域波形的周期性也被打散所谓“频率模糊”就是这么来的。这不是数据质量的问题是分析坐标系选错了。阶次分析把振动信号从“时间-频率”伪坐标重新映射到“角度-阶次”坐标让每个机械事件重新对齐到转子的固定转角位置这样转速变化不再干扰特征提取故障成分变成相对转频的稳定比例。它解决的根本问题是变转速下故障特征不是藏在某个固定Hz频率上而是藏在某个固定“阶次”上。做变转速故障诊断的工程师手里必须有一套能在脉冲转速信号驱动下完成等角度重采样和阶次提取的流程这正是本资源两个MATLAB脚本的核心价值。适合做过基本振动测试、想往阶次域深挖的现场诊断或算法工程师。2. 脉冲转速的处理从脉冲时刻到瞬时转速2.1 脉冲转速信号的特征与采集前提脉冲转速信号通常来自键相传感器或编码器Z相每转过一圈输出一个窄脉冲个别场合用多齿齿轮会产生每转数个脉冲。对阶次分析来说需要的不是转速表上的平均值而是每一个转的精确时间戳。这里的关键是理解脉冲信号只在你采样点的离散栅格上出现脉冲真正的时刻可能在两个采样点之间直接用样本下标算转速会引入量化误差。转速越高一个脉冲周期内的采样点越少这种误差越显著在高转速段会导致计算的瞬时转速出现锯齿状波动。所以在提取脉冲时刻之前先确认你的数据采集是否满足两个前提脉冲通道采样率足够高至少是最高转速下脉冲频率的20倍以上以及脉冲信号经过了硬件整形——方波上升沿陡峭、幅值固定。否则后续所有等角度计算的精度都会打折扣。2.2 脉冲边沿提取自适应阈值和滞回判断第一个脚本函数的核心任务是从原始脉冲通道里找到每个上升沿的位置。直接用一个固定阈值找过零点是新手最常见的错误脉冲幅值波动、毛刺和工频干扰都会导致误触发。我一般用两级滞回自适应阈值先取整段信号的峰值和谷值阈值上限设为峰值的60%下限设为峰值的30%只有信号从低于下限跳变到高于上限时才记一个有效边沿。function edge_idx detect_pulse_edges(pulse, fs) % pulse: 原始脉冲电压信号fs: 采样率(Hz) th_hi 0.6 * max(pulse); th_lo 0.3 * min(pulse); edge_idx []; state 0; for k 2:length(pulse) if state 0 pulse(k) th_hi state 1; edge_idx(end1) k; % 记录上升沿对应的样本下标 elseif state 1 pulse(k) th_lo state 0; end end % 在边沿前后做线性插值把脉冲时刻细化到亚采样点 for m 1:length(edge_idx) k edge_idx(m); t_frac (th_hi - pulse(k-1)) / (pulse(k) - pulse(k-1)); edge_idx(m) (k - 1 t_frac) / fs; end end这段代码前半部分完成滞回状态机检测后半部分用上升沿前后两点做线性插值把触发时刻精化到采样间隔以内。参数上阈值比例可以根据实际信号调整如果现场信号干扰大把下限降到10%增大滞回窗口如果信号很干净两个阈值可以都设到50%附近减少相位偏移。注意这里返回的edge_idx已经是秒为单位的时间向量了这一点在后边计算转速时至关重要很多人的代码错在把样本序号当时间直接用。2.3 瞬时转速计算与平滑拿到相邻脉冲的时间差dt后瞬时转速可以这样算rps 1 ./ dt再乘以60得到RPM。但直接这么算出来的转速噪声很大原因有两个一是脉冲间隔的量化误差在高速段被放大二是机械本身的扭转振动会让脉冲间隔产生真实的高频抖动。需要区别对待前者要平滑后者是物理信号不能抹掉。折中的做法是先用35点的中值滤波去掉毛刺再做一次轻量级滑动平均窗口对应的角度不超过45度这样既不影响后续角域分析的跟踪精度又不会让转速信号抖到无法积分。dt_pulse diff(edge_idx); rps_raw 1 ./ dt_pulse; t_rpm (edge_idx(1:end-1) edge_idx(2:end)) / 2; % 转速点取在两个脉冲中点 rpm_filt medfilt1(rps_raw * 60, 5); rpm_smooth movmean(rpm_filt, 3);这里t_rpm不能取前一个脉冲的时间否则每个转速点会整体偏移一个脉冲周期后续相位积分会产生累积误差。转速曲线最终要插值到均匀时间网格上插值方法用pchip而不用spline因为spline容易在转速突变处产生过冲导致计算出的等角度时刻出现反向跳变。这一步输出的t_rpm和rpm_smooth就是下一章等角度重采样的输入。参数建议值说明脉冲采样率≥20×最高脉冲频率保证每转分辨力阈值上限60%峰峰值滞回升沿判定阈值下限30%峰峰值避免毛刺误触发中值滤波点数5去除单个坏点转速平滑窗口3点等效转角≤45°3. 等角度重采样阶次分析的地基3.1 为什么FFT在变速下失效等角度如何解决FFT的前提是等间隔采样常规采集卡给的是等时间间隔的样本。恒定转速下等时间间隔恰好对应等角度间隔所以频谱里的频率分量能直接映射成机械阶次。但转速一变每一转占用的时间不同同一阶次在不同时刻对应的瞬时频率不同整段FFT把这些不同频率的能量累加到一个宽带上就抹平了故障特征。等角度重采样的思路很直接重新在信号的相位轴上均匀取值使得每转的样本数固定重采样后的信号在角度域是周期性的再做FFT或阶次谱谱线位置就与转速无关了。这一思想是所有商用阶次分析模块的共同内核区别只在相位计算和插值细节上。3.2 等角度时刻计算相位积分与反解等角度重采样的核心是求出“转子每转过固定角度Δθ时对应的时间点”。方法是对瞬时转速做积分得到累计转角然后在累计转角轴上等间距找时间点。转速曲线rpm_smooth是在均匀时间网格上的先把它转成每秒弧度数omega rpm_smooth / 60 * 2*pi再做累计积分得到相位theta cumtrapz(t, omega)。现在手里有theta(t)的采样值但你要的是t(theta)——相位反函数。插值的时候要把自变量和因变量对调拟合出t关于theta的函数关系再用它在目标相位序列上求值。function t_theta compute_theta_time(t, rpm, samples_per_rev) % 输入等时间间隔t和转速rpm(r/min)返回每转过1/samples_per_rev转的时间点 omega rpm / 60 * 2 * pi; % 角速度 rad/s theta cumtrapz(t, omega); % 累计转角 rad % 目标等角度序列均匀覆盖整段累计转角 theta_target (0:samples_per_rev) * (2*pi/samples_per_rev); theta_target theta_target(theta_target theta(end)); % 反函数插值以theta为自变量t为因变量 pp pchip(theta, t); t_theta ppval(pp, theta_target); endppval在相位序列上求值得到等角度对应的时间点t_theta它的长度就是这段数据对应的总转数乘以每转采样数这个长度信息后面用来设定阶次谱的频率分辨率。参数samples_per_rev直接影响最高可分析阶次根据奈奎斯特准则最高有效阶次等于每转采样数的一半。工程里取1024点/转就可以覆盖绝大多数齿轮箱故障的啮合阶次如果只需要诊断转频相关故障256点/转就够了计算量小很多。相位积分必须用cumtrapz而不是假设计数下标做比例缩放因为转速是时变的线性近似只有在转速变化很小的短段内才成立。3.3 重采样插值方法与MATLAB实现得到t_theta之后用原始振动信号x在这些时间点上插值。插值方法的选择直接影响角域信号的波形保真度线性插值速度快但会引入高频噪声导致阶次谱上出现虚假的高阶分量pchip保单调、不会过冲适合冲击类故障的角域重构spline最光滑但可能在转速突变处产生振铃。做故障诊断我默认pchip。fs 20000; % 原始采样率 Hz x_theta interp1(t, x, t_theta, pchip);插值完成后检查一下x_theta的长度和每转采样数是否匹配预期。如果不匹配绝大多数情况是转速曲线积分误差或脉冲丢失造成的相位漂移具体排查方法在第5章讲。这里有个容易忽视的细节原始振动信号和转速脉冲必须来自同一采集系统的同一时间基准否则时间轴错位直接导致相位错乱做出来的角域信号是完全错误的。插值前的信号最好经过抗混叠滤波因为等角度重采样实际上改变了采样率原始信号中高于新奈奎斯特频率的成分会被折叠到低阶次上表现为主阶次附近出现异常的镜像边带。3.4 阶次谱怎么看1X、2X、0.49X等角度重采样完成后对x_theta直接做FFT横轴单位不再是Hz而是“阶次”——相对于转频的倍数。1阶对应转频不平衡、轴弯曲2阶常见于不对中、两叶片风机气动激励齿轮啮合阶次等于齿数Z比如一个31齿的小齿轮会产生31阶及其倍频。阶次谱的好处在于无论转速是3000还是6000这些谱线位置不变这是变速诊断的核心判据。需要注意阶次分辨率等于1 / 总转数如果只采了10转相邻阶次分辨率是0.1阶那0.49和0.5的边带就分不开。现场一般要求分析的低阶成分明确时保证至少20转以上否则需要使用下一章的阶次跟踪技术配合窄带分析。阶次成分常见激励源诊断关注点0.5X转频半频涡动、松动出现即异常1X不平衡、弯曲、轴线不对中幅值随转速变化规律2X不对中、电磁激励常与1X同时升高齿数Z齿轮啮合边带反映齿面故障分数阶轴承滚动体缺陷不等于整数阶注意分辨率4. 阶次跟踪转速变化下的稳定提取4.1 从阶次谱到阶次跟踪等角度重采样之后的整段FFT能告诉你“整个变速过程中哪些阶次能量高”但没法告诉你“某个阶次在升速过程中什么时刻开始恶化”。阶次跟踪解决的就是这个问题动态跟踪目标阶次的幅值和相位随时间或转速的变化。它和阶次谱的区别在于阶次谱是全局平均阶次跟踪是局部提取。实际诊断中很多故障的早期特征只在特定转速区间出现比如某临界转速附近的共振放大用一个概谱是看不到的必须用跟踪方法把转速-阶次-幅值三维图展开。4.2 用短时窗做离散阶次提取等角度域的信号满足周期性所以阶次跟踪可以简化成在角度域做短时傅里叶变换然后在每个时间窗内取目标阶次附近的谱峰。设fsr为每转采样数目标阶次为order_k则它在角域FFT中的谱线位置是order_k / fsr * NN为窗长度。窗长决定了阶次分辨率和时间分辨率的折中窗越长阶次带宽越窄能分辨更接近的阶次但该时间窗内转速变化不能太大窗短则响应快但谱泄漏严重。常规做法是固定每转采样数不变窗长设为1转或2转对应的样本数。这样在任何转速下分析带宽都以“转”为单位物理意义一致。function [order_amp, time_out] track_order(x_theta, fsr, order_target, win_rev) % x_theta: 等角度重采样后的角域信号 % fsr: 每转采样数, order_target: 目标阶次, win_rev: 窗长(转数) win_len round(win_rev * fsr); hop round(0.5 * fsr); % 每半转滑动一次 n_seg floor((length(x_theta) - win_len) / hop); time_out (0:n_seg-1) * (hop / fsr); % 窗中心对应的转数 order_amp zeros(n_seg, 1); freq_bin order_target * fsr; % 目标阶次在归一化频率中的位置 for k 1:n_seg seg x_theta(k*hop1 : k*hopwin_len); seg seg .* hann(win_len, periodic); X fft(seg, win_len * 4); % 4倍补零细化谱峰 idx round(freq_bin / (fsr * 4) * win_len * 4) 1; order_amp(k) abs(X(idx)); end end这段代码其实是在纯角域做短时谱峰提取。补零不增加真实频率分辨率但能让谱峰的位置读数更平滑。窗函数必须用周期窗hann(...,periodic)普通对称窗在短窗下不对称会在幅值估计里引入纹波。win_rev取1.52转比较稳小于1转时泄漏太大幅值误差超过20%。如果你的信号里有两个很接近的阶次需要区分比如0.49X和0.5X就得把窗长加到4转以上代价是丢失转速快速变化段的时间细节。4.3 窄带跟踪滤波与包络提取短时FFT在阶次间隔较大、信号平稳时够用但遇到转速剧烈变化或故障特征本身调制性强的情况我倾向直接用等角度域的窄带带通滤波器来跟踪目标阶次。核心思路是在角域中目标阶次是固定频率所以只需要设计一个中心频率固定的带通滤波器然后对整段角域信号滤波。这比在时域里跟踪时变频率要简单得多也是等角度重采样的另一个好处——滤波器系数可以不变。fsr 1024; % 每转采样数 order_k 1; % 跟踪1阶 bw 0.02; % 阶次带宽 ±0.02阶 [b, a] butter(2, [ (order_k-bw)*2/fsr, (order_kbw)*2/fsr ]); x_track filtfilt(b, a, x_theta); % 零相位滤波避免相位畸变 env abs(hilbert(x_track)); % 包络反映该阶次幅值随时间变化带宽bw的取值决定分离能力和对转速变化的容忍度。取0.02阶时1阶跟踪能覆盖0.981.02阶的微小转频波动如果转速控制精度差或脉冲提取有抖动就放宽到0.05阶。butter二阶滤波器的好处是零相位通过filtfilt实现相位延迟不会污染后续包络分析的时序。包络信号的峰值对应转子每转中该阶次能量最强的位置对不平衡故障来说包络的波动率直接反映不平衡相位稳定度对齿轮磨损1阶包络出现周期性调制则暗示啮合面存在局部缺陷。5. 项目脚本拆解与自检验证5.1 f7f71bf56db507afa6333cc2cb888421.m 的功能定位压缩包内两个同名不同后缀的.m文件从命名规则看大概率是同一功能脚本的两个迭代版本无(1)后缀的是初始版本带(1)的是修改或修正版。资源描述中列出的功能步骤——脉冲时刻寻找、等角度时刻计算、数字跟踪滤波、样条插值——正好对应本文前四章的完整链路因此这两个脚本应该是把整条阶次分析流程封装成了可直接运行的函数或脚本。具体是函数还是脚本打开文件看第一行如果是function开头说明是带输入输出接口的函数如果直接是数据读取和逐段命令则是面向特定数据文件的流程脚本。5.2 运行前必须确认的数据接口运行这类脚本前最容易踩的坑是数据格式不匹配。建议按以下顺序检查变量fs或sf是否定义、振动信号变量是列向量还是行向量、转速通道是脉冲信号还是已经是转速数值、时间轴是否存在。如果脚本里有samples_per_rev、order_max这类参数确认它们与你的数据相符。对于(1)版本建议先跑初始版本如果不报错但结果可疑比如阶次谱无主峰、转速曲线突变再跑修正版对比改动逻辑。% 运行前自检示例列出当前工作区的关键变量 whos fs t x pulse rpm % 检查是否存在必要变量以及尺寸两个版本如果都可用一个合理的用法是用初始版本跑历史数据做基准频谱用修正版跑新采集的数据做故障跟踪避免因算法细节差异导致新旧数据对比失真。5.3 用合成扫频信号验证链路正确性拿到别人的脚本第一步不是直接套真机数据而是拿一个“答案已知”的仿真信号验证每个环节输出是否正确。下面这个测试信号模拟从600RPM线性升速到2600RPM、持续10秒的转子包含1阶转频分量和幅值恒定的2阶故障分量脉冲信号用方波模拟每转一个脉冲。fs 20000; t_end 10; t 0:1/fs:t_end; rpm 600 200 * t; % 线性升速 600→2600 RPM phase cumtrapz(t, rpm/60*2*pi); % 相位积分 x sin(phase) 0.4 * sin(2*phase); % 1阶 2阶故障 pulse 0.5 * (square(phase) 1); % 每转一个脉冲的方波信号把它喂给脚本里的脉冲提取和重采样函数理想的角域信号应该是幅值比1:0.4的周期信号阶次谱在1阶和2阶处出现两根谱线幅值比约等于1:0.4。如果2阶幅值偏差超过10%优先检查脉冲时刻插值是否做了亚采样修正如果阶次谱出现非整数倍频分量优先检查插值方法是否用的spline过冲导致。这套验证方法每次改参数后跑一遍能快速定位是算法问题还是真机数据问题避免把正常信号误诊成故障。本文还有配套的精品资源点击获取