Python中scipy.signal.stft函数详解

此博客不介绍Python函数的理论知识和算法具体实现,只讲解函数的使用方法,函数输入和输出及相关函数参数,需要看相关原理的看下其他博客(时间充足的话,建议看相关书籍,系统学习)

scipy.signal.stft函数官方文档:https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.stft.html
窗函数类型(scipy.signal.get_window)官方文档:https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.get_window.html

1. 理论简介

  短时傅里叶变换(STFT)解决了快速傅里叶变换(FFT)的缺点,在得到信号频域信息的基础上也保留了时域信息。具体实现是通过添加窗函数(窗函数的长度是固定的),时域信号加窗将原始时域信号分割为多个片段,对每一个片段进行FFT,得到时频谱。

2. Python函数

scipy.signal.stft(x,fs = 1.0,window =‘hann’,nperseg = 256,noverlap = None,nfft = None,detrend = False,return_oneside = True,boundary =‘zeros’,padded = True,axis = -1 )

2.1 输入参数

x: STFT变换的时域信号
fs: 时域信号的采样频率
window: 时域信号分割需要的窗函数,可以自定义窗函数(但是这个方面没有尝试,需要自定义的话请自己尝试)
nperseg: 窗函数长度
noverlap: 窗函数重叠数,默认为50%。
nfft: FFT的长度,默认为nperseg。如大于nperseg会自动进行零填充
return_oneside : True返回复数实部,None返回复数。
剩下的参数一般不会涉及,采用默认的参数。

2.2 返回参数

f, t, Zxx = scipy.signal.stft(x,fs = 1.0,window ='hann',
							nperseg = 256,noverlap = None,nfft = None,
							detrend = False,return_oneside = True,boundary ='zeros',padded = True,axis = -1

f: 频率
t: 时间
Zxx: STFT时频数据

2.3 使用方法

f, t, Zxx = signal.stft(data, fs=framerate, nperseg=nperseg,
                            window=window, nfft=nfft, return_onesided=False)

  data为输入的时域数据,fs为采样频谱,nperseg为窗函数长度, window表示窗函数类型,nfft为FFT采样点数(建议使用None),return_onesided表示返回复数。返回f、t较为容易理解,Zxx返回的是二维数组,每一列数据某一时间段的频谱,每一行表示某一频率的不同时间的复数。

  在使用过程中,只需注意x,fs、window、nperseg、nfft、return_onesided几个参数就可以。x、fs、return_onesided较为容易理解,window的字符串较为难,在stft函数中会自动执行win = get_window(window, nperseg)这一指令,故想要使用不同窗函数的话直接更改为不同字符串就可以(窗函数类型),常见的窗函数有boxcar、triang、blackman、hamming等,直接输入字符串就可以选择不同的窗函数,窗函数的时域、频域形状在上边的网站可以看到。nperseg参数的值需要根据具体情况判断,可以通过循环来查看不同值的效果。

你可能感兴趣的:(Python,API详解,stft,python)