本文簡要介紹 python 語言中 scipy.signal.ShortTimeFFT.spectrogram
的用法。
用法:
ShortTimeFFT.spectrogram(x, y=None, detr=None, *, p0=None, p1=None, k_offset=0, padding='zeros', axis=-1)#
計算頻譜圖或cross-spectrogram。
頻譜圖是 STFT 的絕對平方,即
abs(S[q,p])**2
對於給定的S[q,p]
因此總是非負的。對於兩個 STFTSx[q,p], Sy[q,p]
,cross-spectrogram 定義為Sx[q,p] * np.conj(Sx[q,p])
是complex-valued。這是一個方便調用的函數stft
/stft_detrend
,因此所有參數都在那裏討論。如果y不是None
它需要具有相同的形狀x.例子:
以下示例顯示了以 20 Hz 采樣的不同頻率的方波頻譜圖 (在圖中用綠色虛線標記):
>>> import matplotlib.pyplot as plt >>> import numpy as np >>> from scipy.signal import square, ShortTimeFFT >>> from scipy.signal.windows import gaussian ... >>> T_x, N = 1 / 20, 1000 # 20 Hz sampling rate for 50 s signal >>> t_x = np.arange(N) * T_x # time indexes for signal >>> f_i = 5e-3*(t_x - t_x[N // 3])**2 + 1 # varying frequency >>> x = square(2*np.pi*np.cumsum(f_i)*T_x) # the signal
使用的高斯窗口有 50 個樣本或 2.5 秒長。選擇參數
mfft=800
(過采樣因子 16)和ShortTimeFFT
中的hop
間隔 2,以產生足夠數量的點:>>> g_std = 12 # standard deviation for Gaussian window in samples >>> win = gaussian(50, std=g_std, sym=True) # symmetric Gaussian wind. >>> SFT = ShortTimeFFT(win, hop=2, fs=1/T_x, mfft=800, scale_to='psd') >>> Sx2 = SFT.spectrogram(x) # calculate absolute square of STFT
該圖的顏色圖按對數縮放,功率譜密度以 dB 為單位。信號 x 的時間範圍由垂直虛線標記,陰影區域標記邊界效應的存在:
>>> fig1, ax1 = plt.subplots(figsize=(6., 4.)) # enlarge plot a bit >>> t_lo, t_hi = SFT.extent(N)[:2] # time range of plot >>> ax1.set_title(rf"Spectrogram ({SFT.m_num*SFT.T:g}$\,s$ Gaussian " + ... rf"window, $\sigma_t={g_std*SFT.T:g}\,$s)") >>> ax1.set(xlabel=f"Time $t$ in seconds ({SFT.p_num(N)} slices, " + ... rf"$\Delta t = {SFT.delta_t:g}\,$s)", ... ylabel=f"Freq. $f$ in Hz ({SFT.f_pts} bins, " + ... rf"$\Delta f = {SFT.delta_f:g}\,$Hz)", ... xlim=(t_lo, t_hi)) >>> Sx_dB = 10 * np.log10(np.fmax(Sx2, 1e-4)) # limit range to -40 dB >>> im1 = ax1.imshow(Sx_dB, origin='lower', aspect='auto', ... extent=SFT.extent(N), cmap='magma') >>> ax1.plot(t_x, f_i, 'g--', alpha=.5, label='$f_i(t)$') >>> fig1.colorbar(im1, label='Power Spectral Density ' + ... r"$20\,\log_{10}|S_x(t, f)|$ in dB") ... >>> # Shade areas where window slices stick out to the side: >>> for t0_, t1_ in [(t_lo, SFT.lower_border_end[0] * SFT.T), ... (SFT.upper_border_begin(N)[0] * SFT.T, t_hi)]: ... ax1.axvspan(t0_, t1_, color='w', linewidth=0, alpha=.3) >>> for t_ in [0, N * SFT.T]: # mark signal borders with vertical line ... ax1.axvline(t_, color='c', linestyle='--', alpha=0.5) >>> ax1.legend() >>> fig1.tight_layout() >>> plt.show()
對數縮放揭示了方波的奇次諧波,這些諧波在 10 Hz 的奈奎斯特頻率處反映出來。這種混疊也是圖中噪聲偽影的主要來源。
相關用法
- Python SciPy ShortTimeFFT.from_dual用法及代碼示例
- Python SciPy ShortTimeFFT.from_window用法及代碼示例
- Python SciPy ShortTimeFFT.istft用法及代碼示例
- Python SciPy SmoothSphereBivariateSpline.ev用法及代碼示例
- Python SciPy SuperLU.perm_c用法及代碼示例
- Python SciPy SmoothBivariateSpline.__call__用法及代碼示例
- Python SciPy SuperLU.solve用法及代碼示例
- Python SciPy SuperLU.perm_r用法及代碼示例
- Python SciPy SmoothBivariateSpline.ev用法及代碼示例
- Python SciPy SmoothSphereBivariateSpline.__call__用法及代碼示例
- Python SciPy interpolate.make_interp_spline用法及代碼示例
- Python SciPy stats.anderson用法及代碼示例
- Python SciPy ClusterNode.pre_order用法及代碼示例
- Python SciPy stats.iqr用法及代碼示例
- Python SciPy FortranFile.read_record用法及代碼示例
- Python SciPy ndimage.correlate用法及代碼示例
- Python SciPy special.exp1用法及代碼示例
- Python SciPy special.expn用法及代碼示例
- Python SciPy signal.czt_points用法及代碼示例
- Python SciPy interpolate.krogh_interpolate用法及代碼示例
- Python SciPy ndimage.morphological_gradient用法及代碼示例
- Python SciPy distance.sokalmichener用法及代碼示例
- Python SciPy linalg.eigvalsh_tridiagonal用法及代碼示例
- Python SciPy linalg.cdf2rdf用法及代碼示例
- Python SciPy csc_array.diagonal用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.signal.ShortTimeFFT.spectrogram。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。