请问如何用python对mat文件做STFT?

请问如何用python对mat文件做STFT?
我会读取mat文件,可是不知道怎么对它进行处理,mat文件是二进制文件,不是一个信号,我想处理它,是不是要先做点什么呀?

  1. 这是读取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]])}
    
  2. STFT我在网上搜了,一头雾水,是要自己编一个吗?我在库里直接添加了stft,可以用吗?
    我总是用不对,不知道参数怎么填?

我的目的是:想问一下如何对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()

img

看起来mat存储的是序列化后的数据,所以直接打印不是很清晰。
处理的话,你需要了解mat里面到底存储了什么,即存储的数据是什么结构,才好作傅里叶变换处理。
https://blog.csdn.net/weixin_43093226/article/details/83929163

问一下给你文件的人,里面存储的数据格式和类型。

  • 取出mat中你需要的变量:
    sig=matdata['sig']
  • 关于stft,使用 tftb 时频分析工具箱中的stft即可,tftb有移植到python的包,github上搜一下。