scipy.signal.stft¶
- scipy.signal.stft(x, fs=1.0, window='hann', nperseg=256, noverlap=None, nfft=None, detrend=False, return_onesided=True, boundary='zeros', padded=True, axis=- 1)[源代码]¶
计算短时傅立叶变换(STFT)。
短时傅立叶变换可以用来量化非平稳信号的频率和相位含量随时间的变化。
- 参数
- xarray_like
测量值的时间序列
- fs浮动,可选
的采样频率 x 时间序列。默认为1.0。
- window字符串或元组或array_like,可选
要使用的所需窗口。如果 window 是字符串或元组,则将其传递给
get_window
以生成窗口值,该窗口值是DFT-即使在默认情况下也是如此。看见get_window
有关窗口和所需参数的列表,请执行以下操作。如果 window is array_like它将直接用作窗口,其长度必须为nperseg。默认为Hann窗口。- nperseg整型,可选
每个线段的长度。默认为256。
- noverlap整型,可选
线段之间要重叠的点数。如果 None ,
noverlap = nperseg // 2
。默认为 None 。当指定时,必须满足可乐约束(参见下面的注释)。- nfft整型,可选
如果需要填充零的FFT,则使用的FFT长度。如果 None ,FFT长度为 nperseg 。默认为 None 。
- 下降趋势 :字符串或函数或 False ,可选字符串或函数或
指定如何对每段数据段进行趋势调整。如果
detrend
是字符串,则将其作为 type 参数设置为detrend
功能。如果它是一个函数,它接受一个段并返回一个去势的段。如果detrend
是 False ,没有进行去趋势性操作。默认为 False 。- return_onesided布尔值,可选
如果 True ,返回真实数据的单边频谱。如果 False 返回双面光谱。默认为 True ,但是对于复杂的数据,总是返回双面频谱。
- boundary字符串或无,可选
指定输入信号是否在两端延伸,以及如何生成新值,以便在第一个输入点上使第一个窗口线段居中。这具有当所采用的窗口函数从零点开始时能够重建第一输入点的好处。有效选项包括
['even', 'odd', 'constant', 'zeros', None]
。缺省为“零”,表示零填充扩展。也就是说。[1, 2, 3, 4]
扩展到[0, 1, 2, 3, 4, 0]
为nperseg=3
。- padded布尔值,可选
指定是否在末尾对输入信号进行补零,以使信号恰好适合整数个窗口段,以便所有信号都包含在输出中。默认为 True 。填充发生在边界延伸之后,如果 boundary 不是 None ,以及 padded 是 True ,这是默认设置。
- axis整型,可选
沿其计算STFT的轴;默认值在最后一个轴上(即
axis=-1
)。
- 退货
- fndarray
采样频率数组。
- tndarray
分段时间数组。
- Zxxndarray
的STFT x 。默认情况下,的最后一个轴 Zxx 对应于分段时间。
参见
istft
短时傅里叶逆变换
check_COLA
检查是否满足常量重叠添加(Cola)约束
check_NOLA
检查是否满足非零重叠添加(NOLA)约束
welch
功率谱密度按Welch方法计算。
spectrogram
语谱图采用Welch方法。
csd
互谱密度按Welch方法计算。
lombscargle
非均匀采样数据的Lomb-Scarger周期图
注意事项
为了能够通过中的逆STFT实现STFT的反转
istft
信号加窗必须遵守“非零重叠相加”(NOLA)的约束,并且输入信号必须具有完全的加窗覆盖(即,(x.shape[axis] - nperseg) % (nperseg-noverlap) == 0
)。这个 padded 可以使用参数来实现这一点。在给定时域信号的情况下 \(x[n]\) ,一扇窗户 \(w[n]\) 和跳跃大小 \(H\) = nperseg - noverlap ,时间索引处的窗口帧 \(t\) 由以下人员提供
\[x_{t}[n]=x[n]w[n-tH]\]重叠相加(OLA)重建方程由下式给出
\[X [n] =\frac{\sum_{t}x_{t} [n] W [n-tH] }{\sum_{t}w^{2} [n-tH] }\]NOLA约束确保出现在OLA重构方程的分母中的每个归一化项都是非零的。无论是选择 window , nperseg ,以及 noverlap 是否满足此约束可以使用以下命令进行测试
check_NOLA
。0.19.0 新版功能.
参考文献
- 1
奥本海姆,艾伦·V,罗纳德·W·谢弗,约翰·R·巴克,“离散时间信号处理”,普伦蒂斯·霍尔,1999。
- 2
丹尼尔·W·格里芬,Jae S.Lim“基于修正短时傅立叶变换的信号估计”,IEEE1984,10.1109/TASSP.1984.1164317
示例
>>> from scipy import signal >>> import matplotlib.pyplot as plt >>> rng = np.random.default_rng()
产生测试信号,2 Vrms正弦波,其频率在3 kHz左右缓慢调制,被以10 kHz采样的幅度指数递减的白噪声破坏。
>>> 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 = rng.normal(scale=np.sqrt(noise_power), ... size=time.shape) >>> noise *= np.exp(-time/5) >>> x = carrier + noise
计算并绘制短时傅立叶变换的震级。
>>> f, t, Zxx = signal.stft(x, fs, nperseg=1000) >>> plt.pcolormesh(t, f, np.abs(Zxx), vmin=0, vmax=amp, shading='gouraud') >>> plt.title('STFT Magnitude') >>> plt.ylabel('Frequency [Hz]') >>> plt.xlabel('Time [sec]') >>> plt.show()