
在带式输送机的运维场景里托辊是数量最多、也最容易被忽视的部件。一条几百米的输送线托辊往往上千个分布在承载段和回程段位置低、空间小靠人工逐个听音、摸温去巡检劳动强度大且漏检率高。基于声音信号的托辊故障检测系统正好用非接触的方式绕开了振动测点安装难、数量多的痛点这几年在煤矿、港口、电厂皮带机巡检和声学成像检测里越来越常见。这篇文章会把整条技术路线讲透包括为什么用声音、信号怎么处理、特征怎么选以及可直接运行的Matlab代码框架。适合两类人一类是做设备点检和状态维护的工程师另一类是刚开始接触声学故障诊断、想找完整代码路线图的学生或开发者。1. 项目背景与整体思路拆解1.1 带式输送机托辊故障为什么难发现托辊从外观看就是一个圆柱筒内部结构却不简单筒体、轴、轴承、密封座、防水迷宫任何一环出问题初期都不容易发现。轴承疲劳剥落会产生周期性的微小冲击密封失效会把沙石灰尘带进轴承腔润滑脂干涸之后滚动体开始干磨托辊卡死则更危险筒皮与输送带持续摩擦温度一路上升严重时能引燃输送带和积煤。这类事故在行业里并不少见说到底就是托辊数量太多、巡检周期太长等发现的时候已经从“微故障”发展成“事故级故障”了。还有一个客观难点是托辊转速普遍很低。以一条带速2m/s、托辊直径133mm的输送机为例托辊转速大约只有4.8Hz远低于普通电机轴承。低速滚动轴承的早期缺陷用振动加速度计测量信号幅度非常小很容易被输送带拍打和电机噪声淹没。而声音信号受低频振动干扰的影响相对小麦克风可以近距离靠近筒皮捕捉轴承缺陷激发的高频声学共振往往比振动信号更早察觉异常。1.2 为什么最终选声音而不是振动或温度技术选型时我认真对比过三种方案各有利弊但综合下来声音方案最适合托辊这种“海量测点”场景。振动检测的精度确实高但每个托辊都要安装加速度计上千个托辊意味着上千个测点布线和维护成本基本不可行。托辊多数卡在输送带下方传感器安装空间也很受限换辊时还容易碰坏传感器现场根本不接受这种方案。温度检测用热电阻或红外测温都有滞后性。卡死托辊初期温升并不明显输送带本身会带走大量热量等温度报警时往往已经烧灼发红有效预警时间太短。声音检测是非接触方式安装灵活一个麦克风可以覆盖一组托辊用声学成像设备甚至能直接“看”到声音来源。缺点是现场环境信噪比差但这个短板可以用滤波、特征提取和分类模型补回来。最后方案定在“采集端用工业拾音器分析端用Matlab离线建模、在线判别”的组合上。1.3 系统的完整检测流程与架构整个系统分四段声音采集、信号预处理、特征提取与降维、故障判别与输出。环节输入输出关键工具声音采集托辊辐射声波数字音频序列工业拾音器、采集卡、录音笔信号预处理原始音频序列干净信号、分帧数据带通滤波、小波去噪、加窗分帧特征提取分帧数据特征向量峭度、峰值因子、FFT、包络谱、MFCC故障判别特征向量正常/异常/故障类型阈值规则、SVM分类器采集端负责把声波变成高保真数字信号预处理负责滤除环境干扰特征提取从时域、频域、倒谱、小波能量四个角度刻画声音最后用规则阈值或SVM模型输出结论按托辊编号形成报表也可以联动现场报警灯。这四段里面最核心的其实不是某个算法而是“特征能不能稳定区分正常和异常”。后面几章我会把每一段的参数选择理由和代码细节都摊开讲。2. 核心信号处理与特征提取2.1 采样率与带通滤波设计托辊轴承缺陷的特征频率其实很低几赫兹到几十赫兹但缺陷激发的共振频率通常在几千赫兹。为了保留高频共振信息采样率取48kHz比较稳妥既能覆盖普通拾音器的频响范围计算量也适中。如果现场条件受限用44.1kHz也可以但低于40kHz会损失一部分高频成分离线分析不建议再降。滤波是预处理里最基础也最关键的一步。我在项目里用带通[200, 10000]Hz高通200Hz把电机工频干扰、减速机低频冲击、现场脚步声等滤掉低通10kHz保留轴承共振的主要能量带减少高频气动噪声和电磁干扰。滤波器选用四阶Butterworth带通纹波小相位失真在包络分析里影响也不大。实际调试中遇到过一个问题高通截止频率设得太低现场低频噪声根本压不住设得太高又会把有用的故障冲击削掉。200Hz这个值我是在多条输送线上试出来的平衡点如果你的现场低频噪声特别重可以先看频谱再微调到300Hz左右。2.2 时域特征峭度、峰值因子与短时能量故障托辊的声学共性之一是强冲击性。时域特征虽然简单却是判别冲击类故障最直接的工具。RMS反映信号总体能量水平但单独使用价值有限因为增益和距离都会影响绝对值。峰值因子是峰值与RMS的比值正常声音波形接近高斯分布峰值因子一般在3到6出现疲劳剥落、卡阻刮擦时超大尖峰让峰值因子跳到10以上。峭度是四阶统计量公式为K1/N乘上所有样本偏离均值四次方之和再除以标准差的四次方。正常信号峭度接近3故障信号因为多出周期性冲击成分峭度往往明显大于3这个特征对孤立冲击非常敏感。我在测试中还发现卡死托辊的摩擦声峭度不一定高但RMS和高频能量会持续偏高所以要配着其他特征一起用。短时能量则用于观察能量随时间的变化剥落类故障是周期性能量脉冲卡死是平稳但高频的能量增强。具体实现时我会把5秒样本切成若干帧统计每帧特征的均值和标准差再合成一段样本的整体特征。直接对整段信号算峭度会丢掉时域变化信息分类效果差不少。2.3 频域核心FFT谱、包络谱与特征频率直接对原始信号做FFT能看到基频和若干谐波但对“周期性冲击调制”的直观程度不够。滚动轴承故障的声学信号本质是高频共振被低频故障频率调制这时候需要包络解调。包络谱实现分三步对信号做Hilbert变换构造解析信号取解析信号的模得到包络对包络再做FFT得到包络谱。包络谱上会突出故障特征频率及其倍频比直接看原始频谱清晰得多。如果知道轴承参数还能用经典公式算出理论特征频率对照验证外圈故障频率BPFO (N/2)×fr×(1-d/D×cosβ)内圈故障频率BPFI (N/2)×fr×(1d/D×cosβ)滚动体故障频率BSF (D/(2d))×fr×(1-(d/D×cosβ)^2)其中N是滚动体数量d是滚动体直径D是节圆直径β是接触角。现场往往拿不到准确轴承参数所以更实用的做法是观察包络谱里是否存在稳定的低频峰簇以及峰簇间隔是否有规律这比硬套理论值可靠。2.4 MFCC与小波包能量对抗现场噪声的关键带式输送机现场的噪声不只是白噪声还有带速变化引起的空气噪声、落料声、雷雨环境声。只靠时域和FFT特征分类器容易把噪声也当成有效特征学进去。梅尔频率倒谱系数MFCC是语音识别常用的特征引入工业声音分类也很有效。MFCC按人耳非线性频率感知划分滤波器组能够压缩与故障无关的音乐性信息突出声音的纹理变化。我一般取前12到13阶系数再高的阶数多半是噪声细节反而干扰分类。Matlab里Audio Toolbox有现成的mfcc函数或者按“分帧、FFT、梅尔滤波、取对数、DCT”的流程自己实现。小波包能量是另一个重要补充。用db4小波对信号做三层分解会得到8个子带的能量占比相比固定频段的FFT小波包能更精细地捕捉瞬态特征。把MFCC、时域特征、包络谱峰值、小波包能量拼成一个特征向量分类效果会明显改善这一点在我的测试里非常明显。3. Matlab代码实现与关键环节拆解3.1 声音采集采样率与窗口时长的确定先写采集程序。MATLAB里用audiorecorder采集简单直接代码量少适合原型验证。%% 声音采集 Fs 48000; % 采样率48kHz nBits 16; % 位深16bit nCh 1; % 单声道 recObj audiorecorder(Fs, nBits, nCh); disp(开始采集请保持环境稳定 5 秒); recordblocking(recObj, 5); % 阻塞式采集5秒 x getaudiodata(recObj); % 获取采集数据 %% 保存文件 audiowrite(normal_001.wav, x, Fs); disp(保存完成);采集窗口选5秒是因为托辊转速一般在1到7Hz5秒可以覆盖多个完整旋转周期时域统计特征会更稳定。如果输送带速度很低比如低于1m/s建议把采样时长加长到10秒以上。命名规范里至少要包含托辊编号、故障类型代号和采集日期比如“normal_roll035_date.wav”这样的格式后面整理数据集时能省很多力气。3.2 预处理代码滤波、去噪与分帧回到原始信号x预处理分两步先带通滤波再做小波去噪。%% 带通滤波 f_low 200; % 高通截止 f_high 10000; % 低通截止 [b, a] butter(4, [f_low, f_high] / (Fs / 2), bandpass); xf filter(b, a, x); %% 小波软阈值去噪 xc wdenoise(xf, 3, Wavelet, sym8, ... DenoisingMethod, SURE, ... ThresholdRule, Soft);wdenoise是较新版本MATLAB的函数旧版本可以用wden替代。小波去噪的目的是压制随机噪声而保留冲击成分但去噪强度不能太大否则故障冲击的幅值会被削平。实际调试中建议把去噪前后信号画在同一张图上对比确保冲击没有明显变形。分帧参数我固定为帧长4096点、帧移2048点加Hann窗。5秒数据会产生大约117帧每帧提取一组特征最后统计均值和方差。这样既能保留时变信息又能减少单帧异常波动。%% 分帧参数 frameLen 4096; hop 2048; nFrames floor((length(xc) - frameLen) / hop) 1; win hann(frameLen); frames zeros(nFrames, frameLen); for k 1:nFrames idx (k-1)*hop 1 : (k-1)*hop frameLen; frames(k, :) xc(idx) .* win; end3.3 特征提取代码与包络谱分析下面这段代码计算每个样本的核心特征RMS、峰值因子、峭度、偏度以及包络谱主峰位置。%% 特征提取函数 function feat extractFeatures(xc, Fs) rms_val rms(xc); peak_val max(abs(xc)); crest peak_val / rms_val; % 峰值因子 kurt kurtosis(xc); % 峭度 skew skewness(xc); % 偏度 %% 包络谱 x_h hilbert(xc); % 解析信号 env abs(x_h); % 包络 L length(env); f_axis (0:L/2-1) * Fs / L; Y abs(fft(env)); halfY Y(1:floor(L/2)); [~, idx] max(halfY); % 主峰位置 envPeakFreq f_axis(idx); % 包络主峰频率 %% 高频能量占比2000Hz freqs (0:L/2-1) * Fs / L; mask freqs 2000 freqs 10000; highEngRatio sum(halfY(mask)) / (sum(halfY) eps); feat [rms_val, crest, kurt, skew, envPeakFreq, highEngRatio]; end包络谱主峰频率是个很有用的数字。正常托辊包络谱没有突出的低频峰簇主峰位置不稳定故障托辊的包络谱会出现稳定的峰簇主峰位置往往集中在某个低频带。配合高频能量占比可以进一步区分“冲击型故障”和“摩擦型故障”。3.4 故障判别阈值规则与SVM分类最简单的判别方式是规则阈值。我用历史正常样本的特征分布做区间估计比如正常托辊峰值因子上限设为8峭度上限设为6超过就判异常。阈值规则适合快速验证但不同输送线、不同带速的噪声底数差异很大现场用起来需要频繁调整。更可靠的方案是训练SVM分类器。我把每段信号的特征向量按行拼成特征矩阵X标签Y分为四类正常、轴承剥落、卡死、筒皮磨损。%% 特征矩阵与标签 % X: NxM 矩阵N为样本数M为特征数 % Y: Nx1 类别标签 rng(42); cvp cvpartition(Y, Holdout, 0.3); % 留出30%做测试 trIdx training(cvp); teIdx test(cvp); tpl templateSVM(KernelFunction, rbf, KernelScale, auto); mdl fitcecoc(X(trIdx, :), Y(trIdx), Learners, tpl); % 多分类SVM Ypred predict(mdl, X(teIdx, :)); acc sum(Ypred Y(teIdx)) / numel(Y(teIdx)); disp([测试准确率: , num2str(acc)]); %% 混淆矩阵可视化 figure; confusionchart(Y(teIdx), Ypred);fitcecoc把二分类SVM扩展成多分类用一对多的策略实现四类区分。训练前一定要对特征做标准化否则量纲大的特征会主导距离计算。实际测试中MFCC和小波能量加入后准确率从82%左右升到了94%以上所以特征选择的收益远比调参大。3.5 可视化与结果输出调试时我一共画四张图原始时域波形、滤波后时域波形、FFT幅值谱、包络谱。一张图里用tiledlayout平铺看异常时对照着观察很快能判断是哪类故障。%% 可视化对比 figure; tiledlayout(4, 1); nexttile; plot(x); title(原始声音信号); xlabel(采样点); ylabel(幅值); nexttile; plot(xc); title(滤波小波去噪后信号); xlabel(采样点); ylabel(幅值); nexttile; freqAxis (0:length(xc)/2-1) * Fs / length(xc); Xfft abs(fft(xc)); plot(freqAxis, Xfft(1:length(freqAxis))); title(FFT幅值谱); xlim([0 10000]); xlabel(频率(Hz)); ylabel(幅值); nexttile; Yenv abs(fft(abs(hilbert(xc)))); lenEnv length(Yenv); envAxis (0:lenEnv/2-1) * Fs / lenEnv; plot(envAxis, Yenv(1:length(envAxis))); title(包络谱); xlim([0 500]); xlabel(频率(Hz)); ylabel(幅值);对包络谱观察低频区通常在200Hz以下。看到稳定的峰簇就可以怀疑轴承类故障如果高频能量占比异常高优先怀疑密封磨损或卡死摩擦。4. 现场实操要点与样本采集经验4.1 采集位置与干扰控制麦克风距离托辊筒皮0.2到0.5米比较合适。太近容易被筒皮风噪和机械撞击声淹没太远又会混入相邻托辊的声音定位意义就不强了。麦克风指向最好与筒皮切平面成45度左右的角度不要正对输送带面否则带面拍打声会成为绝对主导。现场风噪大的时候给拾音器加一个防风罩或者海绵套能明显降低低频湍流噪声。采集时人不要站在麦克风和托辊之间说话声和衣物摩擦声都会被录进去。我在项目中有一条硬规则每次采集都先在日志里记下环境噪声等级比如“安静车间”“大风天”“旁边有大车经过”后处理时方便按工况分组建模。4.2 样本标注与数据集建库声音故障检测的瓶颈从来不是算法而是样本质量。每个样本至少录5秒标注至少包含四要素托辊编号、故障类型、运行时带速、采集环境备注。故障类型标签分得越细后面的分类模型就越有用。我通常分为正常、轴承剥落、卡死、筒皮磨损、偏心五类必要时再加“未知异常”作为垃圾类避免模型把没见过的声音强行归到已知类里。数据集不平衡是常见的坑。现场正常运行时间远长于故障时间实际能采到的异常样本往往很少。如果正常样本500段、故障样本只有80段模型会倾向于把所有样本都判成正常准确率看起来很高但毫无价值。解决办法是少数类做重采样或者训练时给异常类更高的权重让模型“看得见”异常。4.3 硬件选型与常见的坑硬件不要用普通聊天麦克风频响和可靠性都不够。工业拾音器或者声学传感器优先最好防尘防水、工作温度范围宽毕竟输送线现场粉尘和温度变化都很大。增益设置要留至少20dB余量防止突发噪声导致削波。削波信号波形顶部是平的频谱会产生大量虚假谐波包络谱分析基本就废了。我在代码调试时习惯先看原始波形发现平顶立即降低增益重新采集。麦克风损坏时采集信号往往表现为全零、全直流或者高频底噪异常。写采集程序时可以加一个底噪检测函数每次采集前先录0.5秒环境底噪计算RMS低于正常范围就直接提示检查硬件能省很多现场排障时间。5. 常见问题与排查技巧实录5.1 典型问题速查表下面这张表是我在项目中踩过的坑整理出来的速查表按“现象、原因、解决办法”三列整理调试时可以直接对着查现象可能原因解决办法环境噪声彻底淹没故障特征高通截止太低、防风不足提高到300Hz、加防风、更近距离采集特征曲线不稳定、误报频繁负载或带速变化影响能量按带速工况分组建模特征标准化包络谱看不出稳定峰簇滤波过度或共振频率被滤掉放宽带通范围到15kHz改用小波包能量相似故障类型分不开特征维度不足、样本太少增加MFCC和小波能量扩充故障样本信号顶部平顶削波增益过大降低增益到峰值不超过满量程80%不同批次文件采样率不一致采集参数被改动统一重采样到48kHz再处理正常样本也被判成异常阈值过紧查看特征分布把阈值设到3倍标准差之外5.2 三次现场排查实战记录第一次是在某条长皮带上正常托辊样本的峰值因子普遍在8左右我把阈值设成10之后还是疯狂误报。后来把滤波完的波形拉出来一看发现是滚筒附近的气流啸叫带来的高频周期性尖峰高通从200Hz提到300Hz之后误报率降了下去。这个经历说明阈值设定不能只看平均值要结合现场频谱图一起判断。第二次是采集到了很明显的故障声音但包络谱主峰和理论计算的轴承特征频率对不上。排查后发现输送带在运行中有起伏托辊实际转速并不等于用带速除以周长的理论值转速波动让特征频率漂移。后来我不再执着于理论频率而是看包络谱中峰簇的间隔是否规律规律性比具体频率值更重要。第三次故障出在便携录音笔上。某批数据的底噪明显高于其他批次特征分布也整体偏移。查到最后发现是录音笔的自动增益功能开着背景噪声大时它自动拉高增益把幅值特征都破坏了。从那之后采集设备一律固定手动增益并把自动增益功能关闭这个细节非常容易被忽略但对分类可靠性影响极大。5.3 几点个人体会做这个项目最大的体会是声音故障检测的技术栈并不复杂难的是一以贯之的数据规范。每个样本的托辊编号、带速、故障状态、采集环境都要记录清楚否则再漂亮的SVM模型也只是在拟合噪声。算法迭代到后期多数时间都花在数据清洗和特征调试上真正写分类代码的时间反而很少。如果后续想继续扩展可以考虑两条路线一条是把训练好的模型转换到嵌入式设备上做边缘实时推理麦克风阵列加在线判别直接替代人工巡检另一条是用双麦克风或声学成像做声源定位先在长皮带区间里粗略锁定问题托辊再自动聚焦采集精细数据。基础做好了这两条路的想象空间都很大。最后再补一句第一次调试包络谱时如果觉得看不到峰簇别急着调参先关了滤波看看原始FFT里高频共振在不在共振都没采到后面再怎么算都是无源之水。