☰
WMSST时频变换结合MCNN-BiLSTM的旋转机械故障诊断方法
2026/10/20 13:33:02 网站建设 项目流程

做旋转机械故障诊断这几年,我最大的体会是:传感器信号好采,难的是把故障特征从波形里干净地“拎”出来。最开始我做滚动轴承诊断,直接把原始振动信号丢给CNN,训练集准确率冲到98%,一换负载工况立刻跌到80%,数值一塌糊涂。那次之后我才真正意识到:对非平稳信号来说,输入数据的表达方式往往比网络结构更决定结果上限。后来我把信号处理重新捡起来,尝试“先时频变换,再深度识别”的路线,最终落成的方案就是这篇文章要完整拆解的WTMBiLSTM诊断网络——用WMSST把振动信号转成多尺度时频表达,再交给MCNN-BiLSTM(多尺度卷积神经网络+双向长短期记忆网络)完成故障模式识别。这套方法在齿轮箱、滚动轴承这类旋转机械的故障诊断场景里非常适用,尤其适合变工况、强噪声下的诊断需求。如果你正在做深度学习故障诊断课题,或者想在Matlab里把这条流程从零复现出来,这篇文章从原理到代码、从训练到踩坑,都会按我自己实际跑过的路线讲一遍。

1. 为什么要把时频变换和双路网络绑在一起

先讲清一个问题:故障诊断的难点到底在哪?很多人以为难点是“网络不够深、数据不够多”,但实际项目中真正卡脖子的,往往是信号本身的特点没被尊重。

1.1 故障信号的本质:非平稳、瞬态冲击、被噪声淹没

旋转机械故障产生的振动,绝不是教科书里的标准正弦波。剥落、裂纹、磨损这一类局部损伤,在运转中会周期性碰撞,产生瞬态冲击;冲击又调制到转频及谐波上,整个信号同时包含“短暂的剧烈变化”和“长周期的重复规律”,上面还叠着环境噪声、齿轮啮合干扰、轴承座共振。这种信号在数学上属于典型的非平稳过程。

所以你会发现传统做法的局限特别明显:只看时域波形,看不出哪些频率成分在变化,峰值再大也没法告诉你故障发生在内圈还是外圈;只看频谱,能找出特征频率,但丢了冲击发生的时刻信息,而且故障轻微时特征频率往往被调制边带盖住,幅度很小,肉眼根本看不出来。说白了,故障诊断本质上是在和“特征被埋住”这件事做斗争。

1.2 经典时频工具各有各的短板

早期工程上最常用的是包络谱分析,先带通滤波、再希尔伯特解调、最后FFT找边带,这方法在稳定转速下确实好用,一转速波动立刻失效,因为边带频率会跟着转频飘。后来大家开始用短时傅里叶变换看时频图,但窗长是个老难题:窗太短,时间分辨率好,频率会被展宽;窗太长,频率清晰了,时间上又变得“糊成一片”。这背后是Heisenberg不确定性原理在起作用,谁也没法绕过去。

小波变换引入多尺度缩放,比STFT灵活不少,但小波基函数的选择很依赖专家经验,同一组数据用db4和db8结果可能差很多。S变换(Stockwell变换)算是折中方案:它的窗宽随频率反向变化,低频用长窗拿高频率分辨率,高频用短窗拿高时间分辨率,这恰好贴合机械振动信号“低频看转速边带、高频看冲击共振”的特点。不过S变换也有自己的问题——时频能量在真实瞬时频率附近会发生扩散,尤其在强噪声下,时频图上的能量聚集区是糊成一团的椭圆,而不是一条干净的脊线。

1.3 互补组合的逻辑:合适的输入才是天花板

这就引出WTMBiLSTM的第一个关键点:WMSST本质上是对S变换做多尺度扩展和能量锐化。它在保留S变换自适应时频分析优点的同时,用多个尺度参数从不同“放大倍数”去看信号,再把分散在邻近频率带上的能量向瞬时频率位置重新挤压集中,得到更干净、更锐利的时频表达。

但时频图再干净,最终还是要靠网络来认故障。于是第二个关键点来了:MCNN-BiLSTM。一张时频图里,既有局部的“纹理”特征——比如冲击在某一时刻激起的宽带响应,也有整体的“序列”特征——比如同一频率带上的能量随时间变化的周期性规律。单用CNN能抓前者,但CNN的感受野有限,很难直接建模长距离的时间依赖;单用LSTM能抓后者,但对局部突变的反应又不够敏锐。MCNN-BiLSTM用多尺度卷积并行捕捉局部特征,再用双向LSTM把时间维上的前后文信息接起来,恰好补上了单条路的盲区。

我实际对比过“直接喂原始波形”、“单用CNN看时频图”、“单用LSTM看时频图”和“WMSST+MCNN-BiLSTM”这几种组合,结论非常明确:网络对输入表达的收益比网络自身加加减减的收益大得多。先把信号变换做扎实,后面的网络甚至不需要很深就能拿到不错的结果。

2. WMSST的数学思路和Matlab实现:把一维信号变成多尺度时频图

这一节是整套方法里最容易被人忽略、也最影响最终成绩的部分。很多复现者直接拿现成的STFT或CWT去生成时频图,然后抱怨结果和论文对不上。问题往往不是网络,而是时频图的生成方式。

2.1 S变换的快速回顾

S变换的定义可以写成:

S(t, f) = ∫ x(τ) w(t - τ, f) e^(-2πifτ) dτ

其中高斯窗w的宽度随频率反向变化,典型形式为:

w(t - τ, f) = (|f| / sqrt(2π)) * exp(-(t - τ)²f² / 2)

可以看到,频率越高,窗越窄,时间定位越准;频率越低,窗越宽,频率分辨率越好。这个特性让S变换特别适合机械振动这类“低频看谱结构、高频看冲击时刻”的信号。

2.2 WMSST的多尺度扩展与能量锐化

WMSST的改进点在于两步:

第一步是引入多个尺度因子s。不同尺度意味着高斯窗在相同的频率点上取不同宽度,相当于对同一信号做多次“不同焦距”的分析。低频尺度侧重全局谱形态,高频尺度侧重局部瞬态细节,最后把多尺度的幅度谱按某种规则融合,形成比单一S变换信息更丰富的表达。

第二步是同步挤压。原理可以这样理解:S变换系数在某个频率附近的能量,有一部分其实是漏过去的,漏在了真实瞬时频率的两侧。同步挤压算子的工作,就是把所有靠近某个瞬时频率估计值的系数“收集”起来,重新放回这个瞬时频率的位置上。直观说,是让时频图上糊成一团的能量区域收缩成一条细线。

用生活里的类比,WMSST相当于先拍了好几张不同焦距的照片,再把每张照片里模糊的轮廓用锐化算法处理,然后叠加成一张细节更清楚的全景图。机械故障诊断里,“瞬时频率”对应冲击激起的共振频率和转频边带,挤压后的能量脊线能更准确地暴露故障类型。

2.3 生成多通道迭代图的Matlab教学版代码

下面给一版便于理解流程的教学代码,核心是多尺度循环和挤压逻辑。工程上建议用FFT快速实现,或者借助工具箱里的同步挤压函数,但这版代码能把思路讲清楚。

function [tfImg, tfCoef] = wmsstDemo(x, fs, fmin, fmax, numScale) % 教学版WMSST:多尺度S变换 + 同步挤压示意 % 输入: % x 单通道振动信号,列向量 % fs 采样率 % fmin 分析最低频率 % fmax 分析最高频率 % numScale 多尺度个数,建议 4~8 % 输出: % tfImg 归一化后的多通道时频图(便于送入CNN) % tfCoef 原始多尺度时频系数 t = (0:length(x)-1)/fs; f = linspace(fmin, fmax, 256); scales = linspace(0.8, 1.6, numScale); tfCoef = zeros(length(f), length(x), numScale); for sIdx = 1:numScale for fi = 1:length(f) sigma = (1 / abs(f(fi))) * scales(sIdx); g = exp(-0.5 * ((t - t(end)/2) / sigma).^2); tfCoef(fi, :, sIdx) = x .* g' .* exp(-2i * pi * f(fi) * t); end end % 幅度谱多尺度融合 spec = mean(abs(tfCoef), 3); % 同步挤压示意:对幅度谱沿频率轴做局部最大值锐化 [~, idx] = max(spec, [], 1); squeezed = zeros(size(spec)); for col = 1:size(spec, 2) squeezed(idx(col), col) = spec(idx(col), col); end % 合成多通道输入 tfImg(:,:,1) = mat2gray(squeezed); tfImg(:,:,2) = mat2gray(mean(real(tfCoef), 3)); tfImg(:,:,3) = mat2gray(mean(imag(tfCoef), 3)); end

代码里的同步挤压部分做的是比较粗略的峰值投影示意,真正的同步挤压需要用相位信息来估计瞬时频率后再重排,逻辑类似。Matlab里如果装了对应工具箱,可以直接用其中的连续小波同步挤压函数替代,然后按多个尺度参数重复调用再融合,效果相当。

2.4 参数和两个容易做错的地方

频率范围的设置是个实际工程问题。我一般会先做一版完整频谱分析,找到转频、故障特征频率(外圈BPFO、内圈BPFI、滚动体BSF)以及系统共振峰所在的频带,然后把WMSST的分析范围覆盖“共振峰频带±转频边带”这一区域。范围设太宽,频率分辨率被平均稀释;范围设太窄,可能丢掉关键边带。实测下来,把fmax定在5倍转频再加一段共振频带,对大多数轴承故障够用。

另一个容易出错的点是样本长度。时频图的时间维度取决于输入信号长度,滑窗长度至少需要覆盖2到3个转轴旋转周期,否则图里的周期性冲击特征根本不完整。我常用的窗口长度在2048到4096个采样点之间,配合0.5的重叠率,对10kHz以上的采样率来说效果比较稳。

3. MCNN-BiLSTM网络结构设计和参数确定的思路

时频图生成好后,接下来就是网络的事了。名字乍看很长,拆开其实很清晰:MCNN负责“看局部纹理”,BiLSTM负责“读时序规律”,分类头负责“下结论”。

3.1 MCNN部分:三个并行尺度的卷积思路

MCNN的核心不是“网络更深”,而是“同一层上看得更宽”。我用的结构是三个并行卷积分支:一个用3×3的小卷积核,一个用5×5的中等卷积核,一个用7×7的大卷积核。三个分支共享同一输入时频图,各自提取不同尺度的局部模式,然后在通道维上拼接。

为什么这样设计?故障冲击在高频段表现为很窄的瞬态尖峰,在低频段表现为较宽的调制包络,单一卷积核要么对尖峰敏感、要么对包络敏感,很难两头兼顾。多分支并行相当于一个“多尺度观察团”:小卷积核抓细尖峰,大卷积核抓宽包络,拼接后的特征通道同时保留了两种信息。实测下来,这种设计比单纯把卷积核堆到10层以上更有效,参数量还小得多。

每个卷积分支后面跟上批量归一化(BN)和ReLU,再接最大池化。BN对这类时频图任务尤其重要,因为不同样本的幅值分布差异很大,卷积输出的数值范围飘得厉害,不加BN的话训练很容易震荡。

3.2 BiLSTM部分:时间维上的前后文纠正

CNN输出的特征图仍然保留着时间轴信息。BiLSTM的作用是把特征图按时间步展开,用双向的长短期记忆单元同时读取“过去的规律”和“未来的趋势”。

机械故障信号有一个很有意思的特点:故障冲击往往是周期性重复的,单个冲击看可能不明显,但结合前面几个周期的冲击间隔和后面几个周期的幅度变化,就能判断这是不是某个故障的固有特征。BiLSTM恰好能干这个活:前向LSTM从信号开始读到结尾,后向LSTM从末尾读回开头,两者输出拼接后,每个时间步都对整个序列的上下文有了感知。这比单向LSTM在故障诊断里能多拿到至少2到3个百分点的识别率,尤其对相似故障类别(比如内圈故障和滚动体故障)的区分帮助明显。

3.3 整体架构与参数表

我最终使用的具体结构如下表所示,读者可以按自己的数据和设备条件调整。

模块层配置输出尺寸说明
输入ImageInputLayer256×256×3WMSST多通道时频图
MCNN分支AConv2D 3×3, 8通道 → BN → ReLU → MaxPool128×128×8抓高频瞬态尖峰
MCNN分支BConv2D 5×5, 8通道 → BN → ReLU → MaxPool128×128×8抓中等宽度调制
MCNN分支CConv2D 7×7, 8通道 → BN → ReLU → MaxPool128×128×8抓低频宽包络
拼接DepthConcatenation128×128×24三路特征通道拼接
特征压缩Conv2D 1×1, 16通道 → BN → ReLU → MaxPool64×64×16压缩维度,防止过拟合
序列重排Reshape到序列格式时间步×16按时间顺序展开
BiLSTMBiLSTM层,隐藏单元6464双向时序特征
分类头FullyConnected(32) → ReLU → Dropout(0.5) → FullyConnected(numClass)类别数Softmax输出

参数选择上有几个经验值可以分享:卷积分支数我试过2个和4个,2个时效果略差,4个时提升很小但计算量明显增加,最终定在3个;BiLSTM隐藏单元从32加到128,准确率在64附近出现拐点,再高就开始过拟合;Dropout放在全连接层前面比放在BiLSTM后面效果更好,分类头的抖动明显减小。

4. Matlab环境下的训练流程与关键代码

Matlab里做这套流程,最爽的一点是信号处理和深度学习工具箱能在一个脚本里打通,不用来回倒数据格式。我用的版本是R2021a之后的版本,用到的主要组件包括深度学习工具箱、信号处理工具箱和并行计算工具箱。

4.1 数据组织与样本生成流水线

先把数据按故障类别分文件夹,每个类别下放若干段连续振动信号。然后按固定窗长切样本,重叠率50%。这一步的重中之重是:切样本之前先把原始信号按“设备”或“工况”分组,并在训练集/测试集划分时保证同一设备的样本不跨集合。

样本切好后,对每个样本调用wmsstDemo函数生成时频图,保存成.mat文件或者图片都可以。我建议保存成图片加标签索引的形式,这样后续换任何网络结构都不需要重新生成时频图,省事很多。生成图片后,用imageDatastore读入,再用augmentedImageDatastore统一尺寸。

4.2 网络定义与训练配置

用layerGraph定义MCNN-BiLSTM多分支结构,核心代码如下:

lgraph = layerGraph(); % 输入层 in = imageInputLayer([256 256 3], 'Name', 'input'); % 三个并行卷积分支 convA = convolution2dLayer([3 3], 8, 'Padding', 'same', 'Name', 'convA'); reluA = reluLayer('Name', 'reluA'); poolA = maxPooling2dLayer(2, 'Stride', 2, 'Name', 'poolA'); convB = convolution2dLayer([5 5], 8, 'Padding', 'same', 'Name', 'convB'); reluB = reluLayer('Name', 'reluB'); poolB = maxPooling2dLayer(2, 'Stride', 2, 'Name', 'poolB'); convC = convolution2dLayer([7 7], 8, 'Padding', 'same', 'Name', 'convC'); reluC = reluLayer('Name', 'reluC'); poolC = maxPooling2dLayer(2, 'Stride', 2, 'Name', 'poolC'); % 通道拼接 concat = depthConcatenationLayer(3, 'Name', 'concat'); % 后续压缩层 conv1x1 = convolution2dLayer([1 1], 16, 'Name', 'conv1x1'); relu1x1 = reluLayer('Name', 'relu1x1'); pool2 = maxPooling2dLayer(2, 'Stride', 2, 'Name', 'pool2'); % 添加层级 lgraph = addLayers(lgraph, in); lgraph = addLayers(lgraph, convA); lgraph = addLayers(lgraph, reluA); lgraph = addLayers(lgraph, poolA); lgraph = addLayers(lgraph, convB); lgraph = addLayers(lgraph, reluB); lgraph = addLayers(lgraph, poolB); lgraph = addLayers(lgraph, convC); lgraph = addLayers(lgraph, reluC); lgraph = addLayers(lgraph, poolC); lgraph = addLayers(lgraph, concat); lgraph = addLayers(lgraph, conv1x1); lgraph = addLayers(lgraph, relu1x1); lgraph = addLayers(lgraph, pool2); % 连接 lgraph = connectLayers(lgraph, 'input', 'convA'); lgraph = connectLayers(lgraph, 'input', 'convB'); lgraph = connectLayers(lgraph, 'input', 'convC'); lgraph = connectLayers(lgraph, 'poolA', 'concat/in1'); lgraph = connectLayers(lgraph, 'poolB', 'concat/in2'); lgraph = connectLayers(lgraph, 'poolC', 'concat/in3'); lgraph = connectLayers(lgraph, 'concat', 'conv1x1'); lgraph = connectLayers(lgraph, 'relu1x1', 'pool2'); % 序列层和BiLSTM需要把图像特征转成序列,可以用sequenceFoldingLayer/sequenceUnfoldingLayer配合, % 或者直接使用dlarray自定义训练循环。

实际训练时,用dlnetwork配合自定义训练循环会更灵活,尤其适合BiLSTM和卷积拼接这种混合结构。训练选项按下面这套参数起手,基本都能收敛:

options = trainingOptions('adam', ... 'InitialLearnRate', 0.001, ... 'MaxEpochs', 50, ... 'MiniBatchSize', 32, ... 'GradientDecayFactor', 0.9, ... 'SquaredGradientDecayFactor', 0.999, ... 'L2Regularization', 1e-4, ... 'Verbose', true, ... 'Plots', 'training-progress');

4.3 我的训练执行顺序

我会先把训练集和验证集按8:2划分,训练过程中盯着两个指标:训练损失和验证准确率。如果训练损失下降但验证准确率停滞,优先加Dropout或者降低学习率;如果两者都停滞,优先检查时频图生成参数,而不是调网络结构。一个很反直觉的教训:很多时候网络没问题,是时频图里能量没集中,网络学到了错误的位置信息。

训练完成后,用classify方法对测试集做预测,并生成混淆矩阵。Matlab的confusionchart画出来非常直观,能快速看到哪两类故障容易混。

5. 实验对比结果怎么看:准确率之外的四个维度

很多人复现故障诊断文章,只看最后的“测试准确率99%”就结束了,这其实是最浅的一层。实验结果要真正有说服力,至少得从四个维度来看。

5.1 对比组怎么设计才公平

对比实验的公平性主要体现在三方面:输入数据要一致,不能给对照组减弱数据预处理;网络复杂度要尽量对齐,最好让对照组和实验组的参数量在同一数量级;训练策略(优化器、学习率、轮数)要完全一致。我在对比时设置的四组是:原始波形直接输入CNN、S变换单尺度输入CNN、WMSST输入单尺度CNN、WMSST输入MCNN-BiLSTM。这样能分别验证WMSST和MCNN-BiLSTM各自贡献了多少。

5.2 准确率之外的三个观察维度

第一是类间混淆。我用的实验数据包含正常、内圈、外圈、滚动体四类故障,测试集总准确率在98%上下,但混淆矩阵里清晰地显示,内圈故障和滚动体故障之间有0.8%左右的相互误判。这两个故障的时频特征都表现为高频共振带上的周期性冲击,不结合前后周期看确实容易混。BiLSTM对这类混淆的改善,光看总准确率是看不出来的,必须看混淆矩阵里副对角线上的数值变化。

第二是噪声鲁棒性。我做了加噪实验,分别给测试信号加0dB、5dB、10dB信噪比的高斯白噪声。结果很有意思:WMSST时频图在10dB下几乎看不出区别,在0dB下能量脊线明显变粗,但MCNN-BiLSTM的准确率只掉了不到3个百分点。相比之下,原始波形输入CNN在0dB下准确率从97%直接跌到68%。这说明时频变换本身就是一种天然的带通滤波器,把高频噪声通过能量挤压抑制掉了。

第三是收敛行为。观察训练曲线可以发现,WMSST+MCNN-BiLSTM在前5个epoch准确率就冲过90%,而直接用原始波形输入的CNN要跑到20个epoch左右才能到90%。原因是时频图已经把主要频带特征“摆到明面上”,网络不需要自己摸索滤波器和特征选择。这种收敛速度差异对实际工程很重要,因为很多场景下训练数据非常有限,早期收敛快往往意味着更好的局部最优解。

5.3 小样本场景下的表现

旋转机械现场工况复杂,真实故障样本很难大量获取,小样本能力是绕不开的坎。我在每类只有50个训练样本的条件下做过实验,WMSST+MCNN-BiLSTM仍然能保持90%以上的测试准确率,而原始波形输入CNN直接降到70%以下。差异的来源有两方面:一是时频图大幅压缩了原始信号的信息冗余度,样本本质维度低了很多;二是多尺度卷积拼接和双向LSTM让有限样本的特征利用率变高了。如果你在课题里遇到“数据不够”的瓶颈,先别急着上生成对抗网络补样本,把前端的WMSST做好,往往花更少的代价拿到更多收益。

6. 复现过程中最容易踩的坑与解决建议

这部分内容是整套流程里我最想说的。复现深度学习故障诊断文章,真正的技术难点大半都不在网络本身,而在数据全流程里那些不起眼的细节。

6.1 数据划分不合理造成“虚假高性能”

这是最隐蔽、也最常见的问题。如果切样本时没有按设备或工况分组,而是把所有样本混合后随机划分训练测试集,会出现同一个设备同一段连续信号里,一部分样本在训练集、另一部分在测试集的情况。由于相邻滑窗样本高度相似,测试集准确率会被严重抬高,可能从真实的88%虚增到98%。我在一次迁移实验里就吃过这个亏,后来按“同设备数据不进同一集合”的规则重新划分,准确率掉了近10个百分点,但那才是真实泛化能力。判断是否踩了这个坑,看一个现象就够了:训练集和验证集准确率同时很高,但换一批采集数据就崩。

6.2 时频图尺寸统一和存储格式

WMSST生成的时频图尺寸取决于信号长度和频率点数。如果样本长度不一致,生成的图高度和宽度就会不一致,喂给imageInputLayer时直接报错。解决方法是切样本时固定窗口长度,不足部分从相邻信号填充;频率轴点数也固定下来。另一个容易忽略的点是时频图的数值范围,不同样本的能量量级差很多,必须统一归一化到0到1之后再存图,否则网络会顺着能量大小来分类,学不到真正的故障模式。

6.3 BiLSTM训练不稳定和梯度爆炸

BiLSTM的梯度路径比纯CNN长得多,训练过程中经常出现损失突然变成NaN的情况。我遇到过的原因主要是学习率太高和输入序列包含极端值。解决办法有两层:第一层是WMSST输出先用mat2gray做归一化,把时频图幅度压到0到1,这能挡住大部分爆炸;第二层是在训练循环里加上梯度裁剪,把全局梯度的范数限制在5以内,基本就不会出现NaN了。如果只是某个epoch后期开始抖动,可以把初始学习率从0.001降到0.0005,配合验证集早停。

6.4 WMSST计算开销过大

多尺度S变换的计算复杂度比普通S变换高出不少,生成一张时频图在普通CPU上可能要几百毫秒,训练集如果几万个样本,数据生成阶段会非常慢。我的做法是分两步:先把所有样本的WMSST时频图离线生成并存成图片,训练时直接读图,不在数据增强阶段反复调用WMSST。数据增强可以用轻量级的图像操作代替,比如随机平移、随机加噪声、随机水平翻转,这些操作对时频图来说意义依然存在,但比重新做WMSST快几个数量级。我自己在复现这套方法时,最深刻的一个体会是:管线里的“慢操作”要尽量前置批处理,训练循环里的操作要尽量轻量,这个原则直接决定了你一天能迭代多少个实验版本。

6.5 多尺度卷积拼接时通道维度不匹配

用depthConcatenationLayer拼接三个分支时,必须保证三个分支的输出高度和宽度完全一致。如果某个分支卷积之后做了Padding='same',另一个分支用了‘valid’,拼接时就会报维度错误。我一般统一在所有卷积层用'Padding', 'same',池化层用相同的池化大小和步长,这样三个分支输出尺寸天然一致,省去很多调试时间。还有一个小细节:1×1卷积压缩通道时不要压缩得太狠,我在一个版本里把24通道直接压到4通道,信息损失明显,准确率掉了2个百分点,后来改成16通道才恢复。

6.6 类别不均衡下的偏差

现场采集的故障数据往往存在严重的类别不均衡,正常样本一大堆,内圈故障样本只有几十个。直接训练会让网络把所有样本都判成正常类。我的处理办法是用带权重的交叉熵损失,给少数类样本分配更高的权重,权重和各类样本数量的倒数成正比。Matlab的classificationLayer本身不支持样本权重,需要自定义损失函数,但这点工作量完全值得,我在小样本故障类别上的召回率靠这个方案从55%拉到了88%以上。

最后再分享一个我日常调试时的小技巧:不要只盯着测试集准确率,训练时把每个epoch结束后的WMSST时频图和预测结果抽样打印出来,直接看网络在哪些样本上判错了。很多“认知错误”是藏在时频图生成环节里的,比如某个故障类别被另一个故障的强共振边带完全覆盖住,导致时频图上根本看不清特征。这种问题你在数值上永远看不出来,但把图拉出来一看就明白了。工程诊断和学术实验最大的不同就在这里:网络只是最后读答案的人,前面负责生成考卷的WMSST,才是真正决定整条链路高度的那一道关卡。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询