张乐桐 2022-07-27 22:51 采纳率: 100%
浏览 91
已结题

请问如何用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文件进行处理,真的是束手无策啊?

  • 写回答

3条回答 默认 最新

  • 似水不惧 2022-07-28 10:04
    关注
    
    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月5日
  • 已采纳回答 7月28日
  • 创建了问题 7月27日

悬赏问题

  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计