scipy.signal.ShortTimeFFT.
from_dual#
- classmethod ShortTimeFFT.from_dual(dual_win, hop, fs, *, fft_mode='onesided', mfft=None, scale_to=None, phase_shift=0)[source]#
僅透過提供對偶視窗來實例化
ShortTimeFFT
。如果 STFT 是可逆的,則可以從給定的對偶視窗
dual_win
計算視窗win
。所有其他參數的含義與ShortTimeFFT
的初始設定式中相同。如 短時傅立葉變換 章節和 SciPy 使用者指南 中所解釋的,可逆 STFT 可以解釋為時間偏移和頻率調變的對偶視窗的級數展開。例如,級數係數 S[q,p] 屬於項,該項將
dual_win
位移 p *delta_t
,並將其乘以 exp( 2 * j * pi * t * q *delta_f
)。參見
from_window
透過包裝
get_window
建立實例。ShortTimeFFT
使用標準初始設定式建立實例。
範例
以下範例討論將訊號分解為時間和頻率偏移的高斯函數。將使用由 51 個樣本組成的標準差為 1 的高斯函數
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> from scipy.signal import ShortTimeFFT >>> from scipy.signal.windows import gaussian ... >>> T, N = 0.1, 51 >>> d_win = gaussian(N, std=1/T, sym=True) # symmetric Gaussian window >>> t = T * (np.arange(N) - N//2) ... >>> fg1, ax1 = plt.subplots() >>> ax1.set_title(r"Dual Window: Gaussian with $\sigma_t=1$") >>> ax1.set(xlabel=f"Time $t$ in seconds ({N} samples, $T={T}$ s)", ... xlim=(t[0], t[-1]), ylim=(0, 1.1*max(d_win))) >>> ax1.plot(t, d_win, 'C0-')
以下繪圖顯示重疊為 41、11 和 2 個樣本時,
hop
間隔如何影響視窗win
的形狀>>> fig2, axx = plt.subplots(3, 1, sharex='all') ... >>> axx[0].set_title(r"Windows for hop$\in\{10, 40, 49\}$") >>> for c_, h_ in enumerate([10, 40, 49]): ... SFT = ShortTimeFFT.from_dual(d_win, h_, 1/T) ... axx[c_].plot(t + h_ * T, SFT.win, 'k--', alpha=.3, label=None) ... axx[c_].plot(t - h_ * T, SFT.win, 'k:', alpha=.3, label=None) ... axx[c_].plot(t, SFT.win, f'C{c_+1}', ... label=r"$\Delta t=%0.1f\,$s" % SFT.delta_t) ... axx[c_].set_ylim(0, 1.1*max(SFT.win)) ... axx[c_].legend(loc='center') >>> axx[-1].set(xlabel=f"Time $t$ in seconds ({N} samples, $T={T}$ s)", ... xlim=(t[0], t[-1])) >>> plt.show()
除了中心位於 t = 0 的視窗
win
外,還描繪了先前的視窗 (t = -delta_t
) 和後續的視窗 (t =delta_t
)。可以看出,對於小的hop
間隔,視窗緊湊且平滑,在 STFT 中具有良好的時頻集中度。對於 4.9 秒的大hop
間隔,視窗在 t = 0 附近的值很小,相鄰視窗的重疊未涵蓋這些值,這可能導致數值不準確。此外,視窗開頭和結尾的峰值形狀指向更高的頻寬,導致 STFT 的時頻解析度較差。因此,hop
間隔的選擇將是在時頻解析度和小型hop
大小所需的記憶體需求之間取得折衷。