hilbert#
- scipy.signal.hilbert(x, N=None, axis=-1)[原始碼]#
基於 FFT 的解析訊號計算。
解析訊號的計算方式為濾除負頻率,並將 FFT 域中正頻率的振幅加倍。結果的虛部是實值輸入訊號的希爾伯特轉換。
預設情況下,轉換沿著最後一個軸進行。
- 參數:
- xarray_like
訊號資料。必須為實數。
- Nint, optional
傅立葉分量的數量。預設值:
x.shape[axis]
- axisint, optional
執行轉換的軸。預設值: -1。
- 回傳:
- xandarray
x 的解析訊號,沿著 axis 的每個 1 維陣列
另請參閱
envelope
計算實值或複值訊號的包絡線。
註解
實值訊號
x(t)
的解析訊號x_a(t)
可以表示為 [1]\[x_a = F^{-1}(F(x) 2U) = x + i y\ ,\]其中 F 是傅立葉轉換,U 是單位步階函數,而 y 是 x 的希爾伯特轉換。[2]
換句話說,頻譜的負半部分被歸零,將實值訊號轉換為複值訊號。希爾伯特轉換訊號可以從
np.imag(hilbert(x))
獲得,而原始訊號可以從np.real(hilbert(x))
獲得。參考文獻
[1]Wikipedia, “解析訊號”。 https://en.wikipedia.org/wiki/Analytic_signal
[2]Wikipedia, “希爾伯特轉換”。 https://en.wikipedia.org/wiki/Hilbert_transform
[3]Leon Cohen, “時間-頻率分析”, 1995年。第 2 章。
[4]Alan V. Oppenheim, Ronald W. Schafer。離散時間訊號處理,第三版,2009年。第 12 章。ISBN 13: 978-1292-02572-8
範例
在這個範例中,我們使用希爾伯特轉換來確定調幅訊號的振幅包絡線和瞬時頻率。
讓我們建立一個頻率從 20 Hz 增加到 100 Hz 的 chirp 訊號,並應用調幅
>>> import numpy as np >>> import matplotlib.pyplot as plt >>> from scipy.signal import hilbert, chirp ... >>> duration, fs = 1, 400 # 1 s signal with sampling frequency of 400 Hz >>> t = np.arange(int(fs*duration)) / fs # timestamps of samples >>> signal = chirp(t, 20.0, t[-1], 100.0) >>> signal *= (1.0 + 0.5 * np.sin(2.0*np.pi*3.0*t) )
振幅包絡線由解析訊號的幅度給出。瞬時頻率可以通過對瞬時相位關於時間求微分來獲得。瞬時相位對應於解析訊號的相角。
>>> analytic_signal = hilbert(signal) >>> amplitude_envelope = np.abs(analytic_signal) >>> instantaneous_phase = np.unwrap(np.angle(analytic_signal)) >>> instantaneous_frequency = np.diff(instantaneous_phase) / (2.0*np.pi) * fs ... >>> fig, (ax0, ax1) = plt.subplots(nrows=2, sharex='all', tight_layout=True) >>> ax0.set_title("Amplitude-modulated Chirp Signal") >>> ax0.set_ylabel("Amplitude") >>> ax0.plot(t, signal, label='Signal') >>> ax0.plot(t, amplitude_envelope, label='Envelope') >>> ax0.legend() >>> ax1.set(xlabel="Time in seconds", ylabel="Phase in rad", ylim=(0, 120)) >>> ax1.plot(t[1:], instantaneous_frequency, 'C2-', label='Instantaneous Phase') >>> ax1.legend() >>> plt.show()