scipy.signal.spectrogram¶
- scipy.signal.spectrogram(x, fs=1.0, window=('tukey', 0.25), nperseg=None, noverlap=None, nfft=None, detrend='constant', return_onesided=True, scaling='density', axis=- 1, mode='psd')[源代码]¶
用连续的傅立叶变换计算一个谱图。
频谱图可以用作可视化非平稳信号的频率含量随时间变化的一种方式。
- 参数
- xarray_like
测量值的时间序列
- fs浮动,可选
的采样频率 x 时间序列。默认为1.0。
- window字符串或元组或array_like,可选
要使用的所需窗口。如果 window 是字符串或元组,则将其传递给
get_window
以生成窗口值,该窗口值是DFT-即使在默认情况下也是如此。看见get_window
有关窗口和所需参数的列表,请执行以下操作。如果 window is array_like它将直接用作窗口,其长度必须为nperseg。默认为形状参数为0.25的Tukey窗口。- nperseg整型,可选
每个线段的长度。默认值为None,但如果Window为字符串或元组,则设置为256,如果Window为array_like,则设置为窗口长度。
- noverlap整型,可选
线段之间要重叠的点数。如果 None ,
noverlap = nperseg // 8
。默认为 None 。- nfft整型,可选
如果需要填充零的FFT,则使用的FFT长度。如果 None ,FFT长度为 nperseg 。默认为 None 。
- 下降趋势 :字符串或函数或 False ,可选字符串或函数或
指定如何对每段数据段进行趋势调整。如果
detrend
是字符串,则将其作为 type 参数设置为detrend
功能。如果它是一个函数,它接受一个段并返回一个去势的段。如果detrend
是 False ,没有进行去趋势性操作。默认值为“Constant”。- return_onesided布尔值,可选
如果 True ,返回真实数据的单边频谱。如果 False 返回双面光谱。默认为 True ,但是对于复杂的数据,总是返回双面频谱。
- scaling{‘密度’,‘光谱’},可选
在计算功率谱密度(‘密度’)之间进行选择,其中 Sxx 单位为V 2/Hz and computing the power spectrum ('spectrum') where `Sxx` has units of V 2,如果 x 是以V为单位测量的,并且 fs 是以赫兹为单位测量的。默认为“密度”。
- axis整型,可选
沿其计算频谱图的轴;默认值在最后一个轴上(即
axis=-1
)。- mode字符串,可选
定义预期的返回值类型。选项包括 [‘psd’,‘复数’,‘幅度’,‘角度’,‘相位’] 。“Complex”等同于的输出
stft
没有填充或边界延伸。“幅值”返回短时傅里叶变换的绝对幅值。“角度”和“相位”分别在展开和不展开的情况下返回短时傅里叶变换的复杂角度。
- 退货
- fndarray
采样频率数组。
- tndarray
分段时间数组。
- Sxxndarray
x的谱图。默认情况下,SXX的最后一个轴对应于分段时间。
参见
periodogram
简单的、可选修改的周期图
lombscargle
非均匀采样数据的Lomb-Scarger周期图
welch
功率谱密度按Welch方法计算。
csd
互谱密度按Welch方法计算。
注意事项
适当的重叠量将取决于窗口的选择和您的要求。与韦尔奇的方法不同,在韦尔奇的方法中,整个数据流被平均,当计算谱图时,人们可能希望使用较小的重叠(或者可能根本没有重叠),以保持各个片段之间的一些统计独立性。正是由于这个原因,默认窗口是每端重叠了1/8窗口长度的Tukey窗口。
0.16.0 新版功能.
参考文献
- 1
奥本海姆,艾伦·V,罗纳德·W·谢弗,约翰·R·巴克,“离散时间信号处理”,普伦蒂斯·霍尔,1999。
示例
>>> from scipy import signal >>> from scipy.fft import fftshift >>> 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, Sxx = signal.spectrogram(x, fs) >>> plt.pcolormesh(t, f, Sxx, shading='gouraud') >>> plt.ylabel('Frequency [Hz]') >>> plt.xlabel('Time [sec]') >>> plt.show()
请注意,如果使用的输出不是单面输出,请使用以下内容:
>>> f, t, Sxx = signal.spectrogram(x, fs, return_onesided=False) >>> plt.pcolormesh(t, fftshift(f), fftshift(Sxx, axes=0), shading='gouraud') >>> plt.ylabel('Frequency [Hz]') >>> plt.xlabel('Time [sec]') >>> plt.show()