scipy.signal.

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 是單位步階函數,而 yx 的希爾伯特轉換。[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()
../../_images/scipy-signal-hilbert-1.png