python实现 stft_python scipy signal.stft用法及代码示例

计算短时傅立叶变换(STFT)。

STFT可用作量化非平稳信号的频率和相位含量随时间变化的一种方式。

参数:

x:array_like测量值的时间序列

fs:float, 可选参数x时间序列的采样频率。默认为1.0。

window:str 或 tuple 或 array_like, 可选参数希望使用的窗口。如果window是字符串或元组,则将其传递给get_window生成窗口值,默认情况下为DFT-even。参考get_window有关窗口和必需参数的列表。如果窗口是数组,它将直接用作窗口,并且其长度必须为nperseg。默认为Hann窗口。

nperseg:int, 可选参数每个段的长度。默认值为256。

noverlap:int, 可选参数段之间重叠的点数。如果没有,noverlap = nperseg // 2。默认为没有。指定后,必须满足COLA约束(请参阅下面的注释)。

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

detrend:str 或 function 或 False, 可选参数指定如何使每个段趋势消失。如果detrend是一个字符串,它将作为类型参数传递给detrend函数。如果它是一个函数,它将采用一个段并返回一个去趋势的段。如果detrend是假,不进行趋势消除。默认为假。

return_onesided:bool, 可选参数如果为True,则返回真实数据的one-sided频谱。如果为False,则返回two-sided频谱。默认为True,但是对于复杂数据,始终返回two-sided频谱。

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

padded:bool, 可选参数指定输入信号的末尾是否为zero-padded,以使信号完全适合整数个窗口段,以便所有信号都包含在输出中。默认为True。如果边界不为None,且边界为默认值,则填充为True,则边界扩展后将进行填充。

axis:int, 可选参数计算STFT的轴;默认值位于最后一个轴上(即axis=-1)。

返回值:

f:ndarray采样频率数组。

t:ndarray细分时间数组。

Zxx:ndarrayx的STFT。默认情况下,Zxx的最后一个轴对应于段时间。

注意:

为了能够通过反向STFT来反转STFTistft,则信号窗口必须遵守“Nonzero OverLap Add”(NOLA)的约束,并且输入信号必须具有完整的窗口覆盖范围(即(x.shape[axis] - nperseg) %

(nperseg-noverlap) == 0)。填充参数可用于完成此操作。

给定time-domain信号, 一个窗口和跳数= nperseg-noverlap,时间索引处的窗口帧是(谁)给的

overlap-add(OLA)重建方程由下式给出

NOLA约束确保出现在OLA重建方程的分母中的每个归一化项都不为零。可以使用以下方法来测试窗口,nperseg和noverlap的选择是否满足此约束:check_NOLA。

0.19.0版中的新函数。

参考文献:

1

Oppenheim,Alan V.,Ronald W. Schafer,John R. Buck“ Discrete-Time Signal Processing”,Prentice Hall,1999年。

2

丹尼尔·格里芬(Daniel W. Griffin),Jae S. Lim“来自修改后的Short-Time傅立叶变换的信号估计”,IEEE 1984,10.1109 /TASSP.1984.1164317

例子:

>>> from scipy import signal

>>> import matplotlib.pyplot as plt

生成一个测试信号,即一个2 Vrms正弦波,其频率在3kHz左右缓慢调制,并被以10 kHz采样的幅度呈 index 下降的白噪声破坏。

>>> fs = 10e3

>>> N = 1e5

>>> amp = 2 * np.sqrt(2)

>>> noise_power = 0.01 * fs / 2

>>> time = np.arange(N) / float(fs)

>>> mod = 500*np.cos(2*np.pi*0.25*time)

>>> carrier = amp * np.sin(2*np.pi*3e3*time + mod)

>>> noise = np.random.normal(scale=np.sqrt(noise_power),

... size=time.shape)

>>> noise *= np.exp(-time/5)

>>> x = carrier + noise

计算并绘制STFT的幅度。

>>> f, t, Zxx = signal.stft(x, fs, nperseg=1000)

>>> plt.pcolormesh(t, f, np.abs(Zxx), vmin=0, vmax=amp)

>>> plt.title('STFT Magnitude')

>>> plt.ylabel('Frequency [Hz]')

>>> plt.xlabel('Time [sec]')

>>> plt.show()

你可能感兴趣的:(python实现,stft)