拓冰建站拓冰建站
首页 / 资讯中心 / 正文

【异音检测】FFT 频谱 + 包络谱:从零实现轴承故障诊断

轴承故障的早期信号往往藏在 FFT 频谱看不到的地方。很多工程师拿着频谱图找半天却忽略了真正的问题频率只出现在包络谱里。本文用 Python 从零实现 FFT 频谱和包络谱并用一段合成信号演示为什么轴承诊断一定要看包络谱。代码可复制运行依赖 numpy 和 scipy。一、先搞清楚一个现象调制轴承外圈一旦出现剥落滚动体每转一圈经过剥落点就会产生一次冲击。这种周期性冲击会激起结构的高频共振比如 500 Hz表现出来就是一个高频载波500 Hz被一个低频故障频率比如 15 Hz调制。用数学表示就是x(t) (1 m·sin(2π·f_fault·t)) · sin(2π·f_carrier·t)其中 f_carrier 500 Hz 是载波f_fault 15 Hz 是故障频率m 是调制深度。二、为什么 FFT 频谱会看不见故障频率对上面的调制信号做 FFT频谱里出现的是载波 500 Hz以及 500±15 Hz 的边带而 15 Hz 这个故障频率本身的能量极低——被淹没在载波里了。所以如果你只看 FFT 频谱会看到一个 500 Hz 的主峰误以为没问题或只是共振而真正的 15 Hz 故障特征被藏起来了。三、包络谱把故障频率解调出来解决思路是解调先取信号的包络希尔伯特变换的幅值再对包络做 FFT。这样载波被剥离剩下的就是低频的故障频率。流程对信号做希尔伯特变换得到解析信号取解析信号的幅值得到包络对包络做FFT得到包络谱——故障频率会清晰现身。四、完整 Python 实现# -*- coding: utf-8 -*-importnumpyasnpfromscipy.signalimporthilbertdefspectrum(x,sr):单边幅值谱去直流 汉宁窗xx-np.mean(x)nlen(x)wnp.hanning(n)Xnp.fft.rfft(x*w)freqnp.fft.rfftfreq(n,d1.0/sr)amp2.0*np.abs(X)/nreturnfreq,ampdefenvelope_spectrum(x,sr):包络谱先取希尔伯特包络再对其做频谱envelopenp.abs(hilbert(x))returnspectrum(envelope,sr)defgen_bearing_fault(sr10000,duration1.0,carrier500.0,f_fault15.0,m0.8):合成调制信号500Hz 载波被 15Hz 故障频率调制 真实轴承故障的周期冲击会在载波两侧产生边带 包络谱正是用来「解调」出这个低频故障频率的。tnp.arange(int(sr*duration))/sr x(1m*np.sin(2*np.pi*f_fault*t))*np.sin(2*np.pi*carrier*t)xx0.05*np.random.randn(len(t))returnt,xif__name____main__:sr10000t,xgen_bearing_fault(sr)freq,ampspectrum(x,sr)efreq,eampenvelope_spectrum(x,sr)i_fnp.argmax(amp)print(fFFT 频谱主峰{freq[i_f]:.1f}Hz幅值{amp[i_f]:.3f})band(efreq5)(efreq100)# 只看低频段i_enp.argmax(eamp[band])print(f包络谱主峰(5-100Hz){efreq[band][i_e]:.1f}Hz幅值{eamp[band][i_e]:.3f})print(结论FFT 频谱只暴露 500Hz 载波包络谱才定位到 15Hz 故障频率。)五、运行结果FFT 频谱主峰500.0 Hz幅值 0.500 包络谱主峰(5-100Hz)15.0 Hz幅值 0.399 结论FFT 频谱只暴露 500Hz 载波包络谱才定位到 15Hz 故障频率。结果一目了然FFT 频谱主峰在 500 Hz载波15 Hz 的故障频率看不见。包络谱主峰精确落在 15 Hz——故障频率被成功解调出来。这就是轴承故障诊断里先看包络谱再看频谱的原因。六、总结FFT 频谱包络谱看什么载波/共振频率低频故障特征频率轴承早期故障容易漏掉清晰可见原理直接对信号做 FFT先取希尔伯特包络再 FFT一句话记住包络谱是轴承以及一切周期冲击类故障诊断的照妖镜能把被高频载波藏起来的故障频率揪出来。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门