恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
带式输送机托辊声学故障诊断实战:从特征提取到模型部署
首页
资讯中心
/
带式输送机托辊声学故障诊断实战:从特征提取到模型部署
带式输送机托辊声学故障诊断实战:从特征提取到模型部署
发布时间:2026/10/19 5:28:27
带式输送机的托辊听起来是整套设备里最不起眼的角色——一根钢管套两个轴承固定在机架上转就完事。但做过产线运维的人都知道托辊故障占输送系统停机原因的比例相当高轴承磨损、油脂干涸、密封失效初期几乎听不见等发现时往往已经磨出凹槽甚至把整条皮带划出口子。我这些年一直在做设备状态监测相关的声学诊断器械类目标里最推荐入手的切入点不是振动而是声音。原因很直接托辊数量多、跨度大每个托辊都装振动传感器成本根本压不住声学采集是非接触的一只麦克风就能盯住一段距离内好几根托辊特别适合这种量大面广的场景。这篇文章把一套完整的托辊声学故障诊断Demo拆开讲从故障机理、现场采集布置、特征提取到模型训练和代码实现再到真实现场踩过的坑适合正在做智能运维、设备健康管理或者想用音频技术做工业检测的工程师参考。1. 托辊为什么会坏从轴承磨损失效到声音信号的因果关系1.1 托辊的结构与主要失效模式托辊的结构非常朴素无缝钢管作为辊体两端各装一套深沟球轴承外面有迷宫密封中间一根轴固定在输送机支架上。皮带压在辊面上带动辊体旋转。正因为结构简单很多人会低估它的故障率。实际失效模式主要集中在轴承上。深沟球轴承在粉尘大、湿度高的环境里工作最常见的故障链是密封进灰或者进水 → 润滑脂污染、变干 → 滚道和滚动体发生微观点蚀 → 点蚀扩展成剥落 → 轴承间隙变大、保持架松动 → 最后卡死或者辊面磨出平面。还有一种常见情况是托辊本身制造精度差辊体动不平衡导致轴承长期承受交变载荷提前疲劳。这些故障在初期阶段振动幅值很小温度变化也不明显但声音的变化其实已经出现了——这是声学诊断最核心的立足点。1.2 故障声音从哪里来冲击、调制与共振轴承故障在声学上的本质是周期性的冲击。滚动体碾过滚道上的剥落坑时会产生一个短促的冲击脉冲这个脉冲会同时激发两个东西一是轴承结构本身的高频共振二是周围空气的受迫振动也就是我们听到的声音。正常托辊转动时声音是平稳连续的类似低沉的嗡嗡声频谱集中在低频段。轴承早期磨损时脉冲会周期性出现声音变成咔哒、咔哒的节奏感高频分量明显增加润滑脂干涸时金属直接接触会产生高频嘶嘶声或者尖锐的啸叫等到托辊卡死辊面被皮带磨出平面就会出现周期性的咯咯声频率和皮带速度直接相关。这些特征频率可以粗略估算比如外圈故障频率BPFO、内圈故障频率BPFI都跟转速和滚动体数量有关。但在现场实际项目里托辊转速通常只有几百转每分钟故障特征频率本身落在很低的频段几十赫兹很难直接看到更容易捕捉的是它们激发的宽频共振成分——这也就是后面特征提取时要把注意力放在谱包络和高频段的原因。1.3 为什么托辊监测选声学而不是振动我在跟不少做设备管理的工程师聊的时候他们第一反应都是那不就是振动分析吗。振动分析确实是设备诊断的经典手段但放到托辊这个具体对象上有几个绕不开的现实问题。首先是成本。一条几百米长的输送机托辊可能有几百上千根每根装一个加速度计传感器加采集通道的费用是天文数字。其次是安装。托辊是旋转件振动传感器要装在轴承座上很多位置空间窄、粉尘重安装维护都很麻烦。第三是覆盖。声学麦克风是非接触安装的一个拾音点可以覆盖半径一两米内的好几根托辊先做区域粗筛发现异常再去精确定位这个逻辑最适合托辊这种设备。当然声学也有代价环境噪声混叠严重、声音传播路径复杂、无法像振动那样准确定位到具体轴承这些后面会专门讲。结论是托辊这种分布式、低价值密度的设备声学是性价比最高的选择但必须接受它的不确定性并在算法和部署层面做补偿。2. 采集方案设计麦克风怎么选、放哪、采样率设多少2.1 传感器选型别小看这个环节很多Demo项目在实验室里跑得挺好一到现场就失灵八成问题出在采集端。托辊声学诊断对麦克风的要求并不高但有几个坑必须避开。我建议优先选驻极体电容麦克风或者MEMS麦克风模块。驻极体便宜、频响范围通常在20Hz到20kHz覆盖轴承早期故障的高频成分完全够用MEMS麦克风一致性更好适合批量布点。灵敏度选择在-38dBV/Pa左右的型号即可现场声压级在70到110分贝之间这个灵敏度能保证足够的信噪比。接口上用USB声卡最省事选16bit/48kHz采样率的产品就够如果项目预算宽裕可以上24bit采集卡多通道需要同步采集时也要注意选同一时钟源。最容易翻车的一点千万不要选带自动增益控制AGC的麦克风。现场背景噪声变化大的时候AGC会把增益自动拉高结果就是背景噪声被放大故障信号被压缩后端算法再强也救不回来。所有实验都要用固定增益并把峰值控制在-6dBFS到-12dBFS之间留出余量防止削波。2.2 布置位置直接决定信噪比麦克风放哪里比选什么型号影响更大。我在现场总结出的经验是优先放在回程段也就是下皮带这一侧。上段皮带承载物料物料撞击溜槽、托辊的声音非常大会把故障信号完全淹没回程段皮带是空的噪声底低很多拾音条件要好得多。距离上麦克风离目标托辊0.3米到1米比较合适。太近了容易被皮带和托辊的局部气流干扰还容易磕碰太远了声音衰减严重特征就不明显了。方向要朝向托辊的轴承端盖一侧也就是辊子两端因为轴承是主要声源。固定方式上用磁吸支架或者扎带固定是常见的但要注意麦克风外壳不能跟金属支架直接接触否则皮带架的固体振动会通过外壳传进麦克风混入大量结构噪声。我一般会垫一层橡胶垫或者用海绵隔离。一个拾音点覆盖3到5根托辊是比较合理的。覆盖得越多单点成本越低但一旦报警需要人工去排除哪一根出了问题覆盖太少又失去声学的成本优势。这个参数要跟用户现场一起商量着定。2.3 采样参数与基线数据采集采样率建议直接上48kHz。有人觉得轴承故障特征频率低16kHz就够但实际上早期故障信息主要在高频共振段采样率太低会把这一部分切掉。48kHz采集分析的时候可以全频带用也可以根据需要滤波灵活性大得多。量化位数16bit够用每小时单声道WAV大概是330MB现场如果长期保存原始音频存储压力不小后面会讲怎么用特征来压缩存储。现场数据采集还有一个容易被忽略的步骤基线采集。在皮带空载、所有托辊都是正常状态的时候录一段不少于十分钟的声音作为这条皮带的标准背景。后面所有的现场特征都先减去这个基线再做判断相当于给每个测点做了一次环境校准。这个方法是我在实际项目里试过最有效的抗干扰手段比什么高级滤波都管用。3. 特征工程把嘈杂的机器声变成能分类的数字特征3.1 预处理分帧、加窗、预加重拿到原始音频之后第一步不是直接算特征而是做预处理。工业现场的声音有一个普遍特点低频能量远大于高频能量而轴承故障的有用信息恰恰在高频段。所以要做预加重用一个简单的高通滤波器y[n] x[n] - 0.97 * x[n-1]把高频分量抬起来让频谱变得平坦后续特征提取会更有效。然后是分帧和加窗。音频信号是非平稳的不能整段直接做傅里叶变换要切成短帧一般认为10到50毫秒内信号近似平稳。我这里用的是帧长50毫秒48kHz采样下就是2400个点帧移25毫秒加汉明窗减少频谱泄漏。每帧都能算出一组特征最后再对整个片段做统计聚合把一段两秒钟的音频压缩成一个几十维的向量。import numpy as np import librosa def frame_audio(y, sr48000, frame_ms50, hop_ms25): frame_len int(sr * frame_ms / 1000) hop_len int(sr * hop_ms / 1000) frames librosa.util.frame(y, frame_lengthframe_len, hop_lengthhop_len) return frames.T3.2 时域和频域基础特征峭度、峰值因子、谱质心特征的选择是有讲究的不是为了凑数。我在这套系统里用的特征分三组每组都有明确的物理含义。时域特征里最有用的是均方根值RMS和峭度Kurtosis。RMS代表声音能量反映了托辊运行的整体状态峭度对冲击信号特别敏感轴承早期故障产生的周期性脉冲会显著拉高峭度值正常运行的托辊峭度一般稳定在3附近故障时会明显偏离。峰值因子峰值除以RMS也有类似作用。频域特征方面我用谱质心和谱滚降。谱质心是频谱的重心可以理解为声音的明亮程度故障托辊高频成分增多谱质心会往高频移动谱滚降表示高频能量所占比例这个指标对区分正常摩擦和轴承故障挺管用。还有一个零交叉率用来感知噪声底的变化。这些特征计算在librosa里都有现成函数不需要自己手写STFT。rms librosa.feature.rms(yy, frame_lengthframe_len, hop_lengthhop_len)[0] zcr librosa.feature.zero_crossing_rate(y, frame_lengthframe_len, hop_lengthhop_len)[0] cent librosa.feature.spectral_centroid(yy, srsr, n_fft2048, hop_lengthhop_len)[0] rolloff librosa.feature.spectral_rolloff(yy, srsr, n_fft2048, hop_lengthhop_len)[0] kurt np.mean((frames - frames.mean(axis1, keepdimsTrue)) ** 4, axis1) / (frames.std(axis1) ** 4 1e-8)3.3 MFCC为什么音频诊断绕不开它MFCC梅尔频率倒谱系数是语音识别里的经典特征放到工业声学诊断里同样好用。它的原理是模拟人耳对频率的非线性感知低频段分辨率高高频段分辨率低因此把线性频率映射到梅尔刻度再用一组三角滤波器对频谱做加权取对数后做离散余弦变换保留前十几个系数。对托辊故障来说MFCC捕捉的是声音谱包络的形状变化。轴承故障产生的宽频共振会改变Mel频谱的整体包络这种改变在倒谱域里会集中到某几个系数上非常利于分类器识别。同时DCT有去相关作用13维系数就包含了大部分判别信息维度低模型不容易过拟合。我一般还会把一阶差分delta和二阶差分delta-delta也算进去因为故障信号的时序变化也是重要线索但为了控制特征维度基本只用均值加标准差。这里也提一句MFCC对环境噪声比较敏感现场如果背景噪声复杂可以把log-Mel谱图直接作为特征或者跟MFCC做对比实验。实际项目里我常用的是MFCC 谱质心 峭度的混合特征效果比单用MFCC稳定。3.4 完整特征提取函数把上面的思路整合成一个函数输入一个WAV文件路径输出一个一维特征向量。注意要对信号做归一化避免不同录音音量导致特征偏移。特征里MFCC取13个系数每个系数的均值和标准差就是26维再加上RMS、峭度、谱质心、谱滚降、零交叉率的均值和标准差总共36维够用且不臃肿。import numpy as np import soundfile as sf import librosa def extract_features(file_path, sr48000, n_mfcc13): y, sr_read sf.read(file_path) if sr_read ! sr: y librosa.resample(y, orig_srsr_read, target_srsr) # 归一化防止音量差异 y y / (np.max(np.abs(y)) 1e-8) frame_ms, hop_ms 50, 25 frame_len int(sr * frame_ms / 1000) hop_len int(sr * hop_ms / 1000) # MFCC mfcc librosa.feature.mfcc(yy, srsr, n_mfccn_mfcc, n_fft2048, hop_lengthhop_len, win_lengthframe_len) # 时域与频域特征 rms librosa.feature.rms(yy, frame_lengthframe_len, hop_lengthhop_len)[0] zcr librosa.feature.zero_crossing_rate(y, hop_lengthhop_len)[0] cent librosa.feature.spectral_centroid(yy, srsr, n_fft2048, hop_lengthhop_len)[0] rolloff librosa.feature.spectral_rolloff(yy, srsr, n_fft2048, hop_lengthhop_len)[0] frames librosa.util.frame(y, frame_lengthframe_len, hop_lengthhop_len).T kurt np.mean((frames - frames.mean(axis1, keepdimsTrue)) ** 4, axis1) / \ (frames.std(axis1) ** 4 1e-8) feat [] for m in mfcc: feat.append(np.mean(m)) feat.append(np.std(m)) for arr in [rms, zcr, cent, rolloff, kurt]: feat.append(np.mean(arr)) feat.append(np.std(arr)) return np.array(feat)标准化这一步也在这里提一下。因为不同特征的量纲差别很大RMS可能是几百分之一MFCC可能是几十直接丢给分类器会让大数值的特征主导训练。我用StandardScaler按训练集计算均值和标准差再用同样的参数去变换测试集和现场数据。注意千万不能拿全部数据一起fit那会造成数据泄漏测试结果虚高。4. 模型训练与代码实现完整跑通分类管线4.1 数据集构建标注比模型更耗精力模型部分其实是最标准化的环节真正决定上限的是数据集的构建。我建议这样组织数据正常类别用新托辊或者刚做完润滑保养的托辊采集最好覆盖空载和带载两种工况故障类别可以用现场确认故障并拆换下来的托辊装到专门的测试工位录制或者直接在故障托辊还没有拆的时候现场录制再事后跟踪确认。每段音频2秒左右每个类别至少要200段以上。数据要尽量覆盖不同托辊个体不要光拿一根托辊反复录否则模型学到的只是那一根托辊的个体特性换一根就不灵了。标注的时候一定要做听音复核我吃过不少亏有时候现场标记为故障的托辊拆下来看其实只是润滑不足声音特征跟真正的轴承剥落差别很大。如果混着标模型会学出一个模糊的边界后面怎么调都别扭。还有类别不平衡的问题。在线监测场景里正常样本占绝大多数故障样本可能不到百分之一。训练时我会把数据集平衡一下比如对正常样本做欠采样或者对故障样本做简单的数据增强加噪、变调。但测试和评估必须用真实分布的数据否则指标会失真。4.2 训练代码三种模型对比特征提取有了数据集有了训练就是几行代码的事。我习惯同时训练随机森林、SVM和MLP三个模型做对比再根据现场情况选。import os import glob import numpy as np import joblib from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.svm import SVC from sklearn.neural_network import MLPClassifier from sklearn.metrics import classification_report, confusion_matrix normal_files glob.glob(os.path.join(data, normal, *.wav)) fault_files glob.glob(os.path.join(data, fault, *.wav)) X, y [], [] for path in normal_files: X.append(extract_features(path)) y.append(normal) for path in fault_files: X.append(extract_features(path)) y.append(fault) X np.array(X) y np.array(y) # 标准化注意只用训练集拟合scaler X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy) scaler StandardScaler().fit(X_train) X_train_s scaler.transform(X_train) X_test_s scaler.transform(X_test) models { RandomForest: RandomForestClassifier( n_estimators200, max_depth12, random_state42), SVM: SVC(kernelrbf, C10, gammascale, probabilityTrue), MLP: MLPClassifier( hidden_layer_sizes(64, 32), max_iter500, random_state42), } for name, clf in models.items(): clf.fit(X_train_s, y_train) y_pred clf.predict(X_test_s) print(f {name} ) print(classification_report(y_test, y_pred, target_names[normal, fault])) print(confusion_matrix(y_test, y_pred)) # 保存最优模型 best models[RandomForest] joblib.dump(best, idler_clf.joblib) joblib.dump(scaler, idler_scaler.joblib)这个Demo里三个模型在隔离测试集上的准确率都能到95%以上但这并不代表现场能用后面会讲现场和实验室的差距。4.3 模型选型为什么现场我优先随机森林三种模型各有特点。随机森林对中小规模数据不容易过拟合训练快还能输出特征重要性方便我们回过头检查哪组特征在起作用这对算法落地后的调试非常重要。SVM在小样本上表现通常很好决策边界干净但概率输出需要额外校准多分类或者特征维度高的时候调参麻烦。MLP灵活性强可以融合更多输入比如温度、皮带速度但需要更多数据和更细的调参训练时间也长。在我做的项目中托辊声学诊断基本是二分类问题特征维度三四十维样本量几千量级随机森林是性价比最高的选择。它的决策过程对特征缩放不敏感意味着即使标准化做得不完美结果也相对稳定适合现场工程化。4.4 评估指标别只看准确率在线监测场景里正常样本占绝大多数如果直接算准确率一个永远预测正常的模型也能拿到很高的分没有任何意义。必须分开看对正常类的误报率precision的反面对故障类的漏报率recall的反面。在托辊监测这个场景漏报的代价远大于误报——漏掉一个卡死的托辊可能划伤整条皮带停机维修成本很高而误报只是让人去看一眼成本低得多。所以我现场调优的目标是在漏报率控制在1%以内的前提下尽量压低误报率。这个偏好要体现在模型阈值上而不是简单地选一个让准确率最高的点。5. 现场实测中的误报与漏报最容易翻车的几个环节5.1 工况变化负载、转速带来的特征漂移实验室或者测试工位上的数据都是干净、稳态的现场完全不是这样。同一根托辊皮带空载和满载时声音差异很大满载时物料噪声和皮带张紧声都会增大特征的均值明显偏移。如果模型只在空载工况上训练过满载时误报率会突然飙升。我的对策是把工况信息纳入模型要么按工况分别建模空载模型、带载模型要么把皮带速度、电机电流这样的工况信号作为额外特征。最简单实用的做法是先做工况归一化每个测点都用自己空载状态的基线特征做差分这样不同负载带来的公共变化会被抵消掉故障特有的变化保留下来。转速的问题也要注意。托辊故障特征频率跟转速成正比如果现场皮带速度波动大同一个故障在不同的转速下特征会不一样。好在工业皮带输送机的转速相对恒定实际影响有限但如果要做通用系统就需要考虑阶比分析或者速度归一化。5.2 环境噪声物料冲击和皮带接头的干扰现场最大的噪声源不是电机而是物料。物料从高处落到皮带上、经过溜槽时互相碰撞产生的冲击声在特征上跟轴承故障的冲击非常像——峭度被拉高高频成分增加。皮带接头硫化接头每转一圈也会产生一次周期性的冲击表现成准周期信号进一步混淆视听。处理这类问题我总结了三个层的措施按推荐顺序排列。第一物理层麦克风尽量远离落料点拾音点对着回程段布置第二信号层对信号做带通滤波比如只保留500Hz到8kHz频段把低频的物料冲击能量压掉因为轴承故障共振主要集中在高频段第三决策层用多个时间窗口投票单帧判决不可信连续3到5个窗口也就是几秒都持续判故障才拉高告警置信度。三层叠加下来误报率会显著下降。5.3 不同型号托辊的泛化问题这是一个特别容易被忽视的坑。不同直径、不同厂家、不同轴承型号的托辊正常状态下的声音差异可能比正常vs故障的差异还要大。如果用一批托辊的数据训练模型直接拿去识别另一批托辊准确率会跌得很惨。解决思路分两种。如果现场托辊型号有限可以按型号分组训练每个型号一个模型这个方案可控性最好。如果型号很杂、样本不够就要转向异常检测思路对每一根托辊用投运后头几天的正常数据建立它自己的baseline模型只输出偏离baseline的程度而不是硬分类成正常或故障。这种做法在工程上叫个体化阈值本质上承认了没有两个托辊是完全一样的。5.4 告警逻辑软告警与硬告警在线监测不是模型输出一个类别那么简单告警逻辑必须仔细设计。我审过的很多项目误报率高不是因为模型差而是因为告警条件太简单——模型概率一超过阈值就报警。我常用的设计是两级告警。软告警故障概率连续3个窗口约3到6秒超过0.7系统推送疑似故障请巡检硬告警故障概率连续1分钟超过0.8或者软告警出现次数在10分钟内达到5次以上才触发停机检查和更换。这个设计利用了轴承故障是慢变过程的特点短暂的环境噪声冲击即使导致个别窗口误判也很难持续触发硬告警。实测下来这套机制能把误报率从简单阈值的20%左右压到3%以内漏报率保持在1%以下代价就是告警响应有一定延迟——但对轴承这种故障演化周期以天计的设备几分钟延迟完全无所谓。6. 从Demo到在线监测边缘部署与持续迭代的落地路线6.1 实时处理流程环形缓冲区与滑动窗口Demo阶段是离线分析一批WAV文件到了线上就要改成流式处理。我的做法是边缘设备持续采集音频维护一个环形缓冲区保存最近2秒的数据。每个处理周期比如1秒一次从缓冲区取出最新的2秒数据计算特征做标准化输入模型得到故障概率。这里要注意缓冲区的重叠——每次取最后2秒其实有1秒和上一帧重叠没关系这相当于滑动窗口平滑反而对稳定输出有帮助。import collections import numpy as np class RingBuffer: def __init__(self, maxlen): self.buf collections.deque(maxlenmaxlen) def push(self, chunk): self.buf.extend(chunk) def get_last(self, n): data list(self.buf)[-n:] return np.array(data) buffer RingBuffer(maxlen48000 * 3) # 3秒容量 # 每次从采集接口取到chunk后: # buffer.push(chunk) # block buffer.get_last(48000 * 2) # feat extract_features_from_audio(block) # 复用第3节的逻辑 # feat_s scaler.transform([feat]) # prob clf.predict_proba(feat_s)[0][1]实时性要求其实不苛刻。轴承故障是缓慢演化过程处理延迟1到2秒完全够用所以边缘设备不需要很高的算力。6.2 边缘硬件与多通道采集边缘盒子用普通工控机就够了i3级别的处理器跑随机森林推理单通道不到10毫秒完全不是瓶颈。要是想更便宜用嵌入式开发板也能跑但要把模型量化成整型权重随机森林转成C语言数组也行。多通道场景要注意同步问题——多个麦克风如果接在不同的USB声卡上时钟不同步会导致通道间时间漂移影响后续阵列定位之类的功能。要么选多通道同步采集卡要么接受各通道独立分析。现场部署还有一个细节边缘设备在工控柜里可能和变频器、开关电源放在一起这些设备是强电磁干扰源USB声卡和麦克风线缆要做好屏蔽线尽量短。音频信号线跟动力线走同一个线槽的话底噪会明显抬高。6.3 数据回流与模型持续迭代模型上线不是终点。现场工况会变皮带速度调了、物料换了、季节变了冬天轴承脂变稠模型性能会缓慢退化。我的做法是在边缘设备上设置数据回流策略平时只保存特征向量和模型输出不保存原始音频把存储占用降到很低一旦触发软告警自动保存告警前10秒和告警后30秒的原始音频供人工复核。每个月或者每季度把回流数据和现场检修记录合并人工确认标签后加入训练集重新训练。这个闭环做起来不难但持续迭代的价值很大——现场数据永远比实验室数据丰富模型的domain shift问题只能靠持续学习来缓解。6.4 成本估算与扩展方向最后说说成本。一个测点包括麦克风模块、USB声卡、防护外壳和边缘盒子的分摊费用整体在千元级相比给每个托辊装振动传感器省出一个量级。一条几百米的皮带部署十个测点就能覆盖主要区域试点成本可控。再往远说一步声学阵列多麦克风同步采集可以做故障定位通过信号到达时间差估计是哪一根托辊在响这对长距离皮带的自动巡检很有价值。另外跟皮带运行速度、电流、温度这些数据打通之后可以做更综合的健康评分配合维修工单系统自动派单换辊那就是完整的预测性维护闭环了。我在实际项目里最常见的失败模式不是模型不够先进而是采集端没做好、特征没选对、告警逻辑太简单。托辊声学诊断本质上是个信号处理工程问题深度学习只是最后那一公里。如果你正准备做类似项目我的建议是先别急着上模型花两周时间把拾音位置和基线数据做扎实这个功夫值回票价。最后再分享一个实用技巧现场基线可以录两段一段在皮带空载时录一段在满载时录特征提取时按当前工况减去对应的基线分类效果比五花八门的降噪算法都要明显。这套思路不只适用于托辊滚筒、风机、泵这类旋转设备都可以照着这个框架搭一遍试试。