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

请问如何用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 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 Ubuntu开机显示器只显示kernel,是没操作系统(相关搜索:显卡驱动)
  • ¥15 VB.NET如何绘制倾斜的椭圆
  • ¥15 arbotix没有/cmd_vel话题
  • ¥20 找能定制Python脚本的
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀