托辊故障检测这个话题最近两年找我聊的人明显多了。干过带式输送机运维的都清楚托辊是整条输送线上数量最多的转动部件一条一千米的皮带托辊轻松上千组分布又分散日常巡检基本靠人拿耳朵凑近听。听得多了耳朵发麻加上现场环境噪声又大很多托辊卡死不转、轴承磨损严重的声音混在皮带跑偏摩擦声和物料撞击声里不贴近根本分辨不出来。等发现问题的时候不少托辊已经把皮带内部钢丝或者织物层磨坏了直接带来非计划停机甚至撕带事故。把声音信号利用起来做托辊故障检测本质上是把老师傅的听音经验变成可程序化的信号处理流程。这个方向在故障诊断里不算新但真正落地时牵扯的东西不少麦克风选型、采样参数、特征提取、识别算法每一环都有不少坑。这篇文章把我实际做这类系统的思路、关键技术点和Matlab代码的实现细节完整记录下来给做设备运维的朋友和在读研的同学做个参考。1. 托辊故障检测的正门与偏门为什么要盯上声音信号1.1 托辊的构造与失效模式托辊结构说起来很简单中间的筒体、两端的轴承座、贯穿的轴、内部的轴承以及密封元件。筒体通过轴承座固定绕轴旋转皮带在筒体上滑动带动托辊转动。托辊的转速通常并不高以直径133mm的托辊、2.5m/s的带速为例换算一下转速n 60 × v / (π × D) 60 × 2.5 / (3.14 × 0.133) ≈ 359 r/min也就是6Hz左右。转速低、载荷不重、又处于粉尘水汽环境托辊的故障模式主要集中在几个方面轴承磨损长时间运转油脂干涸滚动体与滚道表面点蚀、剥落。轴承卡死保持架碎裂、异物进入导致托辊完全转不动筒体表面被皮带磨出平面。密封失效进水进粉尘加速轴承损坏冬季还可能出现冻住不转。筒体磨损皮带打滑或长期摩擦筒体壁厚减薄甚至磨穿。这些故障最终都表现为旋转部件运动状态的改变随之产生的是声音特征的变化。正常转动的托辊声音是平稳的、宽频带的滚动摩擦声轴承发生局部缺陷时滚动体每经过缺陷位置就产生一次机械冲击在声音信号上表现为周期性脉冲卡死托辊则会发出刺耳的滑动摩擦声或随着皮带拖动发出周期性刮擦声。这些声音特征具有明显的频率结构差异是可以利用信号处理方法提取出来做判别依据的。1.2 对比振动、温度、电流……为什么声音检测值得做工业故障检测有一个朴素的原理设备状态变化终归会以某种可测物理量表现出来。托辊检测常见的几个物理量各有各的脾气。振动分析是最成熟的加速度传感器贴到轴承座上信号干净、特征清晰频谱分析直接能算出轴承故障特征频率。但托辊数量太多每个托辊都装传感器成本算下来基本不现实。大型系统上往往只对关键位置的托辊做在线振动监测其余的还是靠人工巡检。温度检测适合早期磨损发热的情况但托辊温升往往滞后而且卡死初期的发热不一定明显红外热像仪巡线是一种手段就是设备投入稍高。声音检测长期被低估的原因是环境干扰太大。但实际上如果麦克风布置得当声音信号的优势非常突出非接触不需要在转动部件上安装传感器不破坏设备原有结构覆盖范围大一只麦克风可以覆盖一段输送线路采集端成本低用一片几块钱的驻极体麦克风或者MEMS麦克风就能拿到足够分析的数据更容易和移动巡检机器人结合机器人沿线巡检时用麦克风录一段声音离线分析特征即可。我实际做下来声音检测的核心难题不是采集而是如何把故障成分从各种混杂噪声中抠出来这也是后面特征提取部分反复打磨的原因。2. 整个系统怎么搭硬件选型与信号采集链路设计2.1 麦克风选型与安装位置麦克风选型主要看三类驻极体电容麦克风便宜、常见灵敏度大概在-40dB ± 3dB左右频率响应在20Hz-20kHz之间。做实验和样机阶段用这类足够接在普通声卡或者单片机ADC上就能采集。MEMS麦克风体积小、一致性高很多智能音箱用的就是这种贴片封装适合做成阵列或集成到巡检机器人上。测量级传声器频响平坦精度高价格也高一个量级适合做标准实验标定现场工程用相对奢侈。对于托辊这种中低频滚动冲击声为主的声音源驻极体麦克风完全够用。现场实在预算有限时不需要追求昂贵的传感器把精力放在信号调理和滤波上效果提升更大。安装位置上固定在皮带机架的支腿或横梁上时要注意几点距离托辊不要超过0.5-1米太远信号衰减而且混入更多环境噪声不要正对落料口或导料槽物料撞击声很大尽量避开皮带与滚筒的贴合位置那里的摩擦啸叫会淹没托辊声。移动巡检方案下采集时降低巡检机器人行走速度或者短暂停顿能显著减少行走风噪声和驱动电机噪声干扰。2.2 采样率与抗混叠设计采样率这里要说清楚一个容易被忽视的问题托辊轴承故障特征频率预计在几十到几百赫兹但采样率不能按这个频率的2倍去定。因为轴承故障产生的冲击脉冲在时域上是很窄的瞬态包含丰富的高频成分如果采样率不够脉冲的形状会失真后续包络解调的效果也会打折扣。此外均匀采样下奈奎斯特频率不够时高频成分会混叠到低频段直接把特征频率区域污染。工程上我做采集时默认按标准的44.1kHz或48kHz采样率信号的有效分析带宽限制在12kHz以内。这样既能捕捉冲击瞬态又方便直接用普通音频采集设备。如果用的是ADC直接采集要确认前端有一级抗混叠滤波器否则高频分量混下来之后再怎么滤波都回天无力。2.3 一个容易被忽略的参数轴承特征频率估算做声音检测前先花十分钟把托辊轴承的故障特征频率估出来后面选滤波器、找特征频带会省很多功夫。以常用的深沟球轴承6205为例节圆直径D≈39mm滚动体直径d≈7.94mm滚动体数Z9接触角α≈0°当转频fr6Hz时外圈故障特征频率BPFO (Z/2) × fr × (1 - (d/D)·cosα) ≈ 4.5 × 6 × (1 - 7.94/39) ≈ 21.5Hz内圈故障特征频率BPFI (Z/2) × fr × (1 (d/D)·cosα) ≈ 4.5 × 6 × (1 7.94/39) ≈ 32.5Hz滚动体特征频率BSF (D/(2d)) × fr × (1 - (d/D)²·cos²α) ≈ (39/(2×7.94)) × 6 × (1 - (7.94/39)²) ≈ 14.1Hz这个估算的意义在于正常托辊的声音频谱是平缓的宽带谱故障托辊的频谱上会出现以这些频率为基波的峰值族包络谱中更是会直接出现明显的谱线。知道大致频率位置就可以把带通滤波器的通带范围选得更有针对性同时识别算法判断是否有周期性冲击时也有了物理基准。3. 信号预处理与特征提取从声音到指纹3.1 预处理三步走去均值、带通滤波、分帧加窗采集到的原始声音信号第一步要先去掉直流偏置也就是减掉均值这一步容易被忽略但对后续频谱分析的精度影响很大。直流量会在FFT结果中形成一个巨大的零频分量配合泄漏效应会把低频段细节掩盖掉。第二步是带通滤波。我一般用四阶巴特沃斯滤波器通带选在500Hz到10kHz之间。下限500Hz是为了去掉现场常见的工频干扰、滚筒低频轰鸣和结构振动噪声上限10kHz是为了在保留故障冲击高频分量的同时压制气动噪声和电子噪声。滤波务必使用零相位滤波Matlab里就是filtfilt而不是filter否则相位偏移后冲击的位置会被扭曲后续包络分析对不上时间轴。这里给出滤波和基础时域特征的计算代码fs 44100; % 采样率 % 带通滤波 500~10000Hz [b, a] butter(4, [500 10000]/(fs/2), bandpass); x_filt filtfilt(b, a, x); % 时域特征 rms_val sqrt(mean(x_filt.^2)); % 均方根值 peak_val max(abs(x_filt)); % 峰值 peak_factor peak_val / rms_val; % 峰值因子 kurt_val kurtosis(x_filt); % 峭度分帧加窗主要用在需要做短时频谱的场景比如谱图分析。每帧取2048或4096点帧移一半加汉明窗减少频谱泄漏。如果是直接对整段数据做特征提取一帧一段的分析量已经够用不需要强行分帧这与语音识别的处理方式略有不同。3.2 时域特征峭度如何抓住冲击感时域特征里挑一个重点说峭度Kurtosis。它的物理意义是信号中大幅值冲击的占比程度正常托辊的声信号接近高斯分布峭度在3附近当轴承产生局部缺陷周期性冲击混入信号后信号分布的尾部变厚峭度值显著上升3.5、4甚至更高。实际使用时要注意现场偶尔的落料声、皮带的瞬时打滑也会带来峭度上升单靠峭度一个值容易误报。我把峭度、峰值因子、RMS、波形因子组合成一个多维时域特征向量任何一个单一指标只是投票成员最后由识别算法综合判断。这样鲁棒性明显好很多。3.3 频域特征包络谱与边频带轴承故障的声音本质上是一种调制信号高频的固有振动成分被低频的故障特征频率调幅。直接看原始FFT频谱时高频段会出现反射中心频率附近的边频带但边频带间隔小、容易淹没在噪声里。处理这类问题标准做法是包络分析也叫Hilbert解调。做法是先对带通滤波后的信号求解析信号取包络再对包络做FFT。包络谱中如果出现某条故障特征频率谱线明显高出背景值并且伴随其2倍频、3倍频基本可以确认该类型轴承故障。计算代码如下% 希尔伯特包络谱分析 envelope abs(hilbert(x_filt)); % 对包络加窗后做FFT L length(envelope); env_win envelope .* hann(L, periodic); env_fft fft(env_win, NFFT); env_amp abs(env_fft(1:NFFT/21)); % 频率轴 freq_axis (0:NFFT/2) * fs / NFFT; % 在freq_axis中搜索BPFO~21.5Hz附近的峰值包络谱的能量主要集中在低频段通常只需看0到200Hz的范围正好覆盖了前面估算的各类轴承故障特征频率。做这一步时一定记得对包络信号加窗否则矩形窗截断造成的频谱泄漏会严重影响低频段分辨率。3.4 时频域方法该不该上时频分析在托辊声音信号里属于锦上添花的工具。如果环境噪声大、故障冲击不规律短时傅里叶变换谱图上可以看到周期性出现的竖条纹一眼就能判断存在周期性冲击。小波变换和经验模态分解EMD也能用但计算量比FFT高一个量级对实时性要求高的系统并不划算。我自己的建议是先把包络谱做好做稳时频域作为离线分析和难例验证的工具。遇到包络谱上特征频率看不清的情况再上时频图确认故障冲击是否存在这样既保证效率又保留了一套更精细的判别手段。4. 故障识别算法从阈值判断到可落地的机器学习4.1 特征候选集怎么定识别算法的输入是特征向量不是原始信号。我常用的特征集包括时域特征RMS、峰值因子、峭度、波形因子、偏度、频谱特征中心频率、频带能量比、特定特征频率峰值、包络谱特征BPFO/BPFI/BSF谱线幅值及其比值等共二十几个维度。维度不高很多特征之间存在相关性比如峰值因子和峭度往往同涨同跌。类别不多的分类任务下可以先用相关性分析把强线性相关的特征去掉一部分剩下的送入分类器。完整的主成分分析PCA降维不是必须的特征少了反而解释性更好出了问题也容易定位到具体是哪个物理特征在起作用。4.2 SVM与BP神经网络的选择思路托辊故障状态本质上是一个小样本分类问题正常样本好采集故障样本需要人工标记且数量有限。在这种场景下支持向量机比深度网络更实用尤其是径向基核的SVM对中小样本的分类性能稳定Matlab里一行fitcsvm就能训练。如果追求一次性判断多类状态正常、外圈故障、内圈故障、卡死我用的是多分类SVM采用一对多策略每个类别训练一个二分类器。BP神经网络在样本量足够且有GPU条件下可以尝试层数不宜太深一般一到两个隐藏层足够。实际对比下来在几百个样本级别上SVM和浅层BP的精度差距不大SVM的训练时间和调参成本明显更低。4.3 训练与评估流程的Matlab实现要点训练部分流程如下把每一个样本文件比如每4秒一段的声音计算特征向量加上状态标签组成数据集。划分训练集和测试集通常按7:3或8:2随机分层划分确保各类别在训练和测试中占比一致。特征先做归一化否则量纲差异会影响SVM的核距离计算。% 特征矩阵 feat, 标签向量 label feat_norm zscore(feat); % 标准化 mdl fitcecoc(feat_norm(trainIdx,:), label(trainIdx), ... Learners, svm, Coding, onevsone); pred predict(mdl, feat_norm(testIdx,:)); acc sum(pred label(testIdx)) / numel(testIdx);评估不能只看整体准确率。托辊场景下正常样本占比可能超过90%如果模型把所有样本都判为正常准确率也能刷到90%但没有任何实际价值。所以必须关注各类别的召回率和漏报率。工程上宁可偶尔误报也不要放过故障。我在系统里加了一个权衡项把故障样本的误分类惩罚调高让模型偏向于不放过虽然误报多一点但明显更符合现场运维的真实需求。5. 系统实现与Matlab代码细节从脚本到能用的小工具5.1 声音信号读取与分段处理系统输入可能是wav文件也可能是实时录制的数据块。这里给出一个读取音频文件的通用流程[x, fs] audioread(test_tuogun.wav); x x(:, 1); % 取单声道 % 如果多段测量按固定长度分割 seg_len fs * 4; % 每段4秒 segments buffer(x, seg_len, seg_len/2, nodelay); % 逐段计算特征并送入分类器分段长度是一个工程权衡点段太短故障冲击出现的次数不够特征稳定性差段太长故障状态被平均化算法响应慢。4秒是我调试下来比较合适的折中既能积累轨道几十个冲击周期又不至于拖慢分析节奏。5.2 特征提取主流程封装把特征提取封装成一个函数很有必要训练和在线预测都复用同一套代码避免两边实现不一致导致训练集特征和现场特征对不上。我的函数大致长这样function feat extract_features(x, fs) % 预处理 [b, a] butter(4, [500 10000]/(fs/2), bandpass); x filtfilt(b, a, x); % 时域特征 feat(1) sqrt(mean(x.^2)); % RMS feat(2) max(abs(x)) / feat(1); % 峰值因子 feat(3) kurtosis(x); % 峭度 feat(4) mean(abs(x)) / sqrt(mean(x.^2)); % 波形因子 % 频谱能量带比 NFFT 4096; X fft(x, NFFT); P abs(X(1:NFFT/21)).^2; f_axis (0:NFFT/2)*fs/NFFT; % 低频带能量占比等 ... % 包络谱特征频率峰值 env abs(hilbert(x)); E fft(env, NFFT); envP abs(E(1:NFFT/21)).^2; % 提取BPFO、BPFI附近的谱峰值 ... end函数里最后返回的feat就是一个一维特征向量训练和预测都是一致的一条流水线这个习惯我觉得比调什么高级模型都重要保证了训练环境和实际运行环境的一致性。5.3 用App Designer搭一个能用的界面实验验证通过后纯命令行脚本并不适合现场人员使用我用Matlab App Designer做了个简单界面。界面主体就是一个坐标轴显示信号波形和频谱旁边放一个加载声音文件按钮、一个开始分析按钮输出区域显示诊断结果和特征值清单。App Designer的核心逻辑不复杂关键在于回调函数里把分析流程调用起来% “开始分析”按钮回调 function runAnalysis(app, ~) if isempty(app.currentData) return; end feat extract_features(app.currentData, app.fs); label predict(app.model, zscore(feat)); app.ResultLabel.Text [诊断结果: char(label)]; end现场实测下来这个工具配合一台笔记本和一个USB麦克风就可以沿线巡检边走边录、定期分析基本达到了拿着听音杆但比人耳更客观的效果。下一步还打算把识别结果按输送带位置记录到表格里方便对照现场逐段复查。6. 实测碰到的坑与排查思路6.1 环境噪声比故障声还大第一次在现场采集时麦克风放在落料口附近结果空压机、落料撞击、皮带托辊噪声混在一起正常与故障声音的频谱几乎分不开。补救办法是换点位把采集点移到远离落料口、靠近目标托辊的机架侧面并在麦克风外面套上防风海绵罩。软件上再配合带通滤波去掉步频和低频轰鸣特征提取出来的区分度马上就不一样了。6.2 样本不均衡导致模型偏科现场能录到的故障托辊样本确实不多正常样本一堆故障样本可能只有十几个。在样本不均衡的情况下训练出来的分类器特别喜欢把所有样本都判成正常。我试过两种补救办法效果都不错一是给少数类样本在SVM的代价矩阵中加大误分类权重让模型对少数类更敏感二是对故障样本做分段重采样把4秒窗口里有故障冲击的段落多切几段出来等效增加样本量。注意重采样互相重叠太多会造成过拟合段之间至少保留50%的新数据。6.3 滤波参数把故障成分滤没了有一次调滤波器为了抑制现场高频噪声把带通上限从10kHz降到了4kHz结果包络谱里外圈故障特征频率的谱线明显变弱。原因在于轴承冲击的窄脉冲频谱非常宽滤波上限降低后脉冲被展宽包络解调效果变差。后来我把上限设置在8-12kHz之间在下限500Hz不变的前提下既保留冲击边带又能有效压低高频段的气动噪声。6.4 误报漏报怎么权衡误报多会让现场人员对系统失去信任漏报又可能导致设备带病运行。工程上我用了一个简单策略不搞一刀切的硬分类连续三个分析窗口判决为故障才报警单窗口触发只记录提示。这样短时间内噪声尖峰带来的孤立误报会被过滤掉真正持续存在故障的托辊会在几秒内触发报警实际效果比单纯调分类阈值更顺手。个人经验上这个系统从原理验证到现场可用最花时间的不是算法本身而是对故障特征的物理理解。算清楚一个6205轴承的特征频率弄明白包络谱里每根谱线对应什么物理过程再回去看代码很多参数都不用试错就能定下来。最后分享一个小技巧做特征提取之前一定用耳朵先听一遍原始录音判断这段声音里到底有什么。如果人耳都能明显听到故障冲击声算法大概率能提取出来如果人耳都听不出来那就别指望单纯靠某个特征值就能无中生有。先用耳朵建立先验再用信号处理手段放大和量化这种先验这套组合拳比任何花哨的模型都管用。
阅读完成 · 觉得有帮助?