资讯动态

S变换与深度学习:振动信号二维时频图生成及轴承故障诊断实践

发布时间:2026/10/3 7:14:54 来源:尧图企业网站定制
简介面向故障诊断与状态识别场景S变换S-transform是一种有效的时频分析手段能将一维信号映射为二维时频图像使原本难以发现的特征以纹理和形状呈现便于与卷积神经网络等深度学习模型结合用于设备状态监测与故障分类。压缩包共11个文件约1.4MB包含4个M脚本核心算法、快速实现与主控流程、5个PNG二维图像样本、1个PDF原理说明及1个MAT数据文件覆盖从数据预处理、平滑去噪、分段归一化到S变换及图像生成的完整链路。目前已有127人学习下载其中MAT数据文件存储一维样本可直接用于转换和模型训练。借助这套代码研究者可在Matlab中直接运行并观察转换结果快速搭建S变换与深度学习结合的故障诊断原型并进一步扩展至风机、发动机、工业机器人等设备的实时监控与状态识别实验。1. S变换把一维振动信号变成深度学习更喜欢的二维时频图故障诊断和状态识别里有一个长期痛点现场采集到的原始信号几乎都是一维时间序列直接丢给 CNN 这种为图像而生的模型效果经常很玄学。S变换S-transform就是解决这个问题的转换手段之一它把一维时域数据映射到二维时频空间让每个时间点都保留完整的频率分布再以灰度图或热图形式输出天然适配深度学习中的卷积网络。对轴承数据、发动机振动数据这类周期性信号S变换能同时展示故障特征频率随时间的变化工业机器人内部轴承的局部缺陷也能从时频图纹理里一眼看出来。这个资源里的 Matlab 代码和配套 x.mat 数据样本正好覆盖了从原始振动信号到二维图像的完整流程适合想把深度学习接到故障诊断上、又不想重复造轮子的工程师直接复用。2. S变换与多尺度窗为什么做故障诊断时它比短时傅里叶更好用2.1 短时傅里叶的窗口困境分辨率不能两头兼顾做振动信号分析时很多同行第一反应是短时傅里叶变换STFT因为spectrogram一行命令就能出图。但用多了就会发现一个尴尬问题窗长选短了频率分辨率稀碎窗长选长了时间轴上突变又糊成一片。尤其轴承故障早期阶段冲击成分非常短促故障特征频率又往往分布在高频段固定窗长很难同时抓住冲击时刻和高频离散谱线。短时傅里叶的本质是对每个时间切片加窗再取 FFT窗那种是全信号统一尺度。实际振动信号中低频分量持续时间长适合用宽窗细看频率高频冲击衰减快适合用窄窗保住时间定位。固定窗口等于强迫你用同一把尺子量不同尺寸的东西。S变换正是想解决这个矛盾窗口宽度随频率自动变化所以被称为“多分辨率”的时频分析。2.2 S变换的数学框架频率自适应的高斯窗S变换定义相当直白给定一维信号 ( x(t) )它的 S 谱为[ S(\tau, f)\int_{-\infty}^{\infty} x(t); w(\tau-t, f); e^{-j2\pi f t},dt ]其中高斯窗 ( w ) 的宽度和频率成反比[ w(\tau-t, f)\frac{|f|}{\sqrt{2\pi}}; e^{-\frac{f^2(\tau-t)^2}{2}} ]这个窗有很直接的理解频率 ( f ) 越高窗在时域越窄能得到更精确的冲击发生时刻频率越低窗越宽频率分辨率更细。和短时傅里叶最大的区别是S变换的窗不是人为给定的一串参数而是由当前分析频率自动算出来的。这也是为什么很多做故障诊断的人更愿意用 S 变换预处理而不是抱着spectrogram反复试窗长。在 Matlab 资源包里核心算法在st.m和stquick.m中两者实现思路一致stquick通常指用 FFT 加速的快速版本。实际调用常见形式是% 加载振动信号x 为一维列向量fs 为采样率 load(x.mat, x); fs 12800; % 采样率按实际数据修改 [ST, freq] stquick(x, fs); % ST 是复数矩阵行对应频率列对应时间 amplitude abs(ST);这段代码做了两件事先用stquick把一维数组变换成二维复数矩阵再取模得到幅值时频谱。ST的行数由采样率和频率分辨率决定列数由信号长度对应的时间点数决定。从这里往后你可以直接imagesc(amplitude)看时频图也可以进一步加强归一化后喂给 CNN。参数fs务必和采集设备一致如果给错图上所有频率轴都会等比例偏移。2.3 和连续小波比S变换赢在绝对频率尺度和相位信息连续小波变换CWT同样有自适应窗但小波的尺度轴和物理频率之间需要额外校准母小波不同结果差异也很大。S变换的优点是它保留了短时傅里叶的绝对频率坐标横轴是真实 Hz纵轴是时间看完每个频点都对应原始信号的物理频率。这一点在实际诊断中很关键轴承外圈故障特征频率 213 Hz你希望图上直接看到 213 Hz 处有持续亮带而不是去换算尺度。另外S变换是短时傅里叶和小波的一个折中它保留了相位信息所以结果可逆。虽然故障诊断里很少用逆变换但在验证预处理没把信号搞坏时这个性能够你做一个“正变换—逆变换—对比残差”的检查。资源的gst.pdf里对广义 S 变换有更细的原理说明属于把公式落在代码里的背景材料。提示如果只做 CNN 输入通常不需要关心相位直接取abs(S)。但如果你想做故障特征频率的定量识别相位信息可以用来辅助判断信号的同步性别一开始就丢。3. Matlab 代码数据流拆解st.m、main.m、x.mat 从加载到出图3.1 压缩包里的文件到底是谁干什么拿到资源后先别急着跑花两分钟把文件结构理清。这个包里并不复杂核心就 4 个.m文件、1 个.mat数据文件、1 份 PDF 和使用图。文件作用st.m标准 S 变换实现输入一维信号输出复数时频矩阵stquick.m快速 S 变换实现工程上一般优先调这个速度更快gstquick.m广义 S 变换快速版窗的形状可调适合做对照实验main.m主控程序负责加载x.mat、调用变换、画图、保存x.mat一维振动信号样本通常是轴承或齿轮箱实测数据gst.pdfS 变换原理和参数选择说明建议跑代码前先翻一遍figures/*.png作者运行后生成的时频图像可当作预期结果参照从命名看这份资源把重点放在“转换”这一步并没有把某个固定的训练网络代码塞进来。这样反而好用你只需要替换自己的信号数据得到二维时频图后面接 ResNet、VGG 还是轻量化 CNN 都自由。3.2 main.m 的运行流程和断点检查我自己通常不会一次性把整个脚本跑完而是设几个断点逐步看以防 x.mat 里的变量名和预期不一样。常见做法是先用whos看数据文件内容再决定怎么读% 第一步检查 mat 文件里有哪些变量不直接 load 到工作区 whos(-file, x.mat); % 第二步加载数据并观察长度、采样信息 data load(x.mat); fn fieldnames(data); raw data.(fn{1}); % 自动适应变量名避免硬编码 N length(raw); fs_demo 12800; % 采样率按照你的采集系统实际值修改 t_axis (0:N-1) / fs_demo; % 第三步调用快速 S 变换观察输出规模 [ST_mat, f_axis] stquick(raw, fs_demo); fprintf(ST matrix size: %d x %d\n, size(ST_mat));逻辑说明先用whos确认变量名避免收到别人数据后第一句load(x.mat, x)就报错。然后用fieldnames动态取第一个变量这对别人分享的.mat文件很实用。最后打印矩阵尺寸主要为了确认时频矩阵的行数是频率轴列数是时间轴如果行列反转后面画图会横向颠倒。参数说明fs_demo必须匹配真实采样率。轴承振动数据常见有 12000、12800、25600 Hz 几种。如果原数据采集卡用的是 25600你按 12800 算所有频谱特征频率都会被压缩一半CNN 学到的纹理也跟着变形换数据集就失效。3.3 从复数矩阵到深度学习输入的标准出图方式时频矩阵本身是可以直接存成图像的但不要直接用saveas截一张彩图了事那样会混入坐标轴、色标和背景CNN 的实际有效区域只占图的一部分还引入大量干扰。更稳妥的做法是把数据转为无坐标的灰度图或 RGB 图% 将幅值谱映射到 0-255 灰度区间 amp abs(ST_mat); amp_log log(1 amp / max(amp(:))); % 对数压缩压制绝对幅值差异 img_gray uint8(255 * mat2gray(amp_log)); % 归一化到 0-255 % 如果需要三通道 RGB复制三个通道即可 img_rgb repmat(img_gray, [1 1 3]); % 保存时不要带坐标轴 imwrite(img_rgb, sample_transform.png);逻辑说明第一行取幅值第二行做对数压缩。这一步容易漏如果不取对数幅值很大的转频成分会直接把图像对比度拉满故障特征频率在图上只剩细弱纹理CNN 学不到关键模式。第三行用mat2gray再次归一化把动态范围压到 0 到 1。最后imwrite直接输出纯图像不含坐标轴。参数说明base取自然对数还是常用对数影响不大关键是防止某个极大峰值把整张图“洗白”。如果你想保留频率轴信息可以在图像下方拼接一行数字编码作为辅助通道但这属于定制做法先不展开。3.4 快速版本和标准版本的结果一致性验证资源里同时给了st.m和stquick.m两个版本理论结果应该一致只是算法路线不同。第一次使用时我建议做一次对照防止快速版本在某些边界参数下出现偏差ST_ref st(raw, fs_demo); ST_fast stquick(raw, fs_demo); max_diff max(abs(ST_ref(:) - ST_fast(:))); fprintf(max diff: %e\n, max_diff);如果max_diff在 1e-8 以下说明快速版本和标准版本在实际精度上没有差别之后可以放心用stquick。如果差异到了 1e-2 级别说明输入序列存在 NaN、Inf 或者两个函数对末尾补零策略不同先处理信号再变换。4. 避坑S变换转图像后接 CNN 的常见问题与排查4.1 图像尺寸不一致导致 CNN 训练中断现象同一个维度样本跑出来的时频图有的图是 128×256有的是 250×250进数据加载器直接报size mismatch。原因时频矩阵的行数由频率轴采样点数决定列数由信号长度决定。原始振动数据长短不一或采样率中途变了都会让输出尺寸不一致。解决在管线里统一重采样。先把所有信号切成固定长度比如 2048 点再统一用resample把采样率标准化。我一般会在预处理脚本里强制加一句data data(1:2048)或data resample(data, 12800, orig_fs)保证进入 S 变换前所有样本长度一致这样输出的时频矩阵列数也一致。个别样本长度不够时做循环拼接截断后再变换。4.2 对数压缩缺失导致弱故障被强峰值淹掉现象训练时 loss 降不下去打印几张贴图发现都是高亮一片完全看不出纹理。检查预处理代码发现直接对abs(ST)做imwrite没有做任何动态范围压缩。原因正常轴承振动时转频和啮合频率幅值很大故障冲击幅值相对很小。如果直接线性映射到 0-255最大值把动态范围占满故障频带变成灰蒙蒙一片。解决先做对数变换再归一化。代码的通用做法是amp abs(ST_mat); amp_log log10(1 amp); img im2uint8(mat2gray(amp_log));这样能把 100 倍幅值差缩小为 2 倍亮度差弱故障纹理才能显示出来。故障诊断里这一步不是可选项而是必需项。4.3 归一化用全局最大换一个样本图就黑掉现象每个样本单独训练没问题但用训练好的模型去测试新样本时预测结果明显下降。回看测试样本的图发现整体色调比训练数据暗很多。原因实现时用了mat2gray(amp_log)默认是把当前样本最大最小值映射到 0 和 1。如果测试样本的幅值整体偏大正常频带内的细节就被压缩到很暗的区间和训练图形的亮度分布不一致。解决归一化参数必须从训练集统计得出不要每个样本实时计算。正确做法是先在训练集上计算出对数幅值的均值mu和标准差sigma然后所有样本都用(log_amp - mu) / sigma做标准化。或者固定一个经验阈值比如把训练集所有幅值的 99.9 分位数作为上限超过的都截断再用同一个上限去处理测试集。4.4 边界效应造成图的两端亮带现象生成的时频图最左边和最右边出现一条很亮的垂直带中心区域纹理正常。刚开始以为是故障特征后来发现纯噪声段也有同样的亮带。原因S 变换受信号首尾截断影响高斯窗在边界处只覆盖到部分数据能量损失后幅值相位计算出现畸变反映在图像上就是边框增强。解决预处理时加一段信号镜像或重复边缘。常见做法是对原始信号前后各延拓 10% 长度变换后截掉对应的时频图像区域。例如原始信号 2048 点延拓到 2500 点做变换取结果中间 2048 点对应的时间区间即可。这个操作能明显减少边框亮带。4.5 采样率标错故障特征频率整体漂移现象训练集准确率很高但部署到现场设备后识别全错。对比频谱图发现现场频率轴和训练时对不上。原因多数实验代码写死fs 12800但实际数据采集系统可能是 25600 Hz。如果训练数据用错了采样率S 变换的频率分辨率是按错误 fs 计算的图的纹理形状虽然相似但横轴物理意义错误模型只在自洽数据集上有效。解决养成每个数据集都检查fs的习惯。在main.m里加一行fprintf(Expected fs: %d, computed fs from time vector: %.2f\n, ... fs_demo, 1 / mean(diff(t_axis)));如果t_axis存在直接用时间间隔反算采样率。如果没有时间轴至少要在文件名或元数据里写明采样率不要靠猜。5. 验证与进阶用已知信号测 S变换再做数据增强与迁移学习在把 S 变换结果投进深度学习之前花 5 分钟用合成信号验证代码正确性能省下后面大量排查时间。常见的验证做法是构造一个“定频正弦 调频鸡鸣”信号定频分量对应轴承转频鸡鸣分量对应故障冲击的宽带特征。把这段信号通过 S 变换正确结果应该是一条水平亮线和一条斜向亮线相交水平线的位置对应定频频率斜线的起点到终点对应扫频范围。fs 2048; t 0:1/fs:1; x 1.5 * sin(2 * pi * 100 * t) chirp(t, 20, 1, 200); [ST_check, f_check] stquick(x, fs); imagesc(t, f_check, abs(ST_check)); set(gca, YDir, normal); xlabel(Time (s)); ylabel(Frequency (Hz));如果这张图上 100 Hz 处没有稳定的水平亮线说明st.m在输入信号尺度上有问题需要检查矩阵方向。常见误用是矩阵被flipud后频率轴颠倒或者imagesc默认 Y 轴向上让频率轴倒置。加上set(gca, YDir, normal)能避免这个困扰。验证完基础变换后再做数据增强就安全很多。对时频图做增强时不能像自然图像那样随意旋转因为时间和频率有物理方向性。水平翻转等于把时间倒流频率轴仍然是同方向这在很多工况下是可以接受的小扰动垂直翻转则会把低频变高频完全破坏故障模式建议不要用。我习惯用的是小范围时间平移、图像亮度扰动和加高斯噪声。时间平移做法是对原始信号做循环移位再变换等价于在时频图上沿时间轴平移几个像素。亮度扰动则是在对数幅值上加小随机偏置模拟不同负载下幅值波动。如果你手里有现成的预训练 CNN可以把生成的时频图imresize到预训练模型的输入尺寸比如 224×224 或 227×227。资源本身没有包含训练网络但 S 变换输出是三通道 RGB 图或灰度图接主流框架毫无障碍。迁移学习和从头训练相比对小数据集友好得多。带通滤波后的轴承故障数据集往往只有几百个样本直接用 ResNet 从零训练容易过拟合而用 ImageNet 预训练权重做特征提取往往收敛更快。我个人的习惯是每次换设备或换采集卡都会先用合成信号重新跑一遍 S 变换确认时间轴、频率轴和幅值尺度没有变化再对真实数据做批量转换。从那以后我再也没有因为采样率标错或边界效应导致整体返工过。记住时频图只是把原始数据换了一种呈现方式它不会凭空创造特征真正判断故障的仍然是特征频率的位置和相对强弱。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑