希尔伯特解调(包络谱)python代码实战及详细讲解,在CWRU数据上验证

  • 1、数据介绍
  • 2、加载CWRU内圈故障数据
  • 3、希尔伯特解调(包络谱)分析
    • 3.1希尔伯特黄变换
    • 3.2获得包络信号
    • 3.3获得包络谱
    • 3.4去直流分量
  • 4、计算故障特征频率
    • 4.1定义一个轴承故障特征频率计算函数
  • 5、理论故障特征频率与实际故障特征频率验证
  • 6、与fft进行对比分析
  • 7、封装包络谱函数
    • 7.1外圈故障数据测试
    • 7.2滚动体故障数据测试分析
  • 8、总结

欢迎关注公众号《故障诊断与python学习》

代码位置:https://github.com/HappyBoy-cmd/fault_diagnosis_signal_processing
参考资料:
机械故障诊断及典型案例解析(第2版,时献江)
会议论文:Bearing Intelligent Fault Diagnosis Under Complex Working Condition Based on SK-ES-CNN,2021 Global Reliability and Prognostics and Health Management (PHM-Nanjing)

1、数据介绍


包括内圈、外圈、滚动体和正常数据,分别为一个。
1730_12k_0.007-InnerRace:内圈故障
1730_12k_0.007-OuterRace3:外圈故障
1730_12k_0.014-Ball:滚动体故障
1730_48k_Normal:正常数据

对CWRU轴承数据集不了解的同学见这里:
CWRU数据集介绍 第1期
CWRU数据集介绍 第2期
CWRU数据集介绍 第3期
CWRU数据集介绍 第3期

2、加载CWRU内圈故障数据

下面先以轴承内圈故障数据进行分析。原始数据为mat文件,是matlab文件,定义一个函数进行数据读取

def data_acquision(FilePath):"""fun: 从cwru mat文件读取加速度数据param file_path: mat文件绝对路径return accl_data: 加速度数据,array类型"""data = scio.loadmat(file_path)  # 加载mat数据data_key_list = list(data.keys())  # mat文件为字典类型,获取字典所有的键并转换为list类型accl_key = data_key_list[3]  # 获取'X108_DE_time'accl_data = data[accl_key].flatten()  # 获取'X108_DE_time'所对应的值,即为振动加速度信号,并将二维数组展成一维数组return accl_data

data_acquision(FilePath)输入参数FilePath,输出一个1维array数据。下面进行演示

file_path = r'E:/研究生/pytorch/CSDN代码/fault_diagnosis_signal_processing/第4篇-包络谱/1730_12k_0.007-InnerRace.mat'
xt = data_acquision(file_path)
plt.figure(figsize=(12,3))
plt.plot(xt)
print(xt)

输出结果:

[ 0.22269856  0.09323776 -0.14651649 ... -0.36125573  0.311388140.17055689]

3、希尔伯特解调(包络谱)分析

希尔伯特解调法,亦叫包络谱分析。

3.1希尔伯特黄变换

设x(t)x(t)x(t)为一个实时域信号,其Hilbert变换定义为:
h(t)=1π∫−∞+∞x(τ)t−τdτ=x(t)∗1πth(t)=\frac{1}{\pi} \int_{-\infty}^{+\infty} \frac{x(\tau)}{t-\tau} \mathrm{d} \tau=x(t) * \frac{1}{\pi t}h(t)=π1​∫−∞+∞​t−τx(τ)​dτ=x(t)∗πt1​
则原始信号x(t)x(t)x(t)和它的Hilbert变换信号h(t)h(t)h(t)可以构建一个新的解析信号z(t)z(t)z(t):
z(t)=x(t)+jh(t)=a(t)ejφtz(t)=x(t)+j h(t)=a(t) e^{j \varphi t}z(t)=x(t)+jh(t)=a(t)ejφt

# step1: 做希尔伯特变换
ht = fftpack.hilbert(xt)
print(ht)

输出结果:

[-0.02520403 -0.28707983 -0.00610516 ...  0.1100125   0.22821944-0.11203138]

此时输出的h(t)h(t)h(t)是解析信号a(t)a(t)a(t)的虚部系数

对z(t)z(t)z(t)取模,得到其幅值a(t):a(t):a(t):

a(t)=∣z(t)∣=x2(t)+h2(t){a(t)=|z(t)|=\sqrt{x^{2}(t)+h^{2}(t)}}a(t)=∣z(t)∣=x2(t)+h2(t)​

注:a(t)a(t)a(t)即为包络信号,也叫解析信号

3.2获得包络信号

t = np.sqrt(ht**2+xt**2)   # at = sqrt(xt^2 + ht^2)

接下来对包络信号做fft即为包络谱

3.3获得包络谱

sampling_rate = 12000
am = np.fft.fft(at)   # 对希尔伯特变换后的at做fft变换获得幅值
am = np.abs(am)       # 对幅值求绝对值(此时的绝对值很大)
am = am/len(am)*2
am = am[0: int(len(am)/2)]
freq = np.fft.fftfreq(len(at), d=1 / sampling_rate)  # 获取fft频率,此时包括正频率和负频率
freq = freq[0:int(len(freq)/2)]  # 获取正频率
plt.plot(freq, am)


观察发现:
(1)在频率为0Hz的地方幅值比较大
(2)在低频部分貌似看到一倍频和二倍频

3.4去直流分量

在0Hz的幅值比较高,使得其它频率幅值较低,不便观察。这种现象叫直流分量,去直流分量方法,y = y-mean(y)

sampling_rate = 12000
at = at - np.mean(at)  # 去直流分量
am = np.fft.fft(at)    # 对希尔伯特变换后的at做fft变换获得幅值
am = np.abs(am)        # 对幅值求绝对值(此时的绝对值很大)
am = am/len(am)*2
am = am[0: int(len(am)/2)]
freq = np.fft.fftfreq(len(at), d=1 / sampling_rate)  # 获取fft频率,此时包括正频率和负频率
freq = freq[0:int(len(freq)/2)]  # 获取正频率
plt.plot(freq, am)

输出结果:

sampling_rate = 12000
at = at - np.mean(at)  # 去直流分量
am = np.fft.fft(at)    # 对希尔伯特变换后的at做fft变换获得幅值
am = np.abs(am)        # 对幅值求绝对值(此时的绝对值很大)
am = am/len(am)*2
am = am[0: int(len(am)/2)]
freq = np.fft.fftfreq(len(at), d=1 / sampling_rate)  # 获取fft频率,此时包括正频率和负频率
freq = freq[0:int(len(freq)/2)]  # 获取正频率
plt.figure(figsize=(12,3))
plt.plot(freq, am)
plt.xlim(0,500)

输出结果:

4、计算故障特征频率

内圈故障特征频率:FBPFI=nfr2(1+dDcos⁡α)F_{\mathrm{BPFI}}=\frac{n f_{r}}{2}\left(1+\frac{d}{D} \cos \alpha\right)FBPFI​=2nfr​​(1+Dd​cosα)

外圈故障特征频率:FBPFO=nfr2(1−dDcos⁡α)F_{\mathrm{BPFO}}=\frac{n f_{r}}{2}\left(1-\frac{d}{D} \cos \alpha\right)FBPFO​=2nfr​​(1−Dd​cosα)

滚动体故障特征频率:FBSF=Dfr2d[1−(dDcos⁡α)2]F_{\mathrm{BSF}}=\frac{D f_{r}}{2 d}\left[1-\left(\frac{d}{D} \cos \alpha\right)^{2}\right]FBSF​=2dDfr​​[1−(Dd​cosα)2]

nnn: 滚动体个数,frf_{r}fr​: 轴转速 ddd: 滚珠(子)直径 DDD: 轴承节径

轴承型号为:6205-2RSL JME SKF 深沟球滚珠轴承
ddd=7.94mm, DDD=39.04mm, α\alphaα=0, nnn=9

4.1定义一个轴承故障特征频率计算函数

为了方便,定义了一个轴承故障特征频率计算函数,只需输入参数ddd, DDD, α\alphaα, nnn和frf_{r}fr​即可

def bearing_fault_freq_cal(n, d, D, alpha, fr=None):'''基本描述:计算滚动轴承的故障特征频率详细描述:输入4个参数 n, fr, d, D, alphareturn C_bpfi, C_bpfo, C_bsf, C_ftf,  fr内圈    外圈    滚针   保持架  转速Parameters----------n: integerThe number of roller elementfr: float(r/min)Rotational speedd: float(mm)roller element diameterD: float(mm)pitch diameter of bearingalpha: float(°)contact anglefr::float(r/min)rotational speedReturns-------BPFI: float(Hz)Inner race-way fault frequencyBPFO: float(Hz)Outer race-way fault frequencyBSF: float(Hz)Ball fault frequencyFTF: float(Hz)Cage frequency'''C_bpfi = n*(1/2)*(1+d/D*np.math.cos(alpha))C_bpfo = n*(1/2)*(1-(d/D)*np.math.cos(alpha))C_bsf = D*(1/(2*d))*(1-np.square(d/D*np.math.cos(alpha)))C_ftf = (1/2)*(1-(d/D)*np.math.cos(alpha))if fr!=None:return C_bpfi*fr/60, C_bpfo*fr/60, C_bsf*fr/60, C_ftf*fr/60, fr/60else:return C_bpfi, C_bpfo, C_bsf, C_ftf, fr

下面计算CWRU在转速1730rpm时的故障特征频率

bpfi, bpfo, bsf, ftf, fr = bearing_fault_freq_cal(n=9, alpha=0, d=7.94, D=39.04, fr=1730)
print('内圈故障特征频率',bpfi)
print('外圈故障特征频率',bpfo)
print('滚动体故障特征频率',bsf)
print(ftf)
print(fr)

5、理论故障特征频率与实际故障特征频率验证

sampling_rate = 12000
at = at - np.mean(at)  # 去直流分量
am = np.fft.fft(at)    # 对希尔伯特变换后的at做fft变换获得幅值
am = np.abs(am)        # 对幅值求绝对值(此时的绝对值很大)
am = am/len(am)*2
am = am[0: int(len(am)/2)]
freq = np.fft.fftfreq(len(at), d=1 / sampling_rate)  # 获取fft频率,此时包括正频率和负频率
freq = freq[0:int(len(freq)/2)]  # 获取正频率
plt.figure(figsize=(12,3))
plt.plot(freq, am)
plt.xlim(0,500)
plt.vlines(x=156.13, ymin=0, ymax=0.2, colors='r')  # 一倍频
plt.vlines(x=156.13*2, ymin=0, ymax=0.2, colors='r')  # 二倍频

输出结果:

红色为理论内圈故障特征频率,蓝线为实际故障特征频率。虽然没有完全重合,但这个是在允许范围内的。因此在实际情况中包络谱出现该情况,可以该轴承出现了内圈故障。

6、与fft进行对比分析

那如果不希尔伯特变换解调,直接fft,能够看到故障特征频率吗?下面进行对比分析

sampling_rate = 12000
am = np.fft.fft(xt)   # 对希尔伯特变换后的at做fft变换获得幅值
am = np.abs(am)       # 对幅值求绝对值(此时的绝对值很大)
am = am/len(am)*2
am = am[0: int(len(am)/2)]
freq = np.fft.fftfreq(len(xt), d=1 / sampling_rate)  # 获取fft频率,此时包括正频率和负频率
freq = freq[0:int(len(freq)/2)]  # 获取正频率
plt.plot(freq, am)

输出结果:

可见原始内圈故障信号的fft高频较多

plt.plot(freq, am)
plt.xlim(0, 500)
plt.vlines(x=156.13, ymin=0, ymax=0.05, colors='r')  # 一倍频
plt.vlines(x=156.13*2, ymin=0, ymax=0.05, colors='r')  # 二倍频


可见直接fft的话,故障特征频率幅值较低,被其它频率幅值掩盖了。反过来,希尔伯特解调可以更加方便观察故障特征频率低频。

7、封装包络谱函数

为了更加方便使用包络谱,这里封装了一个包络谱函数plt_envelope_spectrum

def plt_envelope_spectrum(data, fs, xlim=None, vline= None):'''fun: 绘制包络谱图param data: 输入数据,1维arrayparam fs: 采样频率param xlim: 图片横坐标xlim,default = Noneparam vline: 图片垂直线,default = None'''#----去直流分量----#data = data - np.mean(data)#----做希尔伯特变换----#xt = dataht = fftpack.hilbert(xt)at = np.sqrt(xt**2+ht**2)   # 获得解析信号at = sqrt(xt^2 + ht^2)am = np.fft.fft(at)         # 对解析信号at做fft变换获得幅值am = np.abs(am)             # 对幅值求绝对值(此时的绝对值很大)am = am/len(am)*2am = am[0: int(len(am)/2)]  # 取正频率幅值freq = np.fft.fftfreq(len(at), d=1 / fs)  # 获取fft频率,此时包括正频率和负频率freq = freq[0:int(len(freq)/2)]  # 获取正频率plt.plot(freq, am)if vline:  # 是否绘制垂直线plt.vlines(x=vline, ymax=0.2, ymin=0, colors='r')  # 高度y 0-0.2,颜色红色if xlim: # 图片横坐标是否设置xlimplt.xlim(0, xlim)  plt.xlabel('freq(Hz)')    # 横坐标标签plt.ylabel('amp(m/s2)')   # 纵坐标标签

7.1外圈故障数据测试

file_path = r'E:/研究生/pytorch/CSDN代码/fault_diagnosis_signal_processing/第4篇-包络谱/1730_12k_0.007-OuterRace3.mat'
data = data_acquision(file_path)
plt_envelope_spectrum(data = data, fs=12000, xlim=300, vline=bpfo)

输出结果:

可见实际外圈故障特征频率比较明显

7.2滚动体故障数据测试分析

file_path = r'E:/研究生/pytorch/CSDN代码/fault_diagnosis_signal_processing/第4篇-包络谱/1730_12k_0.014-Ball.mat'
data = data_acquision(file_path)
plt_envelope_spectrum(data = data, fs=12000, xlim=300, vline=bsf)

可见实际滚动体故障特征频率不明显

8、总结

(1)包络谱能够检测出内圈、外圈故障,滚动体比较困难
(2)直接使用fft难以检测故障特征频率,故障特征频率易被高频掩盖

信号处理-基于希尔伯特解调(包络谱)的轴承故障诊断实战,通过python代码实现超详细讲解相关推荐

  1. 基于遗传算法求解TSP问题(旅游路径规划,Python实现,超详细,可视化,结果分析)

    ps:作者是很用心写的,如果觉得不错,请给作者一点鼓励噢!(点赞收藏评论噢) 基于遗传算法求解TSP问题 摘要 巡回旅行商问题(TSP)是组合优化中的经典问题.常见的TSP问题求解算法例如穷举法.贪心 ...

  2. 基于MK-MMD度量迁移学习的轴承故障诊断方法研究

    摘要 上一篇文章实验是基于凯斯西厨大学轴承数据集,使用同一负载情况下的6种轴承数据进行故障诊断,并没有进行不同负载下轴承故障诊断.之前没做这块迁移学习实验,主要是对于迁移学习理解不到位,也没有不知道从 ...

  3. 【故障诊断】基于贝叶斯优化支持向量机的轴承故障诊断附matlab代码

    1 内容介绍 贝叶斯网络(Bayesian Network或BN)是人工智能领域进行建模和不确定性推理的一个有效工具.贝叶斯网推理的基本任务是:给定一组证据变量观察值,通过搜索条件概率表计算一组查询变 ...

  4. Pytorch实战:基于鲸鱼WOA优化1DCNN的轴承故障诊断

    目录 0.引言 1.关键点 2.WOA优化1DCNN超参数实战 2.1 数据准备 2.2 1DCNN故障诊断建模 2.3 采用WOA优化1DCNN超参数 0.引言 采用1DCNN进行轴承故障诊断建模, ...

  5. 基于BAS算法实现复杂网络社区发现问题——附python代码

    基于智能优化算法的复杂网络社区发现问题 第一章 基于天牛须算法求解复杂网络社区发现问题 文章目录 基于智能优化算法的复杂网络社区发现问题 前言 一.基本天牛须算法 二.关于社区发现 基本问题 总结 前 ...

  6. Deep Learning:基于pytorch搭建神经网络的花朵种类识别项目(内涵完整文件和代码)—超详细完整实战教程

    基于pytorch的深度学习花朵种类识别项目完整教程(内涵完整文件和代码) 相关链接:: 超详细--CNN卷积神经网络教程(零基础到实战) 大白话pytorch基本知识点及语法+项目实战 文章目录 基 ...

  7. -uc/OS系统移植(基于STM32F103C8T6,超详细讲解)

    完成STM32F103C8基于HAL库的-uc/OS系统移植 一.创建HAL库 二.下载uc/OSIII源码及移植准备 1.下载uc/OSIII源码 2.将uc/OS源码文件复制到工程 三.将uc/O ...

  8. 基于Word2vec加TextRank算法生成中文新闻摘要(附python代码)

    转自 # https://blog.csdn.net/qq_36910634/article/details/97764251 import numpy as np import pandas as ...

  9. 【故障诊断】基于 KPCA 进行降维、故障检测和故障诊断研究(Matlab代码实现)

  10. 基于SSM框架简易项目“书籍管理系统”,超详细讲解,附源码

    目录 我有话说: 1 项目简介 2 项目展示 2.1 首先创建数据库和表信息 2.2 预先准备操作 2.3 开始配置项目 2.4 开始web层 3 图片展示 4 附上源码文件(百度网盘): 我有话说: ...

最新文章

  1. 敏感性与特异性理解笔记
  2. Maven解决静态资源过滤问题
  3. Python学习之并发基础知识
  4. 服装零售行业洞察报告
  5. 网易市值超百度 成为国内第五大互联网公司
  6. python 跳过异常元素继续,在python中的迭代器/生成器中引发异常后继续
  7. PyTorch学习—1.深入浅出PyTorch(如何学习PyTorch)
  8. 【第133期】 游戏策划:给@1的简历分析
  9. matlab查询函数用法,matlab函数用法总结
  10. 表格中合并同类项并求和(物料统计) 并去除数据中的公式项
  11. 某些特殊悼念日的时候,让个人网页风格变黑灰色
  12. UI设计需要使用哪些软件?推荐这5款
  13. 小米手机play商店无法下载
  14. linux docker安装 制作Elasticsearch容器镜像 并上传docker hub
  15. Android水平仪实训报告,水准仪测量实训报告
  16. Echarts 坐标轴刻度间隔/全部显示
  17. 不懂英语怎么做亚马逊_亚马逊的回声秀可以做的一切其他回声都做不到
  18. Kernel panic - not syncing VFS Unable to mount root fs on
  19. mysql5.7导出数据提示--secure-file-priv选项问题的解决方法
  20. 【深度】韦东山:一文看看尽linux对中断处理的前世今生

热门文章

  1. 计算机考研408每日一题 day160
  2. ifonts提取下载ttf文件
  3. 极光 MPush 资料
  4. ubuntu安装l2tp/ipsec
  5. matlab排序算法,相同位置返回元素排名
  6. slf4j、log4j日志级别与配置
  7. SSM框架整合+简单的增删改查的实现
  8. Javaweb面试题整理
  9. mysql数据库表中重命名语句_mysql数据库重命名sql语句
  10. 关于物流项目面试可能会被问到的20题总结