Python 信号处理——阶次分析(常规实现及另类实现)


前言

在变转速旋转机械故障诊断中,阶次分析是目前比较有效的分析方法。阶次分析的实现需要依托设备转速曲线和振动信号,转速曲线则基于脉冲信号,因此,阶次分析需要硬件采集器能同步采集设备的脉冲信号和振动信号。


一、阶次分析原理

阶次分析核心是将等时间间隔采样信号转换为等角度间隔采样,角域重采原理如下图所示。阶次分析涉及到的技术步骤包括以下几点:
1、根据脉冲信号计算出转速曲线;
2、根据转速曲线计算出设备角度变化曲线;
3、根据角度变化曲线获得等角度间隔对应的时刻;
4、根据角度对应的时刻对原时域信号进行重采,最终得到角域信号。
将角域信号进行FFT变换便可获得阶次谱,除此之外,还可以对角域信号进行包络计算、去噪、EMD分解等操作,得到想要的分析结果。
如果想进一步了解阶次分析原理细节,可底部留言或者查阅相应的技术文献,这里暂不做赘述。
在这里插入图片描述

二、使用步骤

1.主要代码

脉冲数据转为转速:

def tacho2rpm(x, fs, TLeveL=4, Slope=1, PPR=1, NewFs=None, Filter=5):
    time = len(x)
    x1 = np.arange(0, time, 1)
    t = x1 / fs
    xDiff = np.diff(np.sign(x - TLeveL).flatten())
    tDiff = t[1:]
    NewFs = fs
    if Slope > 0:
        tTacho = tDiff[np.where(xDiff == 2)]
    else:
        tTacho = tDiff[np.where(xDiff == -2)]

    rpmt = 60 / PPR / np.diff(tTacho)
    rpmt = (rpmt[0:-1] + rpmt[1:]) / 2
    tTacho = tTacho[1:-1]
    # 平滑处理
    if Filter > 1:
        a = 1
        b = 1 / Filter * np.ones((1, Filter)).flatten()
        rpmt = signal.filtfilt(b, a, rpmt)
    else:
        pass
    t = np.arange(0, t[-1] + 1 / NewFs, 1 / NewFs)
    rpm = np.interp(t, tTacho, rpmt)
    return t, rpm

2.示例Demo

代码如下(示例):

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
import scipy.io as scio
import Angget

def tacho2rpm(x, fs, TLeveL=4, Slope=1, PPR=1, NewFs=None, Filter=5):
    time = len(x)
    x1 = np.arange(0, time, 1)
    t = x1 / fs
    xDiff = np.diff(np.sign(x - TLeveL).flatten())
    tDiff = t[1:]
    NewFs = fs
    if Slope > 0:
        tTacho = tDiff[np.where(xDiff == 2)]
    else:
        tTacho = tDiff[np.where(xDiff == -2)]

    rpmt = 60 / PPR / np.diff(tTacho)
    rpmt = (rpmt[0:-1] + rpmt[1:]) / 2
    tTacho = tTacho[1:-1]
    # 平滑处理
    if Filter > 1:
        a = 1
        b = 1 / Filter * np.ones((1, Filter)).flatten()
        rpmt = signal.filtfilt(b, a, rpmt)
    else:
        pass
    t = np.arange(0, t[-1] + 1 / NewFs, 1 / NewFs)
    rpm = np.interp(t, tTacho, rpmt)
    return t, rpm

if __name__ == '__main__':
	file_path = "I-A-1.mat"
	normal = scio.loadmat(file_path)
	x = normal['Channel_2']
	fs = 200000
	t,rpm = tacho2rpm(x,fs,TLeveL=4, Slope=1, PPR=1024,NewFs=fs, Filter=5)
	plt.figure()
	plt.plot(t, rpm)
	os = 1024
	rpm = rpm / 60
	ang, amp = Angget(t, rpm, os)  #  ang为角度,amp为角域重采后的幅值
	plt.figure()
	plt.plot(ang, amp)

注:代码中使用的数据为加拿大渥太华大学变转速轴承数据,下载链接: https://data.mendeley.com/datasets/v43hmbwxpm/1
Angget为自定义函数,用于获取重采后的角域信号,如有需要可留言或加入VIP群。

3.计算结果

在这里插入图片描述

总结

阶次分析是将非稳定振动信号转为稳定振动信号,至于什么算是“稳定”,个人理解是:大多数情况下设备转速是平稳的,采集器等间隔采样策略下,采集到的设备转动角度也是一样的,对应的信号相位也是等间隔的;如果设备转速变化,那么在等时间间隔下,设备转动的角度不再相同,采集到信号的相位也是变化的,从而导致常规分析策略失效,一句话:阶次分析是实现了信号等相位采样,从避免频率混叠等问题。
因此,阶次分析本质上是追求信号相位等间隔,从而实现非平稳信号到平稳信号转换,更进一步的认为,振动的本身是由外部激励(力)引起,如果外部激励非稳定,那么产生的信号也不稳定,对于旋转机械可以用阶次分析方法,但对于往复机械或者其他设备,是否通过等激励间隔采样产生类似阶次分析的效果?这一想法有待证实。
阶次分析也存在不足之处,设备转速改变时相应的功率也会发生变化,反应在信号是幅值的改变,阶次分析虽然解决了频谱混叠问题,但对于幅值的波动并未能有效解决。
PS:文中的阶次分析是计算阶次方法,需要用到转速信号的拟合、转角积分等计算步骤,相对繁琐。通过研究文中数据特点,其实可以直接获得角域信号而不需要上述计算步骤,实现方法可关注公众号:“不说话上代码”,或者留言获取。

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 46
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不说话上代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值