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')[source]#

使用連續傅立葉轉換計算頻譜圖(傳統函式)。

頻譜圖可以用於視覺化非靜態訊號的頻率內容隨時間變化的方式。

傳統

此函式被視為傳統函式,將不再接收更新。雖然我們目前沒有移除它的計畫,但我們建議新程式碼改用更現代的替代方案。ShortTimeFFT 是一個更新的 STFT / ISTFT 實作,具有更多功能,也包含一個 spectrogram 方法。 比較兩種實作方式,請參閱 比較 短時傅立葉轉換 章節,位於 SciPy 使用者指南 中。

參數:
xarray_like

量測值的時間序列

fsfloat, optional

x 時間序列的取樣頻率。預設值為 1.0。

windowstr 或 tuple 或 array_like, optional

要使用的所需視窗。如果 window 是字串或 tuple,則會傳遞給 get_window 以產生視窗值,預設情況下視窗值為 DFT-even。 有關視窗和所需參數的列表,請參閱 get_window。如果 window 是 array_like,它將直接用作視窗,且其長度必須為 nperseg。預設值為 Tukey 視窗,形狀參數為 0.25。

npersegint, optional

每個區段的長度。預設值為 None,但如果 window 是 str 或 tuple,則設定為 256;如果 window 是 array_like,則設定為視窗的長度。

noverlapint, optional

區段之間重疊的點數。如果 None, noverlap = nperseg // 8。預設值為 None

nfftint, optional

使用的 FFT 長度,如果需要零填充 FFT。如果 None,則 FFT 長度為 nperseg。預設值為 None

detrendstr 或 function 或 False, optional

指定如何對每個區段進行去趨勢。如果 detrend 是字串,則會作為 type 引數傳遞給 detrend 函式。 如果它是一個函式,它會接收一個區段並傳回一個去趨勢的區段。如果 detrendFalse,則不進行去趨勢。預設值為 ‘constant’。

return_onesidedbool, optional

如果 True,則傳回實數資料的單邊頻譜。 如果 False,則傳回雙邊頻譜。預設值為 True,但對於複數資料,始終傳回雙邊頻譜。

scaling{ ‘density’, ‘spectrum’ }, optional

選擇計算功率頻譜密度(‘density’),其中 Sxx 的單位為 V**2/Hz;以及計算功率頻譜(‘spectrum’),其中 Sxx 的單位為 V**2(如果 x 以 V 為單位量測,且 fs 以 Hz 為單位量測)。預設值為 ‘density’。

axisint, optional

計算頻譜圖的軸;預設值為最後一個軸(即 axis=-1)。

modestr, optional

定義預期的傳回值類型。選項為 [‘psd’, ‘complex’, ‘magnitude’, ‘angle’, ‘phase’]。 ‘complex’ 等同於 stft 的輸出,沒有填充或邊界擴展。 ‘magnitude’ 傳回 STFT 的絕對值。 ‘angle’ 和 ‘phase’ 分別傳回 STFT 的複數角度,帶有和不帶有展開。

傳回值:
fndarray

取樣頻率陣列。

tndarray

區段時間陣列。

Sxxndarray

x 的頻譜圖。預設情況下,Sxx 的最後一個軸對應於區段時間。

另請參閱

periodogram

簡單、可選修改的週期圖

lombscargle

用於不均勻取樣資料的 Lomb-Scargle 週期圖

welch

Welch 方法的功率頻譜密度。

csd

Welch 方法的交叉頻譜密度。

ShortTimeFFT

更新的 STFT/ISTFT 實作,提供更多功能,其中也包含 spectrogram 方法。

註解

適當的重疊量將取決於視窗的選擇和您的需求。與 Welch 方法(整個資料流在其中進行平均)相比,當計算頻譜圖時,人們可能希望使用較小的重疊(或甚至完全沒有重疊),以保持各個區段之間的一些統計獨立性。 因此,預設視窗是 Tukey 視窗,在每個端點具有 1/8 視窗長度的重疊。

在 0.16.0 版本中新增。

參考文獻

[1]

Oppenheim, Alan V., Ronald W. Schafer, John R. Buck “離散時間訊號處理”, Prentice Hall, 1999.

範例

>>> import numpy as np
>>> from scipy import signal
>>> from scipy.fft import fftshift
>>> import matplotlib.pyplot as plt
>>> rng = np.random.default_rng()

產生一個測試訊號,一個 2 Vrms 正弦波,其頻率在 3kHz 附近緩慢調變,並受到指數遞減的白雜訊干擾,以 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()
../../_images/scipy-signal-spectrogram-1_00_00.png

請注意,如果使用非單邊輸出的話,請使用以下程式碼

>>> 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()
../../_images/scipy-signal-spectrogram-1_01_00.png