用python实现短时傅里叶变换(STFT)完整代码版

 此程序为本人自学所用,是为了方便自己平时所用而准备的,分享给大家

短时傅里叶变换(STFT)又称加窗傅里叶变换,是对信号划分为多个窗口,在对窗口内的局部信号进行傅里叶变换,因此短时傅里叶变换可以得到每个频率出现的时域信息,即通过短时傅里叶变换可以同时得到时频信息。但STFT的问题是不确定窗口大小问题,如果窗口太大,将会导致时域信息不精确,频域信息分辨率高;如果窗口太小(窄),会导致频域分辨率低(不精确)。此外需要注意,STFT的窗口是固定不变的

import scipy.signal as signal
import numpy as np
import matplotlib.pyplot as plt



fs=1024 #采样频率
data=[]  #一维数据

f, t, nd = signal.stft(data,fs=fs,window='hann',nperseg=256,noverlap=None,nfft=None,
                       detrend=False,return_onesided=True,boundary='zeros',padded=True,axis=-1)
#  fs:时间序列的采样频率,  nperseg:每个段的长度,默认为256(2^n)   noverlap:段之间重叠的点数。如果没有则noverlap=nperseg/2

#window : 字符串或元祖或数组,可选需要使用的窗。
# #如果window是一个字符串或元组,则传递给它window是数组类型,直接以其为窗,其长度必须是nperseg。
# 常用的窗函数有boxcar,triang,hamming, hann等,默认为Hann窗。

#nfft : int,可选。如果需要零填充FFT,则为使用FFT的长度。如果为 None,则FFT长度为nperseg。默认为无

# detrend : str或function或False,可选
# 指定如何去除每个段的趋势。如果类型参数传递给False,则不进行去除趋势。默认为False。

# return_onesided : bool,可选
# 如果为True,则返回实际数据的单侧频谱。如果 False返回双侧频谱。默认为 True。请注意,对于复杂数据,始终返回双侧频谱。

# boundary : str或None,可选
# 指定输入信号是否在两端扩展,以及如何生成新值,以使第一个窗口段在第一个输入点上居中。
# 这具有当所采用的窗函数从零开始时能够重建第一输入点的益处。
# 有效选项是['even', 'odd', 'constant', 'zeros', None].
# 默认为‘zeros’,对于补零操作[1, 2, 3, 4]变成[0, 1, 2, 3, 4, 0] 当nperseg=3.

# 填充: bool,可选
# 指定输入信号在末尾是否填充零以使信号精确地拟合为整数个窗口段,以便所有信号都包含在输出中。默认为True。
# 填充发生在边界扩展之后,如果边界不是None,则填充为True,默认情况下也是如此。

# axis : int,可选
# 计算STFT的轴; 默认值超过最后一个轴(即axis=-1)。

plt.pcolormesh(t, f, np.abs(nd), vmin = 0, vmax = 4)
plt.title('STFT')
plt.ylabel('frequency')
plt.xlabel('time')
plt.show()

  • 6
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值