0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python轴承故障诊断—短时傅里叶变换STFT简析

冬至子 来源:建模先锋 作者:小蜗爱建模 2023-12-06 18:13 次阅读

1 短时傅里叶变换STFT原理介绍

1.1 傅里叶变换的本质

傅里叶变换的基本思想:

  • 信号分解成一系列不同频率的连续正弦波的叠加;
  • 或者说,将信号从时间域转换到频率域。

图片

由于傅里叶变换是对整个信号进行变换,将整个信号从时域转换到频域,得到一个整体的频谱;丢掉了时间信息,无法根据傅立叶变换的结果判断一个特定信号在什么时候发生;所以傅里叶变换缺乏时频分析能力、多分辨率分析能力,难以分析非平稳信号。

1.2 STFT概述

短时傅里叶变换(Short-Time Fourier Transform,STFT)是一种将信号分解为时域和频域信息的时频分析方法。它通过将信号分成短时段,并在每个短时段上应用傅里叶变换来捕捉信号的瞬时频率。即采用中心位于时间α的时间窗g(t-α)在时域信号上滑动,在时间窗g(t-α)限定的范围内进行傅里叶变换,这样就使短时傅里叶变换具有了时间和频率的局部化能力,兼顾了时间和频率的分析[1]。

  • 使用窄窗,时间分辨率提高而频率分辨率降低;
  • 使用宽窗,频率分辨率提高而时间分辨率降低。

图片

比如用利用高斯窗STFT对非平稳信号进行分析:

图片

1.3 STFT的原理和过程

1.3.1 时间分割

在短时傅里叶变换(STFT)中,首先将信号分割成短时段。这个过程通常通过使用窗口函数来实现,窗口函数是一个在有限时间内非零,而在其他时间上为零的函数。常见的窗口函数有矩形窗、汉明窗、汉宁窗等。通过将窗口函数应用于信号,可以将信号分成许多短时段。

1.3.2 傅里叶变换

对于每个短时段,都会进行傅里叶变换。傅里叶变换是一种将信号从时域(时间域)转换为频域(频率域)的方法。在这个上下文中,它用于分析每个短时段内信号的频率成分。傅里叶变换将信号表示为不同频率的正弦和余弦函数的组合。

1.3.3 时频图:

将每个短时段的傅里叶变换结果排列成一个矩阵,构成了时频图。时频图的横轴表示时间,纵轴表示频率,而每个点的强度表示对应频率在对应时刻的幅度。时频图提供了一种直观的方式来观察信号在时间和频率上的变化。

图片

1.4 公式表示

STFT的数学表达式如下:

图片

其中,

图片

2 基于Python的STFT实现与参数对比

在 Python 中,使用 scipy 库来实现短时傅里叶变换(STFT)

2.1 代码示例

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import stft
# 生成三个不同频率成分的信号
fs = 1000  # 采样率
t = np.linspace(0, 1, fs, endpoint=False)  # 时间


# 第一个频率成分
signal1 = np.sin(2 * np.pi * 50 * t)
# 第二个频率成分
signal2 = np.sin(2 * np.pi * 120 * t)
# 第三个频率成分
signal3 = np.sin(2 * np.pi * 300 * t)


# 合并三个信号
signal = np.concatenate((signal1, signal2, signal3))


# 进行短时傅里叶变换  
f, t, spectrum = stft(signal, fs, nperseg=100, noverlap=50)
# 绘制时频图
plt.pcolormesh(t, f, np.abs(spectrum), shading='gouraud')
plt.title('STFT Magnitude')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()

参数解释

  • nperseg:表示每个段的长度,即窗口大小
  • noverlap:表示相邻段的重叠部分
  • f:是频率数组,表示频谱的频率分量
  • t:是时间数组,表示每个时间段的起始时间
  • spectrum:是频谱矩阵,spectrum[f, t] 表示在频率 f 处于时间 t 时的频谱强度

可以使用 np.abs(spectrum) 获取频谱的幅度,表示在不同频率和时间上的信号强度图片

2.2 参数选择和对比

2.2.1 nperseg(窗口长度):

  • nperseg 定义了每个时间段内的信号长度,也就是说,它规定了窗口的大小。
  • **较小的 **nperseg 可以提供更高的时间分辨率,因为窗口更短,可以捕捉到信号的更快变化。但频率分辨率较差。
  • 较大的 nperseg 提供更高的频率分辨率,但可能失去对信号快速变化的捕捉。
  • 选择适当的窗口长度要根据信号特性,如频率变化的速率和信号长度等。

2.2.2 noverlap(重叠长度):

  • noverlap 定义了相邻时间段之间的重叠部分。
  • **较大的 **noverlap 可以提高时间分辨率,因为相邻时间段之间有更多的共享信息。但可能导致频谱图中的泄漏(leakage)。
  • **较小的 **noverlap 可以提高频率分辨率,减少泄漏,但时间分辨率可能下降。

2.2.3 选择策略:

参数的选择需要考虑到对信号分析的具体需求,平衡时间和频率分辨率,尝试不同的 nperseg 和 noverlap 值,观察结果的变化。

  • 对于 nperseg,选择较小的值可能需要根据信号的特定频率内容进行调整。确保窗口足够短,以捕捉到频率变化。
  • 对于 noverlap,通常选择 50% 的重叠是一个常见的起点

2.3 凯斯西储大学轴承数据的加载

选择正常信号和 0.021英寸内圈、滚珠、外圈故障信号数据来做对比

第一步,导入包,读取数据

import numpy as np
from scipy.io import loadmat
import numpy as np
from scipy.signal import stft
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rc("font", family='Microsoft YaHei')


# 读取MAT文件
data1 = loadmat('0_0.mat')  # 正常信号
data2 = loadmat('21_1.mat') # 0.021英寸 内圈
data3 = loadmat('21_2.mat') # 0.021英寸 滚珠
data4 = loadmat('21_3.mat') # 0.021英寸 外圈
# 注意,读取出来的data是字典格式,可以通过函数type(data)查看。

第二步,数据集中统一读取 驱动端加速度数据,取一个长度为1024的信号进行后续观察和实验

# DE - drive end accelerometer data 驱动端加速度数据
data_list1 = data1['X097_DE_time'].reshape(-1)
data_list2 = data2['X209_DE_time'].reshape(-1)  
data_list3 = data3['X222_DE_time'].reshape(-1)
data_list4 = data4['X234_DE_time'].reshape(-1)
# 划窗取值(大多数窗口大小为1024)
data_list1 = data_list1[0:1024]
data_list2 = data_list2[0:1024]
data_list3 = data_list3[0:1024]
data_list4 = data_list4[0:1024]

第三步,进行数据可视化

plt.figure(figsize=(20,10))


plt.subplot(2,2,1)
plt.plot(data_list1)
plt.title('正常')
plt.subplot(2,2,2)
plt.plot(data_list2)
plt.title('内圈')
plt.subplot(2,2,3)
plt.plot(data_list3)
plt.title('滚珠')
plt.subplot(2,2,4)
plt.plot(data_list4)
plt.title('外圈')


plt.show()

图片

2.4 STFT与参数选择

2.4.1 基于重叠比例为0.5,选择内圈数据比较 STFT 的不同尺度:16、32 、64、128

from scipy.signal import stft


# 设置STFT参数
window_size = 32  # 窗口大小
overlap = 0.5  # 重叠比例
# 计算重叠的样本数
overlap_samples = int(window_size * overlap)
frequencies1, times1, magnitude1 = stft(data_list2, nperseg=window_size, noverlap=overlap_samples)


# 设置STFT参数
window_size = 64  # 窗口大小
overlap = 0.5  # 重叠比例
# 计算重叠的样本数
overlap_samples = int(window_size * overlap)
frequencies2, times2, magnitude2 = stft(data_list2, nperseg=window_size, noverlap=overlap_samples)


# 设置STFT参数
window_size = 128  # 窗口大小
overlap = 0.5  # 重叠比例
# 计算重叠的样本数
overlap_samples = int(window_size * overlap)
frequencies3, times3, magnitude3 = stft(data_list2, nperseg=window_size, noverlap=overlap_samples)


# 设置STFT参数
window_size = 256  # 窗口大小
overlap = 0.5  # 重叠比例
# 计算重叠的样本数
overlap_samples = int(window_size * overlap)
frequencies4, times4, magnitude4 = stft(data_list2, nperseg=window_size, noverlap=overlap_samples

数据可视化

plt.figure(figsize=(20,10), dpi=100)
plt.subplot(2,2,1)
plt.pcolormesh(times1, frequencies1, np.abs(magnitude1), shading='gouraud')
plt.title('尺度 16-内圈')
plt.subplot(2,2,2)
plt.pcolormesh(times2, frequencies2, np.abs(magnitude2), shading='gouraud')
plt.title('尺度 32-内圈')
plt.subplot(2,2,3)
plt.pcolormesh(times3, frequencies3, np.abs(magnitude3), shading='gouraud')
plt.title('尺度 64-内圈')
plt.subplot(2,2,4)
plt.pcolormesh(times4, frequencies4, np.abs(magnitude4), shading='gouraud')
plt.title('尺度 128-内圈')
plt.show()

图片

对比不同尺度的变化,大尺度有着较高的频率分辨率,小的尺度有着较高的时间分辨率,要权衡故障的分类辨识度,需要进一步做对比。

2.4.1 根据正常数据和三种故障数据,对比不同尺度的辨识度

图片

图片

综合考虑频率分辨率和时间分辨率,选择尺度为32。

3 基于时频图像的轴承故障诊断分类

下面以短时傅里叶变换(Short Time Fourier Transform,STFT)作为轴承故障数据的处理方法进行讲解:

数据介绍,凯斯西储大学(CWRU)轴承数据10分类数据集如图所示图片

train_set、val_set、test_set 均为按照7:2:1划分训练集、验证集、测试集,最后保存数据

3.1 生成时频图像数据集

图片

如图所示为生成的时频图像数据集

图片

3.2 定义数据加载器和VGG网络模型

制作数据标签,保存数据

图片

定义VGG网络模型

图片

3.3 设置参数,训练模型

图片

100个epoch,准确率将近92%,继续调参可以进一步提高分类准确率.

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 正弦波
    +关注

    关注

    11

    文章

    642

    浏览量

    55339
  • python
    +关注

    关注

    56

    文章

    4792

    浏览量

    84627
  • 傅里叶变换
    +关注

    关注

    6

    文章

    441

    浏览量

    42592
  • STFT
    +关注

    关注

    0

    文章

    11

    浏览量

    9262
收藏 人收藏

    评论

    相关推荐

    短时傅里叶变换STFT原理详解

    传统傅里叶变换的分析方法大家已经非常熟悉了,特别是快速傅里叶变换(FFT)的高效实现给数字信号处理技术的实时应用创造了条件,从而加速了数字信号处理技术的发展。
    的头像 发表于 01-07 09:46 2844次阅读
    <b class='flag-5'>短时</b><b class='flag-5'>傅里叶变换</b><b class='flag-5'>STFT</b>原理详解

    基于labview的轴承故障诊断与健康监测

    毕S做基于labview的轴承故障诊断与健康监测,但是感觉无从下手,没有实物进行数据采集,想来也只能模拟采集振动信号,但这个振动信号又该如何产生,看网上有凯斯西储大学轴承数据,但又不知如何利用,,求教各位labview前辈大佬给
    发表于 03-18 23:33

    DSP的滚动轴承实时故障诊断系统设

    。据统计,在使用滚动轴承的旋转机械中,由于滚动轴承损坏而引起的故障约占30%。由此可见,滚动轴承故障诊断在工程中还是有其重要意义的
    发表于 09-29 16:54

    船舶感应电机轴承故障诊断方法的几点研究

    特征量其他振动信号所淹没;基于参数辨识的方法因为需要电机的一些机械及电磁参数,因而不利于故障诊断系统的通用性;瞬时功率分析法和气隙转矩分析法均需要船舶感应电机轴承故障诊断系统的研究时采集定子电压和电流
    发表于 10-21 10:59

    【转】电力电子电路故障诊断方法

    故障的特征。而电力电子电路中包含故障信息的关键点信号通常具有周期性,因此可以用傅里叶变换将时域中的故障波形变换到频域,以突出
    发表于 03-06 20:35

    基于DSP+MCU的列车滚动轴承故障诊断系统研究

    ,对于列车的安全有着重大的影响。因此,开展列车滚动轴承故障诊断的研究对避免重大事故、促进经济发展具有相当大的意义。
    发表于 07-09 06:30

    电机轴承故障诊断与分析

    很多工程师都在网上向我咨询电机轴承故障诊断与分析的问题。面对五花八门的问题,有时候我可以根据一些信息进行判断,有时候什么信息也没有,这样的情况下我的所谓判断只能是猜测,恐怕距离真相,也十分遥远。大家
    发表于 09-01 09:01

    基于小波变换故障诊断信号非平稳性分析

    基于小波变换故障诊断信号非平稳性分析 从工程角度,解释小波变换的实际含义,并将其与传统的傅里叶变换分析方法作比较,通过比较两种基函数的时频窗,显示
    发表于 02-22 17:08 24次下载

    滚动轴承故障诊断的实用技巧

      摘要:本文主要介绍滚动轴承区别于实验室诊断的生产实用技巧。关键词:滚动轴承故障诊断、振动分析、实用技巧滚动轴承在设备中的应用非常广泛,
    发表于 10-29 14:44 1603次阅读

    STFT短时傅里叶变换

    关于短时傅里叶变换的原理及其在通信的应用。
    发表于 05-17 16:41 5次下载

    基于HMM的音频故障诊断平台实现轴承建模与诊断实验

    轴承是机械设备中应用最为广泛的一种通用部件,也是最容易损坏的零件之一,它工作正常与否直接影响整台机器的性能,因而轴承故障诊断成为重要的研究课题和目前的研究热点。在轴承
    的头像 发表于 10-14 10:46 3987次阅读
    基于HMM的音频<b class='flag-5'>故障诊断</b>平台实现<b class='flag-5'>轴承</b>建模与<b class='flag-5'>诊断</b>实验

    时频分析之短时傅里叶变换STFT资源下载

    时频分析之短时傅里叶变换STFT资源下载
    发表于 04-26 11:35 7次下载

    短时傅里叶变换特点 短时傅里叶变换的意义

    短时傅里叶变换特点 短时傅里叶变换的意义  短时傅里叶变换(Short-time Fourier
    的头像 发表于 09-07 16:23 2083次阅读

    短时傅里叶变换和小波变换差别

    短时傅里叶变换和小波变换差别 短时傅里叶变换(short-time Fourier transform,
    的头像 发表于 09-07 17:04 3324次阅读

    故障诊断python的实验仿真方法

    基于信号处理的诊断:利用信号处理技术,如傅里叶变换、小波变换等,对采集到的信号进行分析,提取故障特征
    的头像 发表于 02-21 18:02 614次阅读
    <b class='flag-5'>故障诊断</b>与<b class='flag-5'>python</b>的实验仿真方法