ARTICLE DETAIL

资讯详情

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

TET暂态提取变换:一维振动信号转二维图像的轴承故障诊断

TET暂态提取变换:一维振动信号转二维图像的轴承故障诊断 简介面向工业故障诊断与状态识别场景这份资源提供了一整套基于暂态提取变换TET的Matlab实现代码用于将一维传感器信号转换为携带瞬态特征的二维图像从而适配深度学习模型的训练需求。包内共18个文件包括7个核心算法脚本、2个Mat数据文件和9幅可视化示例图整体压缩包仅3.15MB轻量实用便于快速迁移到不同实验环境。暂态提取变换擅长刻画信号中的非线性和非平稳成分相比直接输入一维波形转换为二维图后能为故障特征提取提供更直观的表示。目前已有75人学习下载适合机械设备健康监测、旋转机械故障诊断以及智能状态识别方向的科研人员与工程师。读者可围绕主程序梳理信号读取、暂态变换到图像生成的完整链路使用带噪样本集验证算法鲁棒性并借助示例图对特征可视化结果进行直观调优与效果评估。1. 暂态提取变换TET一维振动信号转二维图像的真实场景做轴承故障诊断的人基本都会碰到同一个问题传感器采回来的是一维振动信号但深度学习模型训练时更希望输入二维图像。硬把一维数组拉成矩阵送进 CNN模型看到的只是幅值分布冲击故障那种“瞬态突变”发生在哪个时刻、哪条频带信息全被淹没在长序列里。TETTransient-Extracting Transform暂态提取变换解决的就是这个转化问题它把一维时域信号变成一张时频图横轴是时间、纵轴是频率、颜色深浅表示能量强弱故障冲击在图上会形成一条清晰的亮线或亮斑。这套 Matlab 代码加数据把“原始信号 → 参数设置 → 暂态提取 → 二维图像输出”完整串起来了不需要再从零写时频分析。适合两类人一类是做轴承、齿轮箱故障诊断但卡在深度学习输入格式上的研究生另一类是已经在跑 CNN 分类但准确率上不去、想换一种输入表示的工程师。压缩包里除了几个样本图像外还有七个 .m 函数文件和两个 .mat 数据文件每个函数干什么、参数怎么调下面逐个拆开讲清楚。2. 工具箱文件地图七个函数各管哪一段主程序怎么串2.1 main.m 与 TET_Y.m主干流程是怎么串起来的先打开压缩包排第一的是 main.m这是整个流程的入口。常见的运行方式是直接在 Matlab 命令行敲 main 或者在编辑器里按 Run它按顺序完成加载数据 → 构造时频分析参数 → 调用 TET_Y 得到二维时频表示 → 把结果画图并存成 png。TET_Y.m 是整个包的核心名字里的 Y 说明它是在同步压缩变换基础上改的暂态提取版本。它的作用和一维时频分析里的同步压缩变换有直接关系核心区别在于同步压缩是把时频系数沿着频率方向挤压到瞬时频率脊线上而 TET 更进一步只保留瞬时频率变化率接近零的那些系数也就是把“平稳持续”的成分扔掉只留下“突然出现又消失”的瞬态冲击。% main.m 中调用 TET_Y 的结构示意 load(Sig_noise.mat); % 一维振动信号通常是 N×1 列向量 fs 12000; % 采样率单位 Hz按实际设备铭牌改 Nfft 1024; % FFT 点数决定频率轴的显示密度 gamma 1e-8; % 数值阈值滤除时频系数里的极小值 winLen 256; % 窗函数点数与频率分辨率成反比 % 调用暂态提取变换返回两个时频表示 [tfmap, tetmap, ifreq] TET_Y(sig, fs, Nfft, gamma, winLen); % 把 tetmap 归一化后保存成图像 tetmap_norm tetmap / max(tetmap(:)); figure; imagesc(tetmap_norm); colormap(jet); saveas(gcf, output_tet.png);这段代码里的逻辑和参数值得逐个说sig 是原始一维振动数组方向必须是列向量这一点到后面避坑部分还会再提fs 告诉函数信号的真实采样率所有频率轴标注都依赖它采样率设错了图像上的特征频率位置全都会偏移这是最隐蔽的错误之一Nfft 影响频率轴上的点数Nfft 越大频率线画得越密但真实分辨率由窗长决定所以 Nfft 只是显示粒度的作用winLen 控制时间窗长短窗越短时间定位越准、频率分辨率越差是一对天生的矛盾gamma 是做硬阈值去噪的太小时噪声全留在图里太大时真实冲击也会被削掉。TET_Y 的返回值里tfmap 是变换前的原始时频表示tetmap 是暂态提取后的结果后者才是真正应该送进深度学习模型的图像数据第三个返回参数 ifreq 是瞬时频率估计值做故障诊断时可以用来观察转频和倍频的走向。动手跑一遍的时候建议先在 main.m 默认参数下运行成功再尝试改参数观察图像变化。压缩包里多个 sample 开头的 png 就是不同阶段的输出样例可以拿自己的输出和它们做对比判断参数是否在正常区间。这里有一个容易被忽略的细节imagesc 显示图像时用的是行列下标作为坐标轴不是真实的时间和频率如果需要论文里那种带频率刻度轴的图还要再设置 XTick 和 YTickLabel不然审稿人一眼就能看出坐标轴缺了单位。2.2 辅助函数SST_Y.m、Kurt_Y.m、renyi.m、integ2d.m、WT2.m 各管哪一段除了主干剩下的 .m 文件大多是对照实验和辅助分析用的。SST_Y.m 是同步压缩变换的实现输入输出格式和 TET_Y 基本一致用来做方法对比——同一段信号分别跑 SST_Y 和 TET_Y把两张时频图放一起看TET 的图像会更稀疏、背景更干净这是论文里很常用的对比图素材。Kurt_Y.m 大概率实现的是谱峭度计算它不直接生成图像而是回答一个前置问题信号里哪条频带包含的瞬态冲击最多。谱峭度本质上是每个频率点上的四阶矩归一化统计量数值越大说明该频带信号分布越偏离正态越可能藏着冲击成分。运行 Kurt_Y 会得到一条随频率变化的峭度曲线峰值对应的频带就是后续 TET 分析中应该重点关注的区域。renyi.m 实现的是 Renyi 熵计算它度量时频表示的能量集中度。同样的信号普通 STFT 得到的时频图能量分散在整个时频面上而 TET 的输出更稀疏、能量更集中Renyi 熵的值更小这个指标经常用来在论文里量化评价“TET 比 STFT 好在哪里”。integ2d.m 是二维积分函数常用操作是把整个时频面上的能量沿频率轴求和得到每条频率线的累计能量曲线或者沿时间轴求和得到能量随时间的变化趋势。在做特征提取时这个函数可以把二维图像压成一维特征向量方便后续传统机器学习分类器处理。WT2.m 是二维小波变换的实现同样能输出时频图像但小波基选取比较敏感效果好坏取决于母小波与故障冲击波形是否匹配包里的 WT2 主要也是作为对照组存在。对普通使用者来说真正必须调懂的是 main.m 和 TET_Y.m其余函数都是加分项想让论文方法对比部分更完整就把 SST、TET、WT2 三张图放一起想定量说明 TET 的时频聚集性优势就用 renyi.m 把三个方法的熵值算出来列成表。整个包的设计逻辑其实是一个完整的研究框架而不是单一工具。3. 亲手跑通一维转二维流程数据加载、参数设置与图像解读3.1 环境准备与数据文件检查跑这套代码之前先确认 Matlab 环境R2016b 到 R2023a 之间的版本兼容性都不错主要依赖 Signal Processing Toolbox 和 Image Processing Toolbox。如果只装了基础 Matlabimagesc、saveas 这类绘图函数还能用但后面涉及 imresize、rgb2gray 时就需要 Image Processing Toolbox。确认工具箱之后先把数据文件加载进工作区看看到底有什么% 检查 .mat 文件里的变量结构 clear all; close all; clc; load(Sig_noise.mat); who whoswho 命令列出 Sig_noise.mat 里的变量名whos 显示每个变量的维度、类型和占用字节数。正常情况下能看到一个名为 sig 的双精度数组形状是 N×1N 为采样点数这是后面所有处理的输入。如果看到的是行向量 1×N或者类型是单精度甚至是复数后续代码就可能在矩阵运算处翻车。另一个数据文件 x.mat 更值得关注它里面放的往往是经过 TET 处理后重建的信号或中间变量。把 sig 和 x 画在同一张图上对比能直观看到暂态提取对噪声的压制效果% 对比原始信号与 TET 处理后的重建结果 load(x.mat); figure; subplot(2,1,1); plot(sig); title(原始振动信号); xlabel(采样点); ylabel(幅值); subplot(2,1,2); plot(x); title(暂态提取后的重建信号); xlabel(采样点); ylabel(幅值);判断 x 到底是什么类型有一个简单原则如果 x 和 sig 的长度完全一致说明它是重建时域信号如果 x 是二维矩阵说明它存的是时频系数。很多情况下 x.mat 里存的是 TET 输出中提取出来的瞬态分量也就是去掉了平稳背景后的“干净冲击”做故障诊断时这个分量信噪比远高于原始信号可以直接拿来做包络谱分析。3.2 三个关键参数窗长、FFT 点数、阈值怎么配合对刚拿到代码的人来说最容易犯的错是用默认参数跑完就交差。TET 结果对三个参数非常敏感它们之间的配合关系直接影响输出图像质量。第一个是窗长 winLen。设采样率为 12000Hz 时winLen256 对应的时间窗约 21ms频率分辨率约 46.9Hz适合分析转频在几十赫兹到几百赫兹的轴承故障winLen512 时频率分辨率提升到约 23.4Hz但时间分辨率下降到约 43ms瞬态冲击在时间轴上的位置会被抹得更模糊。判断准则如果故障冲击持续时间短、间隔稀疏用小窗如果只关心转频及其倍频的数值不关心冲击的精确时刻用大窗。第二个是 FFT 点数 Nfft。Nfft1024 时频率轴有 513 个有效点对 06000Hz 的分析带宽足够Nfft2048 时频率轴点数翻倍但真实频率分辨率没有提升只是把曲线画得更平滑计算量却明显增加。第三个是阈值 gamma。gamma 的作用是把时频系数中接近零的数值直接置零等价于一个硬阈值去噪。gamma 设太小1e-12噪声底纹全部保留在图像里设太大1e-2真实冲击分量也会被削掉图像变成零散的孤点。我的习惯是从 1e-8 开始观察输出图像的背景噪声密度背景太脏就往大调一个数量级图像稀疏到丢失完整亮线就往回调。一个快速验证参数是否合适的办法是查看 tetmap 的稀疏率% 查看稀疏率非零元素占比 sr nnz(tetmap) / numel(tetmap); fprintf(稀疏率 %.4f\n, sr);经验上正常轴承振动信号的 TET 图稀疏率一般在 0.050.2 之间如果稀疏率超过 0.3说明阈值太低或者窗长不合适噪声没有压住如果低于 0.01说明阈值太高很多真实瞬态被误杀了。这个数值可以作为每次调参的第一道检查。3.3 样本图像解读sample_1 到 sample_5 对应什么阶段压缩包里 sample_1.png 到 sample_5.png 是已经跑好的样例输出对应同一组数据在不同处理阶段下的时频图。理解这几张图的差别能帮你判断自己的输出是否正常文件名在常见工作流中的位置图像特征sample_1.png原始信号的 STFT 时频图背景噪声均匀分布故障冲击亮线不突出sample_2.pngSST 同步压缩后的时频图亮线被压缩得更细但噪声毛刺仍可见sample_3.pngTET 暂态提取后的时频图亮线最清晰背景明显变黑变干净sample_4.png经 Kurt_Y 筛选后的 TET 图只保留谱峭度最大的频带其他频带被抑制sample_5.pnginteg2d 积分后的频带能量图横轴改为频率或时间纵轴为累计能量看图像时重点关注两个地方。一是亮带位置是否与理论计算的特征频率吻合比如滚动轴承外圈故障特征频率 BPFO 通常是转频乘以一个与滚珠数量、接触角相关的系数看 TET 图上最亮的横线是否落在该频率线上。二是背景纹理是否干净TET 相对于 STFT 的提升就体现在背景噪声被压掉、瞬态被提出来如果背景还是密密麻麻一片多半是 gamma 太小或谱峭度筛选没做。4. 避坑跑 TET 转图像最容易翻车的 5 个地方4.1 报错 “Matrix dimensions must agree”现象运行 main.m 时直接报矩阵维度不匹配错误堆栈指向 TET_Y 内部某一行。原因TET_Y 内部默认输入信号是列向量而很多数据采集软件导出的数据是 1×N 行向量加载进来后变量维度方向与预期相反矩阵乘法或拼接处直接崩溃。这是整个工具箱里最隐蔽的坑因为初看代码时完全不会检查信号方向。解决调用 TET_Y 之前统一做一次维度检查不足 5 行代码时间换回来if size(sig,1) size(sig,2) sig sig; % 强制转成列向量 end加上这句之后无论数据是横排还是竖排都能正确进入后续计算。我实际经历过好几次换一个数据源就翻一次车的情况后来把这段写成了独立脚本每次加载数据先跑一遍再往下走。4.2 生成的图像整片发白或者全黑现象imagesc(tetmap) 之后图像要么白茫茫一片要么黑乎乎什么都看不见旋转变换、调节色图都没用。原因tetmap 的动态范围非常大最大值是某个强冲击分量的峰值最小值接近零imagesc 默认把最小值和最大值映射到色图两端背景细节被极大值拉宽后全被压缩成黑色或白色视觉上丢失了所有中间层次。解决显示前先做基于分位数的归一化不用 min/max 映射% 分位数截断归一化避免被极端值带偏 tmin quantile(tetmap(:), 0.02); % 2% 分位作为下限 tmax quantile(tetmap(:), 0.98); % 98% 分位作为上限 tetmap_norm (tetmap - tmin) / (tmax - tmin); tetmap_norm(tetmap_norm 0) 0; tetmap_norm(tetmap_norm 1) 1; imagesc(tetmap_norm);用分位数而不是 min/max是为了隔离少数几个异常大值对整体颜色映射的影响。这个处理对后续保存成 png 再送深度学习模型同样重要未归一化的图像在不同样本之间的亮度基准不一致模型会学到亮度差异而不是纹理差异。4.3 改了窗长和阈值输出图像却没有变化现象信心满满把 winLen 从 256 改成 512gamma 从 1e-8 改成 1e-4重新运行后输出图像和之前一模一样连像素都看不出差别。原因有三种可能一是 main.m 里有某个全局变量或后处理步骤在 TET_Y 调用之后覆盖了结果比如再次做了幅值归一化二是参数没有真正传进函数函数声明中的形参顺序与你调用时传参的顺序不对应三是代码中用了缓存变量某次运行的结果被保存到 .mat 里下次直接加载了旧结果。检查思路很简单在 TET_Y 调用前后打印几个统计量% 检查参数是否真正生效 before tetmap; % 修改参数后重新运行 TET_Y [tfmap2, tetmap2, ifreq2] TET_Y(sig, fs, Nfft, 1e-4, 512); disp([mean变化: , num2str(mean(tetmap2(:)) - mean(before(:)))]); disp([max变化: , num2str(max(tetmap2(:)) - max(before(:)))]);如果这两个统计量完全不变说明参数没有传进函数内部逐行检查函数声明部分各形参的位置。如果统计量变了但图像看起来没变那大概率是后处理或显示环节把差异抹平了去检查 saveas 之前有没有再次归一化。4.4 TET 图送进 CNN 后准确率反而比一维信号低现象花了很多精力生成 TET 二维图建好 CNN 开始训练结果测试集准确率只有 60% 多还不如直接把一维信号用 LSTM 或简单 CNN 一维卷积跑出来的效果。原因这是一个很常见的认知陷阱。TET 图确实是好看的但如果不做频带裁剪和尺寸统一直接把整张时频图塞进网络图中 90% 以上的像素都是黑色背景真正的故障特征只占很小面积CNN 学到的是背景分布和噪声纹理而不是冲击特征。很多论文里效果好是因为他们只展示了裁剪后的局部频带图而不是全尺寸图。解决用 Kurt_Y.m 先算谱峭度找出故障频带只截取该频带对应的图像区域再把图像统一缩放成 64×64 或 128×128做 Z-score 归一化。我的经验是把全尺寸时频图裁到只有故障频带的 1/4 高度再缩放CNN 收敛速度和最终准确率都有明显提升这个预处理的收益通常比换网络结构更大。4.5 样本不平衡故障样本远少于正常样本现象实际采集数据时设备正常状态占绝大多数故障样本可能只有正常样本的十分之一训练出来的模型把所有样本都预测为正常故障漏报率极高。原因类别不平衡在故障诊断场景里几乎是必然的不是代码问题而是数据采集方式决定的。直接拿不平衡数据训练模型的最优策略就是全部预测多数类因为这样能获得最高准确率。解决对 TET 图像做数据增强比在一维信号上做增强更有效。可以在一代训练内把少数类扩充到 48 倍% 图像级增强小幅随机裁剪、水平翻转、加高斯噪声 img imread(sample_fault.png); imgCrop imcrop(img, [x y w h]); % 随机裁剪局部频带 imgFlip fliplr(img); % 水平翻转 imgNoise imnoise(img, gaussian, 0, 0.01); % 加轻度高斯噪声增强后的样本要注意标签保持一致且随机裁剪的区域不应把故障亮线整个切掉一般控制在原图 80% 面积以上。还可以把多个样本的时频图拼成大图再切小图既扩样又打散空间位置但拼图后样本的局部结构会失真需根据分类任务决定是否采用。5. 送进 CNN 之前把 TET 图像做成数据集的最后一步最后一章把最实用的流程端出来从一堆 TET 输出图像到能直接训练的数据集整个流程可以归纳为 load → crop → resize → normalize → split 五步。这套流程我在多个轴承数据集上验证过稳定有效% 构建图像数据集骨架 fileList dir(samples/*.png); % 所有 TET 图所在目录 numImg length(fileList); imgSize 64; % 统一缩放尺寸 dataCube zeros(imgSize, imgSize, 1, numImg, uint8); labelList zeros(numImg, 1); for i 1:numImg img imread(fullfile(fileList(i).folder, fileList(i).name)); img imresize(img, [imgSize imgSize]); % 缩放统一 gImg rgb2gray(img); % 转灰度确保单通道 gImg imadjust(gImg); % 对比度增强 dataCube(:, :, 1, i) gImg; % labelList(i) fileNameToLabel(fileList(i).name); end这里有两个关键点需要说明imresize 把原始时频图压到 64×64这个尺寸在 CPU 上跑一个浅层 CNN 很快有 GPU 时可以加大到 128×128但分辨率提升对准确率的影响在故障诊断场景下并不显著因为 TET 图的特征集中在纹理结构而不是精细细节rgb2gray 这一行看似多余因为 TET 输出本身是灰度数据但 saveas 保存的 png 有时会带三通道尤其是用过 jet 色图之后再保存所以保险起见统一转一次灰度。imadjust 做的是对比度增强让暗背景更暗、亮线更亮这个预处理对网络收敛速度的影响比很多人预期的要大。数据分割按 7:2:1 分成训练、验证和测试三份% 按 7:2:1 划分训练/验证/测试 idx randperm(numImg); numTrain floor(0.7 * numImg); numVal floor(0.2 * numImg); trainIdx idx(1:numTrain); valIdx idx(numTrain1:numTrainnumVal); testIdx idx(numTrainnumVal1:end);往 CNN 里塞之前还有一个容易被忽略的验证步骤先算每个类别的平均亮度。如果故障样本和正常样本的 TET 图平均亮度在统计上没有差异说明 TET 参数没调对特征没有真正被提取出来网络再怎么优化也学不到区分度。这时候要回去调 gamma 和窗长而不是在网络结构上继续花时间。从那以后我拿到任何一批新数据都强制先走一遍“亮度差异检验 → 频带裁剪 → 归一化 → 分割”四步验证再喂给网络几乎没再翻过车。希望帮到你。本文还有配套的精品资源点击获取
返回列表