ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ITD分解原理与实战:故障信号诊断如何识别轴承齿轮冲击特征

ITD分解原理与实战:故障信号诊断如何识别轴承齿轮冲击特征 简介ITD分解瞬时时间差分是机械故障诊断中常用的信号处理技术能从复杂的振动或状态信号中分离出携带故障特征的不同分量广泛用于旋转机械、轴承等设备的早期异常识别。这一MATLAB代码包面向故障诊断与信号处理学习者提供了完整的ITD分解演示程序涵盖基函数分解、极值点提取等核心算法模块并通过示例脚本连贯展示从原始信号到分解结果的完整流程代码紧凑、无冗余依赖便于逐行理解算法逻辑并快速改造。压缩包共5个文件全部为.m脚本整体仅4KB非常适合在MATLAB环境中直接阅读和运行通过运行示例可直观观察信号被逐层拆解的效果进一步印证ITD处理思想。配合widevcb相关策略可明显改善宽频带信号的分解效果增强故障特征的可辨识度。目前已有452人学习适合作为ITD理论入门、故障特征提取实验或相关课题二次开发的基础工具也能帮助工程人员减少设备停机时间、提升维护效率。1. ITD分解是干什么的故障信号诊断为什么要盯上这个解压包拿到的这个ITD分解.zip解开之后核心就一件事把一段非线性、非平稳的故障信号拆成若干个单分量的“旋转成分”让轴承故障、齿轮断齿、断路器机械动作这类冲击特征从噪声里显形出来。ITD 全称是固有时间尺度分解和 EMD 是同类方法但它用“基线信号”代替包络均值不靠样条拟合因此比 EMD 快也少很多包络过冲的毛病。对于做故障信号分解的工程师它尤其适合处理振动信号里冲击成分密集、噪声底较厚的场景。这篇笔记按我实际跑通这类代码包的路径来写先从原理上明白 ITD 拆了什么再讲怎么把 zip 里的代码和数据跑起来最后把参数调节、踩坑和结果验证一次说清楚。适合手里有故障数据、想找出故障特征频率但还不想一头扎进论文公式里的工程师。2. 从EMD到ITD故障信号分解换一种切分方式好在哪2.1 ITD的原理拆解基线信号和PRC分量是怎么来的ITD 的思路可以压缩成一句话把一个信号反复拆成“基线”和“余量”两层然后对基线继续拆。假设原始信号是 x(t)第一次分解得到 x(t) L(t) H(t)。这里的 L(t) 叫基线信号它由信号的局部极值点通过分段线性插值构造H(t) 就是第一个固有旋转分量也就是包里的 PRCProper Rotation Component。关键差别在于 EMD 的包络均值需要先做三次样条包络再求平均而 ITD 直接把这些极值点用直线连起来当基线。别小看这个差别直线插值没有样条的“过冲”也不会在信号突变时产生包络交叉计算量大幅下降。更重要的是振动故障信号的冲击成分在时域上就是极值点的突变用极值直接构造基线等于把冲击和低频趋势从第一层就分开。分解是递归进行的。拿到 L(t) 后把它当作新的信号再重复同样的操作得到第二个 PRC 和第二条基线。不断往下直到基线变成单调趋势或极值点数量少到无法继续分割。最终结果是一组 PRC频率从高到低排列加上最后一个趋势项。有一点容易忽略ITD 要求每个 PRC 的局部极值点严格正负交替。如果两个最大值中间没有最小值线性连线就会失真这个我们后面在坑里详细说。初次接触时可以把 ITD 理解为一个“自适应的、基于极值点的带通滤波器组”它不预设频带而是根据信号自身的时间尺度去切分。2.2 同场竞技ITD、EMD、VMD谁更适合冲击类故障我经常被问到已经有 EMD有 VMD为什么还要用 ITD这个问题不能只看论文里的对比图得看你的实际用途。下表是我在处理滚动轴承和断路器振动信号时的直观对比方法计算速度端点效应模态混叠风险参数依赖适合场景EMD慢样条拟合迭代多严重高冲击下尤甚少探索性分析不追求实时VMD中等较轻可控模态数K、惩罚因子α频带较稳定的信号ITD快线性插值无迭代拟合中等需延拓比EMD低比VMD高层数、停止条件冲击特征、在线诊断EMD 的问题在于包络拟合对极值点分布极敏感一旦信号中出现强冲击包络会出现局部畸变导致一个冲击被劈到两个相邻模态里。VMD 的好处是频带清晰但必须先预设模态数 K故障信号里冲击的频带其实随时间变化K 设错了结果就差很多。ITD 的定位恰好在这两者之间它是自适应的不需要预设频带数通过停止条件控制层数又因为用了线性基线速度比 EMD 快一个量级非常适合需要快速迭代的故障诊断场景。2.3 把ITD写成最小可跑的MATLAB函数下载的 zip 里核心函数通常封装得比较复杂逻辑都在子函数里。如果你只想验证 ITD 的效果或者想改参数可以先写一个教学版跑通思想。下面这段是我常用的最小实现function [PRCs, trend] itd_decompose(x, max_layers) % 简化版固有时间尺度分解 % 输入: x 一维信号向量, max_layers 最大分解层数 % 输出: PRCs 每列一个旋转分量, trend 单调趋势项 x x(:); PRCs zeros(numel(x), 0); residue x; for k 1:max_layers % 1. 检测局部极值点并保证极大极小严格交替 max_idx find(islocalmax(residue)); min_idx find(islocalmin(residue)); loc sort([max_idx; min_idx]); if length(loc) 3 trend residue; % 极值点不足无法继续分解 break; end % 2. 用极值点做分段线性插值得到基线信号 val residue(loc); L interp1(loc, val, 1:numel(residue), linear, extrap); % 3. 本层PRC是原信号减基线 h residue - L; PRCs(:, end1) h; %#okAGROW residue L; % 对基线继续分解 end trend residue; end代码逻辑分三步找极值、线性插值构造基线、原信号减基线得到 PRC。参数说明max_layers直接控制最多分解几层设太大会在后期噪声段上继续拆常见取值 5 ~ 8 层islocalmax和islocalmin是 MATLAB 2017b 以后自带的数值函数不需要额外工具箱。需要说明的是这个教学版没有做极值交替校验如果你观察到某个 PRC 里极大值旁直接跟了另一个极大值说明需要补校验逻辑这正是真实代码包里子函数在干的事。3. 把ITD分解.zip跑起来文件定位、最小启动与输出读法3.1 解压后先干三件事找入口、找数据、找参数拿到这个 ITD 分解的 zip常见的做法是解压后先不要急着运行先看目录里有什么。一般来说包里至少会有一个主分解函数名字里带itd的 .m 文件、一个 demo 或测试脚本、一个示例数据文件以及一份 README 或注释文档。示例数据文件名里有widevcb我推测它是一段和真空断路器机械动作相关的宽频振动信号但具体采集工况以包内说明为准。你拿到包后第一步是确认三件事入口是哪个脚本、示例数据加载后是什么变量、主函数需要哪几个参数。小程序最容易踩的坑是路径zip 解压后直接双击脚本MATLAB 当前工作目录不对就会报Undefined function or variable。我一般会先建一个文件夹专门放解压内容然后右键设置当前文件夹或者用命令行cd进去再跑避免变量被工作区里已有同名变量污染。3.2 最小启动流程从demo脚本到第一张分解图假设包内有一个demo_ITD.m测试脚本。在命令行里这样起步cd ITD分解 ls -la matlab -nodisplay -nosplash -nodesktop -r run(demo_ITD.m);这段命令适用于 Linux 或 macOS 下通过命令行跑 MATLAB。-nodisplay和-nosplash是为了不弹窗口适合批量调试-r让 MATLAB 启动后直接执行脚本。如果是 Windows双击 demo 脚本即可但也要先确认当前文件夹在解压目录下。跑起来之后脚本通常会画出原始信号和分解后的 PRC 波形。如果你的信号采样率是 20 kHz一个 PRC 图画出来在 0.1 秒内有多个冲击峰说明分解初步有效。如果只有一条近乎平坦的线大概率是参数层数设太浅或者输入信号已经被人为滤波过度。3.3 输出怎么读PRC、趋势项和瞬时特征的分工ITD 的输出结构很固定一组 PRC 加一个趋势项。PRC1 频率最高通常包含齿轮啮合频率、轴承外圈通过频率这类高频冲击越往后频率越低最后一个趋势项基本是直流或缓变趋势。故障诊断时我们关注的是故障特征频率所在的那个 PRC而不是所有分量。举例滚动轴承外圈故障理论故障特征频率是 BPFO振动冲击会以 BPFO 为间隔重复出现。这个特征可能在 PRC2 或 PRC3 里表现得最明显因为在原始信号里它被强的转频成分淹没。你可以在每个 PRC 的时域波形里数一数冲击间隔换算成频率看是否和 BPFO 一致这是最原始的验证方法。3.4 示例数据widevcb到底怎么用widevcb这个变量名在包里很可能是一个 mat 文件。你可以在命令行里这样查看load(widevcb.mat); % 假设文件名如此 whoswhos会显示工作区里的变量名、大小和类型。常见情况是数据以结构体形式保存例如data.signal和data.fs也可能是两个独个向量。我一般会先绘制原始信号的前 1 秒感受冲击周期和噪声底。如果数据量很大比如采样率 200 kHz、十几秒建议先截取一段做分解否则整个序列分解会非常慢。也不要直接对原始数据做 ITD先去掉均值和趋势大分量能让 PRC 更集中。4. ITD的三个必调参数噪声容限、端点处理和停止条件4.1 噪声容限决定的是“伪分量”还是“微弱故障特征”真实 ITD 算法在构造基线之前会先判断某个极值点是不是真实的转折点而不是噪声引起的毛刺。这个判断用到的阈值就是噪声容限。容限设太低噪声锯齿也会被当成极值点基线跟着噪声走分解出的高频 PRC 会像白噪声设太高会把真实弱冲击当成噪声滤掉小损伤的故障特征就丢了。这个参数在包里可能叫noise_tolerance、alpha或sigma。我调试它的方法是先设一个较高的容限看分解出的 PRC 是否稳定再逐步降低容限直到某个 PRC 的包络谱里出现规则的故障特征频率峰。如果降容限后没有新增有意义的分量而是多出一堆噪声分量就说明已经过了临界点。轴承微弱早期故障容限通常比默认值小 20% ~ 30%但纯粹的经验值不可照搬要和包络谱互相验证。4.2 端点效应抑制镜像延拓和特征波延拓怎么选ITD 和 EMD 一样在信号两端最不可靠。因为极值点插值在端点外推时没有数据约束基线的端部很容易上扬或下垂产生假冲击。包内的完整代码大概率会在极值点序列两端延拓后再插值常见两种延拓方式镜像延拓把信号端点附近的波形关于端点做镜像构造出额外的极值点适合平稳段较长的信号。特征波延拓取端点附近一个周期长度的波形作为模板复制到两端适合周期冲击明显的故障信号。我的选择习惯是如果原始信号是连续旋转机械轴承、齿轮用特征波延拓如果是瞬态动作信号断路器合分闸用镜像延拓。因为瞬态信号本身只有一段冲击镜像延拓保留了冲击形状不会额外引入一个“假的周期”。这个参数调好以后端点处的 PRC 振幅应自然衰减到内部水平的量级而不是端点处冒出一个尖峰。4.3 停止条件与最大层数别把过分解当成高精度加大max_layers并不是让分解更精细反而会让算法在噪声段继续生掰出没有物理意义的分量。我见过有人把最大层数设到 12结果 PRC8 以后的波形幅值只有原始信号的 0.1%全是噪声。判断停止条件是否合适的标准是最后一个非趋势分区里极值点数量是否还足够多以及该分区的能量占比是否低于总能量的 1%。包里的实现通常在三个地方设停止条件迭代层数上限、基线单调性判断、PRC 能量比例下界。如果你看到代码里有if energy_ratio 0.01这样的判断别把它改得太小否则会有大量伪 PRC 进入输出。对于大多数机械故障信号6 层已经足够前 4 层覆盖故障冲击相关高频第 5 层接近转频第 6 层以后基本是趋势项。给一个可落地的调参建议先固定噪声容限用 3 层跑出第一个结果观察冲击是否清晰若清晰再加到 6 层看是否出现新信息每加一层都要对比新 PRC 的频谱和上一层的频谱是否高度重叠如果是说明那两层本不该被拆开应减少层数。5. ITD分解避坑指南四类高频踩坑记录与现场修复5.1 现象分解出的PRC比原来还多高频分量像白噪声这是我第一次跑 ITD 时最直观的翻车现场输入是一段 8 秒的轴承振动信号输出却有 9 个 PRC前两个 PRC 波形和随机噪声没有区别。原因不是算法坏了而是噪声容限设得过低大量由随机噪声造成的局部极值点进入了基线提取ITD 把噪声当成真正的振荡模式拆了出来。解决先检查噪声容限参数调回默认值再逐步收紧同时确认信号在传入 ITD 前没有高频干扰。如果你不想动原信号也可以只保留能量占比超过 1% 的 PRC把噪声分量从结果里剔除。判断标准是有效 PRC 的包络谱里应该能找到明确的陡峭峰而噪声 PRC 的频谱是宽而平的。5.2 现象冲击特征在相邻PRC之间来回跳更绕的坑是模态混叠同一组冲击在 PRC1 里出现几个又在 PRC2 里出现几个单独看每个 PRC 都不完整。原因在于极值点检测没有做严格极大极小交替校验。若极值序列中连续出现两个极大值点它们之间的基线会被抬高真实冲击会被拦腰截断能量分配到了两个相邻分量里。解决在代码里增加极值交替过滤检测到两个相同类型的连续极值点时保留幅值更大的那个不然就改变基线插值方式。如果不想改造包内函数可以先用一个带通滤波器把信号限制在故障特征频率附近再送 ITD减少高频干扰对极值点分布的影响。5.3 现象端点处出现大振幅包络谱出现低频假峰花两天时间调参后来发现 PRC 两端各出现一大段大幅正弦状振荡做包络谱后低频处冒出一个不存在的峰值就是这个坑。根因在端点延拓信号较短时端点外推的基线近似线性直冲和信号真实走势严重背离导致首尾 PRC 被污染。解决所有结果分析都要把首尾各 1/10 长度丢掉或者在做 ITD 前给信号两端加一个对称窗相当于人为抑制端点权重。但加窗别用矩形窗用正弦窗更平滑。还有一个补救办法取数据时故意在两端各多采 2000 点分解完只保留中间段等于是把端点污染段“预切除”。这是我推荐的做法比任何延拓算法都省心。5.4 现象循环到一半报“数组越界”换台机器结果就变运行中出现Index exceeds array bounds是 ITD 代码里最常见的运行时错误。原因通常是残差信号的极值点数量小于插值节点数或者分解后期信号长度不足某个子函数还在按初始点数分配数组。不同 MATLAB 版本对空数组的容错行为不一样所以换台机器后错误报法还会变化非常玄学。解决在每次循环开头检查极值点数量少于 5 个就强制停止同时在插值行前后打印当前极值点数和信号长度定位是哪一个子函数越界。如果是迭代次数过多导致残差为纯线性斜率也需要单独判断并跳出循环。这个修复不是投机取巧是 ITD 这类递归分解的刚性约束。6. 用好ITD的最后一公里包络谱验证与分量自动筛选6.1 对PRC做包络谱把故障特征频率量化出来时域上看出冲击只是主观感受最终录进报告里的一定是故障特征频率的谱峰。有了 ITD 的 PRC 后下一步对选定的分量做希尔伯特包络解调再对包络做 FFT。下面这段代码我通常直接接力在分解后面% 对第2个PRC做包络谱定位故障特征频率 p PRCs(:, 2); env abs(hilbert(p)); % 希尔伯特包络 f (0:length(env)-1) / length(env) * fs; plot(f(1:fs/2), abs(fft(env(1:fs/2)))); xlabel(频率 (Hz)); ylabel(幅值); % 对照理论特征频率例如BPFO 123.4 Hz看谱峰是否对齐逻辑说明hilbert求解析信号并取绝对值得到包络包络的 FFT 峰值出现在调制频率处也就是故障特征频。plot只画到奈奎斯特频率的一半因为机械信号能关心的频带就在这段。参数说明p选择哪个 PRC 需要预判一般从第一个分量开始逐个看直到找到谱峰最尖锐的那个。6.2 按能量占比自动筛选有效PRC不再靠肉眼挑分量挑 PRC 靠肉眼很不现实数据一多就累。我维护了一个自动筛选逻辑计算每个 PRC 的能量占全部分量总能量的比例按从高到低累加直到累计能量占比达到 90%这部分 PRC 视为有效分量其余丢弃。然后再在有效分量里找包络谱峰值最突出的那一个作为诊断依据。这个技巧让批量跑几百组数据时不需要人工介入也顺便解决了噪声容限没调到最佳时产生的伪分量干扰。放在整条 ITD 信号分析流程里我最终沉淀下来的习惯是先给定保守的 6 层分解自动筛能量占比再对有效分量做包络谱把谱峰和理论故障特征频率对照误差在 1% 以内就下结论。这套流程我用了很久最大的体会是分解阶段不用追求绝对正确只要保留住真实冲击剩下的交给包络谱验证。任何把 ITD 当成黑匣子的用法都会在故障诊断时翻车但如果你每次结果都留一层检查坏参数永远不会骗你太久。希望帮到你。本文还有配套的精品资源点击获取
返回列表