电子说
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()
参数解释
可以使用 np.abs(spectrum) 获取频谱的幅度,表示在不同频率和时间上的信号强度
2.2 参数选择和对比
2.2.1 nperseg(窗口长度):
2.2.2 noverlap(重叠长度):
2.2.3 选择策略:
参数的选择需要考虑到对信号分析的具体需求,平衡时间和频率分辨率,尝试不同的 nperseg 和 noverlap 值,观察结果的变化。
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%,继续调参可以进一步提高分类准确率.
全部0条评论
快来发表一下你的评论吧 !