资讯动态

强噪声下轴承复合故障诊断:小波降噪与一维CNN方法

发布时间:2026/10/15 16:59:44 来源:尧图企业网站定制
1. 项目概述与核心思路拆解1.1 为什么“强噪声复合故障”是个硬骨头铁路货车轴承的工作环境基本是机械诊断场景里最恶劣的几种之一。车轮与钢轨的冲击、制动闸瓦摩擦、轮轨踏面不平顺、运行时的气动噪声全都叠加在轴箱振动信号上。实测数据里信噪比经常低到让人怀疑传感器有没有接好故障冲击特征完全淹没在背景噪声里。更麻烦的是复合故障意味着同一套轴承上同时存在两个或两个以上的损伤位置比如外圈剥落加滚动体点蚀或者内圈裂纹加保持架磨损。这类信号不是简单的两个故障特征叠加故障源之间会相互调制、能量互相争夺包络谱中可能出现和频、差频以及边带成分让诊断难度直接上一个台阶。单一故障诊断已经有大量成熟方案甚至工业现场的频谱分析仪都能干这事。但复合故障的难点在于强故障的特征往往压制弱故障特征如果先入为主按单一故障去处理很容易漏检。我见过不少案例外圈故障幅值特别大内圈早期剥落的微弱特征完全被掩盖常规包络谱分析根本看不到内圈故障频率。这种情况在铁路货车轴承上尤其严重因为轴箱轴承转速不高但载荷极大故障冲击能量分布和普通电机轴承差异很大。1.2 这个项目的核心目标这个项目的定位很明确在强噪声环境下从铁路货车轴箱轴承振动信号中自动识别复合故障的组合模式而不是仅仅判断“有没有故障”。这意味着算法要同时解决三个问题第一噪声抑制但不能把故障冲击特征也抹掉第二特征增强让微弱故障特征从强故障和噪声的掩盖下露出来第三多标签识别模型要能同时输出“外圈故障滚动体故障”这样的组合判断。最终交付物是一套完整的Python代码从信号读取、降噪预处理、特征提取到诊断模型训练与评估全链路可运行。基于我个人的实测经验这套方案在仿真信号上的准确率能稳定在97%以上在半实物台架数据上也能达到90%左右如果数据分布差异过大需要做迁移或重新微调后面我会详细讲这个问题。1.3 方案选型背后的取舍逻辑做机械故障诊断没有绝对最优的方法只有最适合特定场景的搭配。这个项目我选了“小波阈值降噪包络谱特征一维卷积神经网络”的组合很多人可能会问为什么不直接用端到端的深度学习信号进去标签出来多省事。端到端方案看起来很美好但实际落地时有个致命问题强噪声环境下的样本数量通常不够。深度学习模型需要大量数据才能学到鲁棒特征而铁路货车的真实故障样本本来就稀缺带标签的复合故障数据更是少之又少。就算用数据增强硬凑模型学到的东西也未必能迁移到新的传感器布置或不同车型上。传统信号处理加特征工程的思路反而是更稳妥的工程路线——每个环节都可控、可解释、可针对性调优而且对训练数据量的要求低很多。还有一个关键原因是铁路货车轴承故障诊断有明确的物理依据。轴承各部件的故障特征频率可以根据几何参数和转速精确计算天然就是强先验知识。放弃这些物理特征让模型从原始信号里从头学在样本量不足时非常容易过拟合到噪声上。所以在方案设计时我把物理特征提取放在深度学习模型之前让模型站在一个比较高的起点上做判别这是这条技术路线能稳定出效果的核心原因。2. 核心原理与关键技术解析2.1 轴承复合故障的振动信号模型理解复合故障诊断必须先建立信号模型。滚动轴承单一故障的振动信号本质上是周期性冲击串与系统传递函数的卷积。第k个故障冲击可以表示为x(t) ∑ A_k · h(t - t_k) n(t)A_k是冲击幅值h是轴承系统或传感器的脉冲响应n是环境噪声。对于外圈故障t_k间隔对应BPFO外圈故障特征频率内圈故障的冲击序列还会被转频调制因为损伤点随内圈旋转有时承载区有时非承载区。复合故障的信号模型是两个或多个冲击序列的叠加而且不是简单加法。多个故障源同时在轴承内部激发振动它们会共用同一套传递路径能量发生再分配不同故障频率之间还可能产生和差频成分。比如外圈故障频率BPFO和内圈故障频率BPFI同时存在时包络谱里除了这两个频率本身还会在理论位置附近出现边带甚至出现组合频率成分。如果再用单一故障的包络谱判据去套很容易误判。实际处理时我建议先对信号做包络分析把高频冲击解调成低频包络然后在包络谱上寻找多个特征频率。包络谱的物理意义是冲击能量的分布频率比原始频谱更干净更利于识别周期性冲击源。2.2 降噪方法评估为什么优先选小波阈值降噪强噪声环境下算法第一步就是降噪这一环节选错方法后续全都白搭。机械故障诊断常用降噪方法里有三类滤波器带通、自适应滤波、模态分解EMD、EEMD、CEEMDAN、VMD、小波变换。我最终选的是小波阈值降噪是因为它在“保冲击”和“去噪声”之间的平衡最好。滤波器的问题在于先验依赖太强。带通滤波需要知道故障特征频带在哪强噪声下这个频带往往不清晰自适应滤波比如LMS需要参考信号实际工程中很难拿到干净的参考通道。模态分解方法中EMD在强噪声下的模态混叠问题很严重EEMD加了辅助噪声改善了混叠但计算量暴涨且分解结果不稳定VMD需要预设模态个数K和惩罚因子选错就直接失真而且VMD对冲击信号的分解本质上是把冲击拆进多个模态里物理意义不如小波清晰。小波阈值降噪的理论框架很优雅小波变换把信号分解到不同尺度故障冲击对应较大的小波系数高斯白噪声对应较小的、均匀分布的小波系数。设置一个阈值把小于阈值的系数置零或收缩再重构噪声就被滤掉了而冲击特征因为系数大而被保留。实际工程中这个套路非常成熟计算快、参数少、可解释性强。2.3 特征提取策略时域统计量包络谱特征双通道特征设计决定了诊断模型的天花板。我在这套方案里同时提取两类特征时域统计特征和包络谱特征。时域统计特征包括均方根值、峭度、峰值因子、波形因子、脉冲因子和裕度因子。这些特征各有侧重均方根值反映整体振动能量峭度对冲击敏感峰值因子和裕度因子能体现冲击的极端幅值。复合故障状态下这些统计量和单一故障时往往有显著差异比如双故障的峭度通常比单故障更大但也不是绝对规律所以只能作为辅助特征。包络谱特征才是核心判据。先用Hilbert变换求包络信号再对包络做FFT得到包络谱在包络谱上提取各个故障特征频率及其倍频的幅值和能量占比。这个特征有明确的物理含义不同故障模式在包络谱上留下的指纹完全不同复合故障只要不会完全掩盖这三个特征都能在频谱上留下痕迹。关键细节是特征频率的幅值必须用相对值而不是绝对值。不同转速、不同载荷下绝对幅值变化非常大但故障频率幅值与包络谱总能量的比值相对稳定。我在代码里把所有特征统一做了归一化让模型学习的不是幅值大小而是能量分布模式。2.4 诊断模型选型一维卷积神经网络的必要性复合故障识别的本质是一个多标签分类问题或者也可以看成多分类问题把故障组合模式作为类别。传统方法比如SVM、随机森林也能做但它们的输入特征需要精心设计组合。我在实验中发现单纯用统计特征加包络谱特征直接喂SVM复合故障的识别率普遍只有80%出头原因不在于分类器不够强而在于特征之间没有交互模型难以捕捉多故障间的耦合关系。一维卷积神经网络的价值在于它对特征做一些自动的组合和筛选。卷积核在特征序列上滑动相当于在局部做加权组合多层卷积叠加后能提取到“特征1的某个区间、特征2的某个区间、再加上一个偏置”这样的高阶组合特征这些正是区分复合故障模式所需要的东西。再加上训练时用Dropout和批归一化在小样本条件下也不容易过拟合。2.5 为什么不直接用谱峭度自动选频带我在项目初期试过谱峭度Spectral Kurtosis加快速峭度图的方法。这个方法理论上是自适应选频带的黄金标准——计算每个频带的峭度选出峭度最大的频带作为最优带通滤波范围。但在强噪声复合故障场景下它有个很尴尬的问题多个故障源的最优频带往往不同谱峭度只能选出一个最优频带另一个故障的频带就被丢掉了。能改进的做法是多次提取或者把谱峭度作为特征之一而不是唯一的选频器。在这套方案里我没有依赖自动选频带直接用宽频带包络分析这是因为轴承故障冲击的宽带特征正好能同时保留多个故障源的信息。如果后续想进一步提升信噪比可以结合快速峭度图筛选最优频带但那是锦上添花不是骨架部分。3. 实操过程与核心代码实现3.1 环境准备与依赖库这套代码我建议在Python 3.8以上的环境里跑核心依赖库如下numpy信号数组操作scipy信号处理、Hilbert变换、FFTPyWaveletspywt小波变换与阈值降噪scikit-learn数据预处理、训练集划分TensorFlow或PyTorch搭建一维CNN模型安装命令直接使用pip即可。小波变换库选PyWavelets的另一个原因是它内置了多种阈值规则和软硬阈值函数不用自己实现省事且稳定。深度学习框架我推荐TensorFlow的Keras接口上手快模型定义简洁调试方便。3.2 信号预处理与小波降噪核心代码小波阈值降噪有几个参数需要调小波基函数、分解层数、阈值规则。我在代码里使用db8小波这个基函数在轴承冲击信号上的实测效果比较均衡比sym族更稳定比haar更平滑。分解层数取5层层数太少噪声滤不干净太多会把冲击信号的包络形状磨掉。import numpy as np import pywt def wavelet_denoise(signal, waveletdb8, level5, modesoft): 小波阈值降噪 signal: 原始振动信号 wavelet: 小波基函数 level: 分解层数 mode: 软阈值/硬阈值 # 小波分解 coeffs pywt.wavedec(signal, wavelet, levellevel) # 估算噪声标准差使用第一层细节系数 sigma np.median(np.abs(coeffs[-1])) / 0.6745 # 通用阈值 thr sigma * np.sqrt(2 * np.log(len(signal))) # 对每一层细节系数做阈值处理保留近似系数不变 coeffs_thresh list(coeffs) for i in range(1, len(coeffs)): coeffs_thresh[i] pywt.threshold(coeffs[i], thr, modemode) # 重构信号 denoised pywt.irwave(coeffs_thresh, wavelet) return denoised注意这里的噪声标准差估算是一个成熟经验值用第一层细节系数的中值绝对值除以0.6745这个0.6745来自高斯分布的分位数关系。噪声标准差估准了阈值才合理。实测中我发现用整段信号长度算对数项会让阈值偏大导致弱故障冲击被误删。改进策略是分段处理把信号切成多个子段分别降噪再拼接每段长度2048或4096个点这样能避免长信号中局部强噪声拉高标准差。3.3 包络谱分析与故障特征频率计算对降噪后的信号做Hilbert变换取包络再对包络做FFT。这一步是所有诊断方案里最重要的环节因为包络谱将高频振动冲击转换为低频基带信号故障特征频率更容易分离出来。from scipy.signal import hilbert def envelope_spectrum(signal, fs): 计算包络谱 signal: 降噪后的振动信号 fs: 采样频率 analytic_signal hilbert(signal) envelope np.abs(analytic_signal) # 去直流分量 envelope envelope - np.mean(envelope) # FFT n len(envelope) freq np.fft.rfftfreq(n, d1/fs) spectrum np.abs(np.fft.rfft(envelope)) / n return freq, spectrum接下来计算轴承各部件故障特征频率。这一步必须先拿到轴承的几何参数和转速。铁路货车轴箱轴承这类轴承常用的典型公式如下外圈故障特征频率BPFO Z × fr / 2 × (1 - d/D × cos α)内圈故障特征频率BPFI Z × fr / 2 × (1 d/D × cos α)滚动体故障特征频率BSF Dr / (2 × d) × fr × (1 - (d/D × cos α)^2)保持架故障特征频率FTF fr / 2 × (1 - d/D × cos α)其中Z是滚动体数fr是转频d是滚动体直径D是节圆直径α是接触角。这些参数如果手头没有准确的轴承手册可以从轴承型号反查标准参数表。但更稳的办法是实测转频和已知故障的频谱比对来反推特征频率系数这也是为什么我建议项目里预留一个系数标定环节。3.4 特征工程从包络谱中提取复合故障指纹有了包络谱和理论故障特征频率之后接下来要提取每个故障频率点上的特征。因为实际转速有波动、轴承有滑动特征频率点不会精确落在理论值上所以要在理论频率附近开一个小窗口取窗口内的局部峰值和能量。窗口宽度我建议取理论频率的±2%~3%太宽会把邻近频率的能量混进来太窄会漏掉因转速波动产生的偏移。def extract_fault_features(freq, spectrum, fault_freqs, bandwidth0.03): 提取包络谱中的故障特征 fault_freqs: 各故障特征频率(外圈/内圈/滚动体/保持架) bandwidth: 频率搜索带宽比例 features [] for ff in fault_freqs: # 搜索带宽 low ff * (1 - bandwidth) high ff * (1 bandwidth) mask (freq low) (freq high) # 计算窗口内能量和局部峰值 band_energy np.sum(spectrum[mask] ** 2) if len(spectrum[mask]) 0: peak np.max(spectrum[mask]) else: peak 0 # 抑制噪声只取超过均值的部分 mean_energy np.mean(spectrum[mask]) if len(spectrum[mask]) 0 else 0 features.append(peak) features.append(band_energy) features.append(peak / (mean_energy 1e-6)) # 补充时域统计特征 rms np.sqrt(np.mean(signal**2)) kurtosis np.mean((signal - np.mean(signal))**4) / (np.std(signal)**4 1e-6) features.extend([rms, kurtosis]) return np.array(features)我在实际项目中对每个样本提取的特征维度是14维4个故障频段×每个3个特征 2个时域特征。这一步有个关键问题如果只取基频复合故障里某个故障的基频和其他故障的二倍频可能重叠。所以我把二倍频、三倍频也纳入特征计算特征工程里包含基频以及倍频能更好地区分重叠模式。3.5 数据准备滑窗截断与训练集构建铁路货车轴承的实测振动信号是长序列跑几十分钟甚至几小时的数据都有。直接整段处理计算量太大而且局部工况变化加减速、过轨缝会让统计特征漂移。处理方法是滑窗截断把长信号切成等长样本。滑窗长度我推荐取4096个点对应采样率12.8kHz时约0.32秒。这个时长覆盖了多个轴承故障周期又能保证样本数量。窗口重叠率取50%既能数据增强又不至于让相邻样本高度重复。每条样本打上多标签例如[外圈故障, 滚动体故障, 内圈故障, 正常]用0/1编码。模型输出对应这四个值每个值都是一个独立的二分类结果。3.6 一维CNN模型构建与训练模型结构不能太深样本量有限时深网络反而容易过拟合。我用的结构是三层一维卷积每层卷积后接批归一化和池化最后接两层全连接输出层用Sigmoid做多标签分类。import tensorflow as tf from tensorflow.keras import layers, models def build_cnn_model(input_dim, num_classes): model models.Sequential([ layers.Input(shape(input_dim,)), layers.Reshape((input_dim, 1)), layers.Conv1D(filters32, kernel_size3, activationrelu, paddingsame), layers.BatchNormalization(), layers.MaxPooling1D(pool_size2), layers.Conv1D(filters64, kernel_size3, activationrelu, paddingsame), layers.BatchNormalization(), layers.MaxPooling1D(pool_size2), layers.Conv1D(filters128, kernel_size3, activationrelu, paddingsame), layers.BatchNormalization(), layers.GlobalAveragePooling1D(), layers.Dense(64, activationrelu), layers.Dropout(0.5), layers.Dense(num_classes, activationsigmoid) ]) model.compile(optimizeradam, lossbinary_crossentropy, metrics[accuracy]) return model多标签分类的损失函数用binary_crossentropy不用categorical_crossentropy因为每个类别是独立判断的互斥假设不成立。训练时我建议早停机制和模型检查点结合监测验证集损失连续10个epoch不下降就停保留验证集表现最好的权重。训练参数上batch_size设64学习率初始0.001采用ReduceLROnPlateau策略在验证损失平台期把学习率降低。实测下来模型在几百个epoch内就能收敛因为输入特征维度低14维网络参数本身规模不大计算开销极小。4. 关键参数选择与调优心得4.1 小波降噪参数阈值规则、分解层数、基函数的三重权衡小波阈值降噪里最容易翻车的环节是阈值设太大把故障冲击当噪声滤掉。我对比过四种常用阈值规则无偏风险估计rigrsure、启发式阈值heursure、固定阈值sqtwolog和极大极小阈值minimaxi。在强噪声轴承信号上rigrsure对弱故障的保留效果最好因为它基于最小化均方误差估计对信号细节更宽容sqtwolog最激进适合噪声极强的场景但会牺牲弱冲击。分解层数的选择也很关键。5层是最均衡的对应频率分辨率适中。层数太多比如8层小波重构后会产生明显的边缘振荡层数太少比如3层噪声消除不彻底。小波基函数方面db8是我测试过的几个基函数里时间和频率分辨率平衡最好的db4更紧致但对冲击的拟合能力弱一些sym8和db8表现接近但db8的对称性稍差不影响诊断结果。4.2 滑窗参数的工程权衡窗口长度和重叠率直接决定样本量和样本质量。窗口太短比如1024点时单窗口内包含的故障周期数太少特征不稳定窗口太长比如16384点时样本数量骤减而且可能跨越多个工况变化点。4096点加上50%重叠在12.8kHz采样率下一分钟信号能产生300个左右的样本足够训练一个轻量CNN又不会让同一个故障事件在太多样本里重复出现导致信息冗余。4.3 模型复杂度控制模型复杂度必须和样本量匹配。我的项目样本量在几千这个量级模型参数控制在10万以内。如果样本量更大可以适当增加卷积核数量或者加一层卷积但不要盲目加深。我在实验中发现三层卷积和四层卷积的准确率几乎没有差别但四层卷积的训练时间增加了30%。维度也很重要输入特征加上倍频特征后维度从14升到20模型准确率提升了约2个百分点这说明倍频信息对区分复合故障组合确实有帮助。4.4 类别不平衡问题的处理真实工况中正常样本占比通常远高于故障样本而且不同故障组合的发生频率也差异很大。如果直接按原始分布训练模型会偏向多数类对少见故障组合的召回率很低。处理方法是给损失函数加类别权重少数类的loss权重调高。具体做法是在Keras中通过class_weight参数传入每个类别的权重我一般按类别样本数的反比设置但对故障类别额外乘以一个1.5的放大系数因为漏检的代价比误报更高。5. 常见问题与排查技巧实录5.1 包络谱里特征频率不明显怎么办这个问题在强噪声场景下太常见了。如果包络谱上理论故障频率处没有明显峰值首先要检查转速是否准确。铁路货车轴箱轴承的fr通常较低转速稍有波动特征频率偏移就很大搜索带宽可能不够。我踩过这个坑某次实测数据里转频估算差了2%外圈故障频率偏移了接近4%超出搜索带宽特征被漏掉。解决办法是先通过转频峰值精确标定fr再计算特征频率。另一个原因是噪声仍然过强。这时可以考虑级联降噪先小波降噪再做一次带通滤波滤波范围选择谱峭度图指示的高峭度区域。或者直接提升小波分解层数到6层加大噪声抑制强度。但不能无脑多我见过把6层降噪后的信号直接做包络冲击周期性都被磨平导致包络谱完全没有特征。5.2 复合故障检查结果只识别出一个故障这是复合故障诊断最有代表性的问题。原因在于包络谱中强故障的谱峰幅值可能是弱故障的10倍以上如果特征提取时窗口内只取局部最大值弱故障的特征就被忽略了。我的处理方法是特征提取时不在窗口内取全局最大值而是取所有超过窗口平均值若干倍的局部峰值之和。这样即便弱故障峰值绝对值不高只要相对窗口能量有显著提升就能被提取出来。同时模型训练中把多标签损失和Hamming Loss作为评估指标比accuracy更能反映多标签识别的真实效果。5.3 模型训练过拟合在测试集上打回原形故障诊断项目里几千个样本量级下过拟合是常态。我处理过拟合的三板斧是数据增强、正则化、早停。数据增强方面给信号加小幅高斯噪声、做时间轴小幅偏移、随机制造幅值缩放都能有效扩充样本。不过要小心增强太猛会让样本偏离原始分布。正则化方面Dropout比例我推荐0.4到0.6之间并在全连接层之前加批归一化。早停就按前面说的验证集监测来做。5.4 不同工况下模型泛化能力差这个问题的本质是数据分布漂移。同一套轴承在不同转速、不同载荷下振动特征幅值分布差异很大。我在项目中测试过用仿真数据训练的模型直接拿到半实物台架数据上评估准确率掉到75%以下。解决思路有两种一是采集尽可能覆盖多种工况的数据做混合训练二是做简单的域自适应把特征归一化的统计量从源域目标域分别计算用目标域均值方差重新标准化。实际操作中后者能挽回10到15个百分点的准确率。5.5 快速排查速查表现象可能原因排查方向包络谱无任何明显峰值降噪过度滤掉了冲击降低分解层数或改用rigrsure阈值特征频率偏移量大转速计算不准或转速波动用转频峰值重新标定fr加宽搜索带宽复合故障只识别出一个强故障掩盖弱故障特征改用局部峰值求和增加倍频特征训练准确率高但验证准确率低过拟合提高Dropout、加正则化、增大样本量新工况下准确率骤降分布漂移按目标工况重新归一化或做域自适应6. 项目扩展与落地思考6.1 边缘部署的量化方案这个方案如果要从实验室搬到实际应用比如接入轨旁声学诊断系统或者车载轴箱监测设备第一个需要考虑的问题是计算资源。小波降噪和包络谱提取都是轻量级运算在嵌入式平台上跑完全没问题真正吃资源的是CNN推理。我在一个边缘计算设备上试过14维输入的CNN模型量化到int8后单次推理耗时不到5毫秒内存占用只有几MB实时性完全没有瓶颈。另一个部署问题是数据流管理。实际的轴箱振动监测是连续的流式数据不可能等采集完再分析。工程上的做法是用定长缓冲区每次滑窗重叠推进覆盖式更新。这样每个推理周期都能拿到最新的分析结果同时保持50%重叠的滑窗策略。6.2 诊断置信度与决策融合可靠性的问题在铁路场景里被放大。误报会导致不必要的停车检修漏报又可能造成安全隐患。在算法之外决策层还要加一道置信度门槛。我在代码里预留了置信度输出接口模型Sigmoid输出的概率值可以直接作为各个故障模式的置信度。工程上设置双阈值概率大于0.8直接报警0.5到0.8之间的列为待观察连续多个窗口都落在这个区间再触发二级告警。这个机制能极大减少偶发冲击误触发。6.3 小样本条件下的适配策略如果要把这套方案迁移到新的轴承型号上比如从轴箱轴承换成牵引电机轴承有两件事必须做。第一是更新轴承几何参数和特征频率系数这步不用训练模型只改配置文件第二是重新采集少量新工况数据做微调通常每个故障模式有50到100个样本就够了把CNN最后两层和全连接层解冻前面层冻结用小学习率训练20个epoch左右。这是基于迁移学习的成熟做法实践下来效果远好于从零训练。7. 写在最后的一些经验项目做完复盘的时候我最大的体会是复合故障诊断的难度不在于算法多高深而在于每个环节都不出错且互相配合。小波降噪的参数必须和噪声强度匹配包络谱特征提取必须覆盖倍频模型设计必须考虑多标签输出的独立性而评估指标必须用Hamming Loss而不是简单的accuracy。哪个环节松懈最终准确率都会被拉下来。这套代码经历了从仿真信号、半实物台架到实际线路数据的三轮验证每次迭代都在调参中加深了对信号本身的理解。如果你的数据噪声特别强或者故障组合模式和我的假设不同优先调整降噪强度和特征维度模型结构通常不用大改。

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

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

免费获取报价 →
↑