请问如何用python对mat文件做STFT?
我会读取mat文件,可是不知道怎么对它进行处理,mat文件是二进制文件,不是一个信号,我想处理它,是不是要先做点什么呀?
import scipy.io as scio
path = r'E:\data.mat'
matdata = scio.loadmat(path)
将mat文件输出print(matdata)
这是结果,看起来是一堆复数?{'__header__': b'MATLAB 5.0 MAT-file, Platform: PCWIN64, Created on: \xd6\xdc\xce\xe5 6\xd4\xc2 24 15:36:29 2022', '__version__': '1.0', '__globals__': [], 'sig': array([[-0.00473022-0.00531006j, -0.0045166 +0.00231934j,
-0.00164795+0.00299072j, ..., -0.00012207+0.01489258j,
0.01419067+0.00518799j, 0.01101685-0.01196289j]])}
我的目的是:想问一下如何对mat文件进行处理,真的是束手无策啊?
import scipy.io as io
ball_18_0 = io.loadmat("D:/工作站1/西储大学轴承数据中心网站/12k Drive End Bearing Fault Data/滚动体故障/118")
print(ball_18_0)
得到答案如下:
{'header': b'MATLAB 5.0 MAT-file, Platform: PCWIN, Created on: Mon Jan 31 13:55:05 2000', 'version': '1.0', 'globals': [],
'X118_DE_time': array([[-0.0027614 ],
[-0.09632403],
[ 0.11370459],
...,
[-0.07829373],
[-0.14911545],
[ 0.02111657]]), 'X118_FE_time': array([[-0.24716182],
[ 0.14279091],
[ 0.00328727],
...,
[ 0.01643636],
[-0.03842 ],
[-0.16806182]]), 'X118_BA_time': array([[ 0.01553163],
[ 0.01693994],
[-0.03645507],
...,
[ 0.03178754],
[-0.03243134],
[-0.0668343 ]]), 'X118RPM': array([[1796]], dtype=uint16)}
找到自己需要的关键词,于是进行了如下操作,保存成文本:
ball_18_0 = io.loadmat("D:/工作站1/西储大学轴承数据中心网站/12k Drive End Bearing Fault Data/滚动体故障/118")["X118_DE_time"].tolist()
print(ball_18_0)
np.savetxt('D:/ball18.txt', ball_18_0)
现在进行STFT:
from scipy.signal import stft
data = np.loadtxt('D:/ball18.txt')
fs = 12000
window = 'hann'
# frame长度
n = 256
# STFT
f, t, Z = stft(data, fs=fs, window=window, nperseg=n)
# 求幅值
Z = np.abs(Z)
# 如下图所示
plt.pcolormesh(t, f, Z, vmin=0, vmax=Z.mean()*10)
plt.show()
看起来mat存储的是序列化后的数据,所以直接打印不是很清晰。
处理的话,你需要了解mat里面到底存储了什么,即存储的数据是什么结构,才好作傅里叶变换处理。
https://blog.csdn.net/weixin_43093226/article/details/83929163
问一下给你文件的人,里面存储的数据格式和类型。