
1. 整体思路拆解为什么要把DWVD和MCNN-BiGRU-Attention组合在一起1.1 传统故障诊断方法走到哪一步了机械故障诊断这个方向做了几年的人应该都有同感早期大家玩的基本都是信号处理人工特征浅层分类器这条路子。时域提取均值、峰值、峭度频域看频谱峰值、边频带时频域做个短时傅里叶变换或者小波包分解然后喂给SVM、随机森林这些分类器。这套流程本身没问题但真正做工程落地的时候痛点非常明显。首先是特征提取太依赖经验。同样的数据懂行的人能挑出峭度和包络谱特征新手可能就只会看个均方根值特征选不好后续分类器再牛也白搭。其次是特征和故障类型之间的映射关系是非线性的浅层分类器拟合能力有限很多隐蔽的早期故障根本分不出来。最后是信号本身的非平稳性。设备启停、负载波动、转速变化这些工况下振动信号里的故障特征频率会漂移传统的傅里叶分析拿到的是一个时间段内的平均频谱瞬态冲击成分被抹掉了诊断效果自然打折扣。所以这两年深度学习进入故障诊断领域是必然趋势。但直接用一维原始信号扔进卷积网络效果其实一般。原因也很简单原始振动信号长度动辄几千上万个点噪声干扰大而且故障特征往往是窄带冲击卷积核在时域上直接卷积很难对准那些瞬态成分。这时候就需要先做一步时频变换把一维时间序列映射成二维时频图让网络直接看频率随时间的变化模式。1.2 DWVD时频分析在信号表征上的优势时频分析方法很多短时傅里叶变换STFT、连续小波变换CWT、希尔伯特黄变换HHT都有人用。我在项目里最终选了离散韦格纳分布DWVD核心原因是它在时频聚集性上的表现确实突出。先解释一下原理。Wigner-Ville分布本质上是一种双线性时频变换它不依赖窗函数所以没有STFT那种时域分辨率和频率分辨率互相牵制的问题。对于单分量信号WVD的时频聚集性是最理想的——信号能量集中在瞬时频率轨迹附近看起来就是一条清晰的脊线比STFT那种糊成一片的时频图清楚太多了。在故障诊断场景下滚动轴承的内圈故障、外圈故障、滚动体故障对应的冲击频率在时频图上表现为不同的周期性格线WVD能把这些格线清晰地展出来。但WVD也有一个著名的毛病交叉项干扰。多分量信号做WVD时任意两个分量之间都会产生交叉项而且交叉项的幅值可能比真实信号还大时频图上会出现一堆莫名其妙的虚假能量带。处理办法有两种一是用核函数做平滑滤波比如Choi-Williams分布、Cohen类分布本质是抑制交叉项的同时牺牲一部分时频聚集性另一种就是我采用的思路——先对信号做带通滤波或者经验模态分解EMD预处理把信号拆成若干窄带分量再分别做DWVD最后叠加。这样既保留了WVD的高聚集性又避开了交叉项。实际测试下来一个轴承外圈故障的振动信号用STFT做出来的时频图故障特征频率需要在图上去找而用DWVD做出来的图故障冲击的脊线非常明显肉眼几乎能直接判断故障类型。这一步预处理的质量直接影响后续网络的收敛速度和上限值得花时间调。1.3 MCNN-BiGRU-Attention组合模型的分工逻辑拿到高质量的时频图之后接下来要让网络自己学习特征。我选择MCNN-BiGRU-Attention这个组合每一步都有明确的目的不是为了堆模型。MCNN多尺度卷积神经网络解决的是时频图上故障特征尺度差异大的问题。内圈故障的冲击间隔短特征在时频图上表现为较细的局部纹理滚动体故障的冲击间隔长往往还伴随保持架旋转调制特征覆盖的时频区域更大再加上转频、倍频这些背景成分不同故障类型的特征尺度跨度非常大。单一尺寸的卷积核只能覆盖某个尺度范围所以我把三个卷积分支并行每个分支用不同尺寸的卷积核相当于用三个不同视场的放大镜同时去看这张图然后把三个分支的特征拼接起来。这样做的直观效果是网络既能捕捉到细小的冲击纹理也能感知到宽泛的调制边带。BiGRU双向门控循环单元解决的是时序上下文建模问题。时频图虽然看起来是二维的但本质上频率轴是周期性变化的时间轴是渐进展开的。故障冲击在时间轴上呈现的是一种事件序列比如内圈故障每转一圈有一次冲击冲击间隔均匀外圈故障冲击发生在承载区幅值有调制。BiGRU能从两个方向捕捉这种时间依赖关系正向GRU能学习冲击事件的递进规律反向GRU能回溯冲击事件的上下文模式。相比单向GRU双向结构在这个场景下能把诊断准确率稳定提升2~3个百分点。Attention机制解决的是特征权重分配问题。时频图上不是所有区域都对故障诊断有用转频分量、噪声带都是干扰信息。注意力机制本质上是在教网络应该重点看哪里。训练结束后我观察过注意力权重的可视化结果网络确实把高权重分配给了故障特征频率所在的时频脊线附近区域而背景噪声区域的权重很低。这个机制非常灵活处理不同工况下的数据时它能自动调整关注区域这也是模型泛化能力的重要来源。最后把这几个模块串起来整体流程就是原始振动信号 → DWVD时频变换 → 时频图归一化 → MCNN多尺度特征提取 → 特征序列化 → BiGRU双向时序建模 → Attention加权聚合 → 全连接分类输出。整个诊断网络的效果验证下来比单纯的基于STFT的CNN模型、基于小波包的CNN-LSTM模型都有明显优势这个我在后面的实验对比部分会详细说。2. DWVD时频变换的原理与Matlab实现要点2.1 DWVD的数学原理与关键参数选择离散韦格纳分布DWVD是连续WVD在离散域的实现形式。设离散信号为x(n)n 0, 1, ..., N-1其DWVD定义为W(n, k) 2 * Σ_{m-M}^{M} x(nm) * x*(n-m) * exp(-j * 4π * k * m / N)这里的n是时间索引k是频率索引m是延迟变量x*表示共轭。计算过程中核心参数有两个一个是信号长度N决定了时频矩阵的尺寸另一个是延迟变量m的范围M实际起到类似窗函数的作用。M取太小时频聚集性下降M取太大计算量上去了而且对于非平稳信号过大的延迟范围会导致时频分布过于平滑丢失瞬态细节。我测试下来信号长度N取1024、M取N/4是一个比较合理的折中既保留了足够多的时频细节计算量也在可控范围内。交叉项抑制是DWVD实现绕不开的问题。我的做法是在DWVD之前先做带通滤波。比如轴承诊断先根据转频和故障特征频率先验知识确定一个带通范围把无关的高频噪声和低频转频成分滤掉再做DWVD。这样交叉项大幅减少时频图干净很多。实际操作的时候我试过直接对原始信号做DWVD时频图上交叉项的能量甚至能盖过真实特征网络训练时loss死活降不下去。后来加上带通滤波预处理效果立竿见影。这个经验非常关键。DWVD结果的尺度问题也要注意。时频矩阵每个元素的值范围波动很大直接送进网络会让训练不稳定。我的做法是做完DWVD后对时频矩阵做log归一化处理把值映射到0~1区间相当于把动态范围压缩。这块我一开始忽略了直接拿原始幅值送入网络训练曲线一路剧烈震荡后来加上log归一化就平顺了。2.2 Matlab实现关键代码与参数调优Matlab实现DWVD非常简单我用的是自带函数wigner配合信号预处理和后处理完整流程如下% 参数设置 Fs 12000; % 采样频率单位Hz N 1024; % 信号截断长度 f_low 800; % 带通下限 f_high 6000; % 带通上限 % 读取原始振动信号 % x_raw 你的原始振动信号数组; % 信号截断 x x_raw(1:N); % 带通滤波预处理抑制交叉项 [b, a] butter(4, [f_low, f_high] / (Fs / 2), bandpass); x_filt filtfilt(b, a, x); % 去除均值消除直流分量干扰 x_filt x_filt - mean(x_filt); % 计算DWVD [tfr, t, f] wigner(x_filt); % 取时频矩阵的实部并转置成标准格式 tfr_real real(tfr); tfr_real flipud(tfr_real); % 翻转使频率从低到高排列 % log归一化压缩动态范围 tfr_log log1p(abs(tfr_real)); tfr_norm (tfr_log - min(tfr_log(:))) / (max(tfr_log(:)) - min(tfr_log(:)));这里有几个细节值得注意。滤波用的是butterfiltfilt组合filtfilt是零相位滤波能避免相位失真对时频分布的影响这一点很重要因为故障冲击的相位信息里包含了冲击发生的时刻如果滤波过程引入了相位偏移时频图上冲击脊线的位置就会错位。wigner函数默认输出是单边谱频率索引对应的实际频率需要用f数组换算。参数调优方面带通上下限的选择需要结合具体工况。以轴承故障为例转频通常在几十赫兹外圈故障特征频率大概在转频的3~5倍内圈故障特征频率在转频的5~8倍左右所以带通下限设在800 Hz能有效滤掉转频及其低次谐波带通上限设在6000 Hz是为了避开高频噪声和结构共振频率。如果做齿轮箱诊断齿轮啮合频率通常在1000 Hz以上带通范围就要相应提高。这块没有万能公式建议先用频谱分析看看主要能量集中在哪个频段再定带通范围。2.3 时频图预处理与数据集构建DWVD出来的时频矩阵是1024×1024的规模直接整张图送进网络计算量太大而且很多区域是冗余的。我的做法是裁剪掉能量极低的频率带和高频噪声带只保留带通滤波范围内的频谱部分。实际代码里就是从tfr矩阵中截取与800 Hz~6000 Hz对应的行索引这样时频图缩到大约500×1024的尺寸。再进一步可以用imresize统一缩放到224×224或者128×128适配CNN输入。数据集构建要考虑样本量平衡问题。故障诊断实验台采集的数据正常状态和不同故障类型的样本数往往不平衡如果不处理网络会对多数类过拟合。我的做法是过采样少数类样本同时对多数类样本做随机裁剪增强。具体来说把每个样本从原始长信号中按一定步长滑动截取N点截取时加入随机偏移相当于做了一次信号层面的数据增强能在不改变故障本质的前提下增加样本多样性。数据集的划分也有讲究。我采用的是按工况划分而不是随机打乱划分。什么意思呢设备在不同转速、不同负载下的振动信号分布差异很大如果随机打乱训练集和测试集网络可能只是记住了某个工况下的数据分布泛化能力被高估了。我的做法是让训练集覆盖部分工况测试集用完全没参与训练的工况数据这样评估出来的准确率才能反映模型在实际应用中的表现。3. MCNN-BiGRU-Attention网络结构解析3.1 多尺度CNN分支的设计与理由MCNN部分是整个模型的特征提取前端我的设计是三个并行分支每个分支包含卷积、批归一化、ReLU激活、池化四个基本操作。三个分支的卷积核尺寸分别设置为3×3、5×5、7×7通道数统一设置为32步长为1padding方式设置为same。先看3×3分支。3×3卷积核是最常用的尺寸感受野小适合提取时频图上的局部纹理特征比如单个故障冲击形成的细小能量点。在时频图上一次冲击对应一小块高频能量区域3×3卷积核能够精准定位这类微观模式。5×5分支介于两者之间捕捉的是中等尺度特征比如连续几次冲击形成的短弧线。轴承外圈故障的时频图上冲击序列在时间轴上等间隔排列5×5卷积核能同时覆盖到两条相邻冲击的局部上下文。7×7分支感受野最大专门捕捉宽泛的调制模式。滚动体故障或保持架故障的时频图故障冲击受到低频调制在时频图上表现为粗细不均的带状纹理7×7卷积核能覆盖更大范围的时频区域把这个调制模式整体收入视野。三个分支的输出在通道维度上拼接得到96通道的特征图。这里有一个设计权衡需要说明通道数从32扩展到96特征表达能力提升了但参数量也增加了。我的实验表明在中等规模数据集每类约1000个样本上96通道已经是性价比很好的配置继续增加到128通道会明显过拟合。训练时有用的一个技巧是在每个分支的卷积层后都加dropout丢弃率设置为0.3有效抑制了多分支结构带来的过拟合。3.2 BiGRU时序建模的关键配置MCNN输出的特征是二维特征图格式但BiGRU的输入是序列格式所以中间需要做一个维度变换。我的处理方式是把特征图按时间轴方向分解成若干时间步每个时间步的特征是该时刻所有通道、所有频率点的特征向量拼接而成。举个例子如果MCNN输出的特征图尺寸是H×W×CH随时间方向变化我就把H方向作为序列长度每个时间步的特征长度是W×C。这样相当于把一张完整的时频图按时间切片成多个帧逐帧送入BiGRU处理。BiGRU层的配置上我先用了双向两层结构。第一层隐藏单元数64第二层128dropout设置为0.4。选择双层的理由是故障特征在时频图上既有短期的局部模式单次冲击也有长期的变化规律冲击间隔模式单层GRU更擅长捕捉短依赖两层结构能叠加出更长范围的时序建模能力。实际效果验证一层GRU的准确率在91%左右增加到两层提升到95%以上。有一个实现细节要提BiGRU的两个方向输出如何融合。我们在每个时间步把正反向GRU的隐藏状态直接拼接成2×128维向量而不是相加或取平均。拼接保留了正反向两个方向的完整信息后续Attention可以独立学习各方向的重要性权重。实际做过对比拼接比平均高出了1.5个百分点大家可以参考。3.3 Attention特征加权与分类输出Attention层的作用是根据任务动态分配各时间步特征的权重。实现上我采用的是加性注意力Additive Attention机制对每个时间步t计算一个分数score_t v^T * tanh(W_a * h_t b_a)其中h_t是BiGRU第t个时间步的输出W_a、v、b_a都是可学习参数。然后用softmax把分数归一化成权重α_t最后加权求和得到整个序列的聚合特征向量context Σ_t α_t * h_t为什么选择加性注意力而不是简单的平均或最大池化因为时频图上不同时间段的信息价值差异很大。设备正常运行阶段时频图上能量分布比较均匀各时间步特征区分度低发生故障冲击的时刻对应时间步的特征具有显著的模式注意力机制能把这些关键帧的权重拉高。训练过程中我保存过注意力权重的可视化发现故障冲击出现的时刻权重接近0.6~0.8而平稳运行段的权重普遍在0.2以下。Attention聚合后特征向量经过一个全连接层映射到128维再经过一个softmax分类层输出故障类别概率。为了降低过拟合风险我在全连接层前加了dropout概率设为0.5。分类层输出维度根据故障类别数确定如果做三分类正常、内圈故障、外圈故障输出维度就是3。整个模型的训练配置上优化器使用Adam初始学习率0.001batch size设置为64epoch数设置为100。学习率调度上采用ReduceLROnPlateau策略当验证集loss连续10个epoch不下降时学习率减半。训练完成后用测试集评估准确率能达到96.3%左右相比单一CGN模型提高了约8个百分点。4. 实验过程与结果分析4.1 数据准备与实验设置实验数据用了某型滚动轴承的振动实测数据。采集条件包括四种状态正常状态、内圈故障、外圈故障、滚动体故障每种状态包含500个训练样本和200个测试样本。采样频率12 kHz每个样本截取1024个点对应时长约85毫秒这个长度能覆盖至少两个轴承旋转周期的信号保证故障冲击序列的完整性。预处理流程完全按照前面说的步骤带通滤波、DWVD变换、log归一化、尺度缩放。最终的时频图统一缩放到128×128像素作为网络输入。这里给出一个典型的时频图特征描述外圈故障在时频图上表现为规律的竖直条纹序列条纹之间的时间间隔约等于外圈故障特征频率的倒数内圈故障同样有竖直条纹但幅值受转频调制呈现波浪形的包络滚动体故障的时频图则表现为短横纹与竖纹的交错模式复杂度更高。训练环境用的是单块GPU显存8 GB整个MCNN-BiGRU-Attention模型的单epoch训练时间约15秒100个epoch总共耗时25分钟左右。网络参数量大约在180万左右对于故障诊断这种中等规模数据场景来说这个参数量是合适的不会过度复杂。4.2 消融实验与对比分析为了验证每个模块的贡献我设计了一组消融实验。第一组是去掉DWVD模块直接用原始一维信号作为MCNN输入等于测试时频预处理的必要性第二组是保留DWVD但去掉BiGRU只用MCNNAttention直接分类第三组是保留DWVD和BiGRU但去掉Attention用平均池化替代第四组是完整模型。各模型在测试集上的准确率对比如下模型配置准确率参数量原始信号 MCNN Attention87.2%145万DWVD MCNN Attention92.8%152万DWVD MCNN BiGRU平均池化94.5%178万DWVD MCNN BiGRU Attention完整模型96.3%182万这个表格很能说明问题。去掉DWVD准确率直接掉了9个百分点可见时频预处理的作用远超网络结构优化去掉Attention换平均池化准确率下降1.8个百分点说明注意力机制确实在特征筛选上发挥效果但幅度不如时频预处理那么明显增加BiGRU提升了1.7个百分点时序建模对故障特征提取也有实际增益。结论就是DWVD预处理是精度提升的最大贡献者BiGRU和Attention各自贡献接近组合起来效果最好。4.3 关键结果可视化与解读除了总准确率我还看了混淆矩阵和t-SNE特征分布图。混淆矩阵显示模型在外圈故障与滚动体故障之间分类错误率最高有3.4%的外圈故障样本被错分成滚动体故障。原因很好理解这两种故障的时频模式在某些工况下确实存在交叉重叠尤其是当滚动体故障的调制特征不明显时两条冲击序列的间隔非常接近网络难以区分。后续改进可以从损失函数着手比如给难分样本更高的权重或者增加更多滚动体故障的训练样本。t-SNE特征分布图更有意思。我用训练好的模型提取测试集样本在Attention输出层的特征通过t-SNE降到二维平面展示。正常情况下四个类别的点在二维空间里呈簇状分布簇间距离明显簇内紧凑其中正常状态簇与故障状态簇距离最远内圈故障簇与外圈故障簇距离适中滚动体故障簇与它们边缘稍有交叉但仍可区分。对比只用MCNN提取特征的效果后者不同类别的点散布明显混杂说明BiGRU和Attention确实把特征空间重塑得更利于分类了。5. 常见问题与排查技巧实录5.1 DWVD参数设置的典型误区第一个最常见的坑是直接拿原始信号做DWVD完全不考虑交叉项干扰。出来的时频图混叠严重网络训练时验证集loss波动非常大。排查方法很简单先看几幅时频图样本如果图上存在明显规律性波纹或能量分布不符合预期多半就是交叉项的问题。解决办法我之前说了带通滤波预处理加上EWT/EMD等窄带分解效果立竿见影。第二个坑是信号截断长度N的选择。N太短时频矩阵分辨率不足频率轴上的格子太粗相邻两个故障频率成分叠在一起N太长样本内的信号可能跨越多个工况循环时频分布变得不稳定。我建议N的选择能至少覆盖5个故障冲击周期以12 kHz采样率、外圈特征频率约100 Hz为例故障冲击周期约10 msN取1024点对应85 ms覆盖8个左右周期是够用的。第三个坑是忘记去除直流分量。传感器信号经常带有一点直流偏置这个偏置在DWVD上会产生零频附近的高强度分量把有效故障特征掩盖掉。我在代码里做了x_filt x_filt - mean(x_filt)这个操作虽然简单但经常被忽略。5.2 网络训练不收敛的排查训练不收敛的原因分几类。如果loss曲线初期就nan大概率是输入数据里有异常值检查DWVD时频图上是否有Inf或极端值log1p归一化是能限制这种情况的但如果原始信号里有脉冲噪声log1p保护不住。解决办法是在带通滤波前增加一个中值滤波去除脉冲野值。如果loss曲线波动剧烈且不下降先确认学习率是否过大。我遇到过Adam设置0.01训练抖动得厉害降到0.003之后曲线就平滑了。其次是确认输入数据归一化是否到位时频图的数值范围如果都在几百上千网络梯度会爆炸log归一化能把这个范围压缩到0~1。如果loss能下降但验证集准确率上不去多半是训练集和验证集的数据分布差异过大。这段时间我意识到随机划分数据集的危害——模型可能在同工况数据上学到的是记忆而非诊断能力改成按工况划分之后虽然准确率一开始小幅下降但最终收敛后的泛化性能更好更接近真实应用场景。5.3 数据不平衡与泛化性能的实操心得故障诊断数据集天然不平衡正常状态样本远多于故障状态外圈故障样本通常也比滚动体故障多。这种不平衡会让模型偏向多数类少数类召回率很低。我的做法是加权损失函数在交叉熵损失里给少数类分配更大的类别权重权重比例根据样本量的反比来设置。训练后少数类召回率从82%提升到93%总准确率没有明显下降。关于泛化性能的思考我还有一个实际观察。把网络部署到新的设备上测试的时候刚开始准确率只有88%左右比实验室数据低了8个点。分析原因是新设备的安装方式、传感器类型、结构共振频率都与实验室数据不同时频图分布有点偏移。解决办法是对新设备做一组浅层微调只训练最后的全连接和Attention层冻结MCNN和BiGRU参数用小样本每类50个微调后准确率回到了95%以上。这说明完整模型学到的时频表征是通用的但最终分类边界需要根据具体工况适配这也是一种重要的迁移场景。训练时的监控也需要注意。除了看loss每个epoch都保存注意力权重矩阵是个好习惯。如果发现注意力权重分布均匀得像平均池化说明模型没有学到重点关注的时频区域需要考虑增加Attention层的特征维数或调整网络结构。但如果注意力权重集中到某一个时间步上几乎为1其他都是0也说明模型过拟合了某一条冲击序列需要注意正则化。最后分享一个扩展想法。这套DWVDMCNN-BiGRU-Attention的框架不只适用于轴承故障诊断。我把同样的流程迁移到齿轮箱故障诊断中只需要调整带通滤波的频段范围和信号截断长度模型主体结构完全不变诊断准确率同样能到95%以上。本质上只要故障模式能在时频图上呈现规律性的特征纹理这套方法就具备不错的迁移能力。诊断网络的核心竞争力最终还是回到什么是有效的特征表示这个问题上DWVD给出了好的特征MCNN-BiGRU-Attention完成了好的特征学习与决策一路做下来虽然踩了不少坑但整体思路和实现路径是清晰可复现的。