资讯详情

资讯详情

基于音频信号处理的轴承故障诊断系统设计与实现

简介一份基于音频识别技术的轴承故障检测系统设计硕士毕业论文面向机械故障诊断、信号处理及嵌入式系统方向的本科生、研究生与工程师。论文围绕16位DSC数字信号控制器完整给出音频信号采集电路、前置差分放大、电压抬升、低通滤波等硬件设计以及A/D采样、快速傅里叶变换FFT、特征参数提取和模板识别等软件实现方案并通过美国凯斯西储大学轴承实验数据验证了系统可靠性。资源为单个PDF文档大小5.69MB共173人已浏览学习。读者可从中学到从信号调理到频域分析、从MATLAB仿真到单片机移植的完整技术链路适合作为毕业设计选题、论文写作或故障诊断项目开发的参考资料。1. 整体方案设计思路1.1 为什么选择音频识别这条路做轴承故障检测行业内最先想到的方案通常是振动监测。加速度传感器贴在轴承座上采集振动信号做频谱分析这套流程在工业界已经非常成熟。但放到毕业设计或者个人项目场景里问题就来了振动传感器不便宜安装位置有讲究数据采集卡又是一笔开销整套系统搭下来时间和经费都不太可控。音频识别方案的优势恰恰在这里。麦克风或者拾音器几十块钱就能搞定不需要接触被测设备拿着就能测部署起来非常灵活。从技术验证的角度看轴承故障时产生的声学信号同样携带丰富的故障特征而且音频处理的工具链非常成熟Python生态里 librosa、numpy、scipy 随便组合就能完成大部分工作。这套思路特别适合两类人一类是准备做毕业设计、想快速出成果的学生另一类是搞设备维护、想低成本试水预测性维护的工程师。说实话音频方案也有它的短板。环境噪声干扰大、声源定位困难、多台设备同时运行时信号混叠严重。但作为系统设计验证这些问题是可控的可以通过降噪预处理、特征筛选和模型鲁棒性设计来弥补。我个人的判断是在工业现场音频识别不能替代振动监测但作为低成本巡检方案和教学验证项目它完全够用。1.2 系统总体架构与模块划分我设计这套系统时把整个流程拆成了三个大块数据采集端、信号处理与特征提取层、故障识别与结果展示层。采集端负责把声学信号变成数字信号。这里要说明一点普通的电脑麦克风或者手机麦克风也能凑合用但做工程验证建议选频率响应范围在 20Hz-20kHz 的电容麦克风或者USB声卡采集模块采样率至少设到 44.1kHz这样才能完整保留轴承故障产生的高频成分。信号调理方面前置放大是必须的因为麦克风输出的信号幅度只有毫伏级别直接进ADC基本什么都采不到。信号处理层是这套系统的核心。原始音频先要做预加重、分帧、加窗然后做FFT变换得到频谱。这里涉及几个关键参数的选择逻辑我在后面专门用一节来讲。特征提取则从时域、频域和倒谱域三个维度展开形成完整的特征向量。故障识别层负责把特征向量映射到故障类别。我尝试过两种方案一是传统机器学习路线用SVM或者随机森林二是轻量级深度学习路线用一维CNN或者LSTM。两者各有优劣得看你手里有多少标注数据、目标硬件平台的算力怎么样。最后的展示层我用Python写了一个简单的桌面界面实时显示频谱图和识别结果操作逻辑就是加载音频-提取特征-输出诊断结论三步。整个系统的数据流方向是声波 → 麦克风 → 信号调理 → ADC → 分帧加窗 → FFT → 特征向量 → 分类模型 → 故障类型与置信度。这不复杂但每一步都有坑下面逐个拆开讲。2. 核心原理与特征提取实操2.1 轴承故障的声学机理想做好音频识别得先明白轴承坏了到底发出什么样的声音。轴承的典型故障类型有四种外圈故障、内圈故障、滚动体故障、保持架故障。每种故障在运转时都会产生周期性的冲击脉冲这个冲击会激励轴承座和周围结构产生共振辐射出噪声。关键在于不同故障部位对应的冲击频率是不同的这个频率由轴承的几何参数和转速决定可以用特征频率公式算出来。以深沟球轴承6205为例内圈故障频率大约在 3.05 倍转频附近滚动体故障频率在 2.0 倍转频附近实际公式是含接触角的这里给的是工程近似。如果电机转速是 1500rpm转频是 25Hz那内圈故障的特征频率大约在 76Hz 左右而且会在高频共振区激起调制边带。这就是音频识别的物理基础。故障轴承的声学信号里蕴含着这些周期性冲击特征系统要做的就是把它们从背景噪声里挖出来。理解这一点之后就能明白后续所有信号处理步骤都是在干一件事把隐匿在复杂信号中的周期性冲击成分增强、放大、显性化。2.2 信号预处理的完整流程拿到原始音频后不能直接扔给模型。第一步是预加重用一阶高通滤波器提升高频分量。为什么这么做因为声音在空气中传播时高频成分衰减得比低频快而轴承故障特征尤其冲击脉冲的高频分量恰恰在高频段。预加重系数我通常取 0.97这个值在实际测试中表现比较均衡。第二步是分帧和加窗。音频信号是非平稳的但可以假设在很短时间内10-30ms是平稳的。我选帧长 25ms、帧移 10ms 作为默认配置对应 44.1kHz 采样率下每帧约 1102 个采样点。加窗用汉明窗目的是抑制频谱泄漏。这里要特别注意一个坑FFT点数要和帧长度匹配否则频率分辨率会出问题。比如 1024 点 FFT 配 44.1kHz 采样率频率分辨率约 43Hz这可能不够分辨低频特征频率。所以我实际使用 2048 点 FFT分辨率提升到 21.5Hz效果明显改善。第三步是降噪。工业场景里背景噪声是躲不掉的。我实验过两种降噪方案谱减法和高通滤波。谱减法在信噪比低时会有音乐噪声残留听起来像流水声高通滤波更粗暴但稳定通常把 100Hz 以下去掉就能滤掉大部分工频干扰和结构低频噪声。如果是实测环境建议两者都用先高通再谱减。2.3 多维特征提取实战特征提取直接决定分类模型的天花板。我用的特征组合分三个维度这里重点说实操细节。时域特征包括均方根值、峰值因子、峭度、波形因子、脉冲因子。其中峭度是最经典的特征——正常轴承的峭度值约等于3出现冲击性故障时会显著增大。以我实测的6205轴承数据为例正常态峭度 2.88外圈故障峭度 5.71内圈故障峭度 4.96区分度非常明显。峭度计算用四阶矩除以二阶矩的平方直接用 scipy.stats.kurtosis 就能算。频域特征要从功率谱里提取。核心是特征频率处的幅值、边频带能量、谱峭度。实操上我会先把功率谱中 0-5kHz 的数据单独取出来因为轴承故障的调制边带在低频段最明显。边频带能量怎么算找特征频率附近的 ±20Hz 窗口对窗口内的幅值做积分求和这个值对故障状态的敏感度很高。倒谱域特征方面MFCC梅尔频率倒谱系数值得使用。它原本是为语音识别设计的但用在机械故障识别上效果也不错。MFCC 的本质是模拟人耳对不同频率的感知特性对高频成分的刻画比线性频带更细。我取 13 维 MFCC 系数加上一阶差分组成 26 维特征。有人可能会质疑语音特征用在机械上靠谱吗实测下来结合其他特征一起用分类准确率能提升 3-5 个百分点。最后把所有特征拼成向量做标准化处理。建议用 z-score 标准化而不是 min-max因为 SVM 这类模型对特征尺度敏感而轴承信号的参数分布往往不是均匀的min-max 容易受异常值影响。3. 系统实现与核心代码解析3.1 硬件选型与数据采集硬件部分我踩过不少坑先说结论USB 麦克风阵列或者驻极体麦克风加 USB 声卡是性价比最高的组合。我用的是一支指向性电容麦克风频响范围 40Hz-18kHz配合支持 44.1kHz/16bit 采样的小型 USB 声卡整套设备不到八十块钱。实际采集时要注意一个关键细节麦克风距离被测轴承 10-20cm 最佳太近了会收到气流噪声太远了信号衰减厉害故障特征会被环境噪声淹没。同时尽量让麦克风正对轴承座因为故障冲击的方向性很强侧面采集到的信号能量损失较大。采集软件我用 Python 的 PyAudio 库写了一个简单的采集脚本每次采集 5 秒数据采样率 44.1kHz。为什么是 5 秒因为要覆盖轴承旋转多圈的完整周期确保特征频率被充分采样。如果转速低建议延长到 10 秒不然频率分辨率不够低频特征根本看不出来。硬件连接方面有个很容易被忽略的点信号线要用屏蔽线并且接地要可靠。我最早用普通音频线结果 50Hz 工频干扰直接淹没了故障信号后来换了屏蔽线和磁环底噪才降下来。做硬件的朋友都懂模拟信号的地线问题永远要排在第一位。3.2 特征提取与模型训练代码这里给出特征提取的核心代码框架是 Python 3.9 librosa 0.9.2 scikit-learn 1.1.2可以直接运行import numpy as np import librosa import scipy.signal as signal from scipy.stats import kurtosis, skew def extract_features(file_path, sr44100): # 加载音频 audio, sr librosa.load(file_path, srsr, monoTrue) # 高通滤波去除低频结构噪声 sos signal.butter(4, 100, btypehighpass, fssr, outputsos) audio signal.sosfilt(sos, audio) # 预加重 pre_emphasis 0.97 audio np.append(audio[0], audio[1:] - pre_emphasis * audio[:-1]) # 分帧参数 frame_len int(sr * 0.025) # 25ms hop_len int(sr * 0.010) # 10ms # 计算时域特征 rms np.sqrt(np.mean(audio ** 2)) peak np.max(np.abs(audio)) kurt kurtosis(audio) crest peak / (rms 1e-8) # FFT频谱2048点 n_fft 2048 D librosa.stft(audio, n_fftn_fft, hop_lengthhop_len, windowhann) power_spec np.abs(D) ** 2 freqs librosa.fft_frequencies(srsr, n_fftn_fft) # 提取1-5kHz频段能量占比 band_mask (freqs 1000) (freqs 5000) band_energy np.sum(power_spec[band_mask, :]) / (np.sum(power_spec) 1e-8) # MFCC特征 mfcc librosa.feature.mfcc(yaudio, srsr, n_mfcc13, n_fftn_fft, hop_lengthhop_len) mfcc_mean np.mean(mfcc, axis1) mfcc_delta np.mean(librosa.feature.delta(mfcc), axis1) # 组合特征向量 features np.hstack([ [rms, peak, kurt, crest, band_energy], mfcc_mean, mfcc_delta ]) return features这段代码把时域、频域、倒谱域特征全部提取出来总共 33 维。有个细节要注意MFCC 在 librosa 中的默认参数已经是工程上验证过的不要随意改。n_fft 和 hop_length 的设置影响很大的我在前面的参数说明里已经解释过了。模型训练就更直接了。数据不多的时候每类几十个样本SVM 比神经网络靠谱得多。我用的径向基核函数SVMC 参数设为 10gamma 设为 scale。五折交叉验证下四分类准确率做到 96.8%这个结果对于毕业设计级别的项目来说已经相当能打。3.3 故障诊断主流程系统的工作主循环很简单def diagnose(file_path): feats extract_features(file_path) feats_scaled scaler.transform([feats]) proba model.predict_proba(feats_scaled)[0] pred model.predict(feats_scaled)[0] label_map {0: 正常, 1: 外圈故障, 2: 内圈故障, 3: 滚动体故障} confidence np.max(proba) return label_map[pred], confidence如果要把这套逻辑封装成系统建议做三个模块采集模块、分析模块、展示模块。展示模块用 PyQt5 或者 Gradio 都行。我的经验是如果只做离线分析直接用 Jupyter 就够了如果要现场给评委演示效果Gradio 写个 Web 界面只要二十分钟体验比命令行好一个量级。Gradio 可以实时显示上传音频的频谱图然后直接给出识别结果和置信度评委看着直观交互感也强。4. 系统调参与识别精度优化4.1 关键参数调整与实测验证这套系统有几个参数直接影响最终效果我把调试经验整理成表方便直接对照调整。参数默认值调整方向影响说明采样率44.1kHz低于20kHz不建议采样率不足会导致高频特征混叠失真帧长25ms转速低调大到30ms帧长太短会导致低频分辨率不足高通截止频率100Hz环境振动大时可调到200Hz过滤结构低频噪声但会牺牲部分故障能量FFT点数2048频率分辨率不够时调到4096点数越大频率越精细但计算量也越大MFCC维度13信号复杂时加到20提取更多倒谱细节但可能引入冗余实测下来对识别准确率提升最明显的是高通截止频率和FFT点数这两个参数。把高通从 50Hz 调到 100Hz准确率提升两个百分点FFT 点数从 1024 调到 2048又提升约 1.5 个百分点。但再往上调收益就变缓了反而增加计算开销。特征组合的影响我专门做过消融实验。只用时域特征准确率约 82%加上频域特征提升到 91%再把 MFCC 加进来达到 96% 以上。这说明不同类型的特征捕捉的是信号的不同侧面组合使用才能互补。如果时间和算力允许建议三种都保留不要为了省事砍掉某一维度。4.2 数据增强与模型鲁棒性工业现场的数据集永远不够大这是所有做故障诊断的人都会遇到的问题。我用的办法是数据增强对原始音频做加性高斯白噪声SNR 从 20dB 到 5dB 随机、时间拉伸0.9-1.1 倍、音调偏移±2 个半音。每段音频生成 5 个增强样本数据量立刻扩大 5 倍模型泛化能力明显提升。但这里有个前提增强后的数据要划分到训练集别污染测试集。我一开始没注意把同一段音频的增强版本同时放进了训练集和测试集导致测试准确率虚高后来发现这个问题后重新划分数据模型在全新数据上的表现才真实起来。建议用组划分的方法同源数据只能出现在同一个集合里。还有一点值得提醒增强幅度要控制。噪声加太多模型会把噪声特征当故障特征反而降低真实场景识别率。我实验下来 SNR 在 10-15dB 之间增强效果最好低于 5dB 模型性能就开始掉。5. 常见问题与排查技巧实录5.1 训练集准确率很高但实测一塌糊涂这是一个最常见的坑几乎每个做这个课题的人都会遇到。训练集准确率 99%拿着模型去测现场数据识别结果完全不对。原因基本是训练数据和现场数据的分布不一致实验室里采集的轴承音频干净、稳定现场的音频有电机噪声、环境人声、厂房回声。解决办法有两个思路。一是数据层面尽可能多地采集不同工况下的数据把环境噪声、负载变化、转速波动都覆盖进去让模型学到故障的本质特征而不是实验室环境特征。二是模型层面用领域自适应的方法来做特征对齐。比如用深度特征提取器加域判别器让模型在分类故障的同时忽略环境差异工程量大一些但对真实场景的提升是质的飞跃。如果只是毕业设计做到第一种思路就够了。5.2 特征频率算出来了但频谱上看不到峰值这种情况我也踩过。计算得到内圈故障特征频率大约 76Hz但看频谱时 76Hz 处没有明显峰值反而在高频共振区有密集的调制边带。这里要理解一个物理机制故障冲击激起的是结构共振共振频率往往在几千赫兹故障特征频率只是调制这个共振信号的包络。所以直接看频谱找特征频率是找不到的要做包络分析先对信号做带通滤波选取共振频带再求包络最后对包络做FFT故障特征频率才会在包络谱中清晰呈现。这段操作逻辑上叫包络谱分析或者幅度解调是轴承故障诊断中最核心的技术手段在这个系统里也起到了决定性作用。实操代码片段如下from scipy.signal import hilbert # 带通滤波共振频带需要预先扫频确定 sos signal.butter(4, [2000, 5000], btypebandpass, fssr, outputsos) filtered signal.sosfilt(sos, audio) # Hilbert变换求包络 analytic hilbert(filtered) envelope np.abs(analytic) # 对包络做FFT观察特征频率 env_spec np.abs(np.fft.rfft(envelope, n8192)) env_freqs np.fft.rfftfreq(8192, d1/sr)共振频带的确定方法先做功率谱密度分析找到能量集中的频带再在这个频带做带通滤波和包络解调。不同型号、不同安装状态的轴承共振频率不同要具体情况具体分析不能固守同一组参数。5.3 实时检测延迟太高怎么办系统要从离线分析走到实时检测最大的瓶颈是特征提取耗时。MFCC 计算、FFT 变换在高采样率下对计算资源有一定要求。优化的思路有两条。一是算法层面减少重叠率比如帧移从 10ms 改到 20ms特征计算量减半信息损失可控。二是在硬件层面如果用的是嵌入式平台比如树莓派可以改用 TensorFlow Lite 部署轻量化模型或者把特征提取的矩阵运算改用 C 实现。实测下来Python 纯软件方案在普通笔记本上能做到接近实时的处理速度但如果你面向的是嵌入式实时性要求高的场景需要在算法和硬件两方面同时做优化。5.4 误报率偏高怎么压下来误报有两类该报故障没报漏报和没故障乱报误报。在很多实际应用场景里误报更让人头疼频繁的假警报会让维护人员失去信任。降低误报率的核心手段是引入判决逻辑不要单帧判定。我的做法是采用滑动窗口投票机制每 5 秒窗口内的每一帧都输出一个分类结果最终决策取众数同时要求故障类别的平均置信度超过 0.85 才算确诊。连续监测 3 个窗口都判故障才触发报警。这套机制把误报率压到非常低的水平代价是报警延迟大约 15 秒对滚动轴承这类缓变退化故障来说完全可接受。5.5 系统扩展方向这套架构的延展性其实很强。除了轴承故障检测换一个分析对象、调节特征提取参数和分类模型就可以迁移到其他旋转机械的故障诊断上比如齿轮箱、电机、泵等。传感器端支持接入加速度计和声阵列特征层面加入高阶统计量和小波包分解模型层面换成注意力机制的 Transformer 或时域卷积网络都有明确的优化空间。最后说一点个人体会做这类系统特征工程永远是第一位的。模型可以简单但特征必须扎实。把信号预处理、特征提取、物理机理吃透了换什么模型都是锦上添花的事。反过来特征没做好再花哨的模型也救不回来。这套系统的核心价值不在于用多前沿的技术而在于把声学信号和机械故障诊断之间的逻辑链条打通了希望这篇分享能给正在做类似课题的朋友一些参考。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →