當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy signal.hilbert用法及代碼示例


本文簡要介紹 python 語言中 scipy.signal.hilbert 的用法。

用法:

scipy.signal.hilbert(x, N=None, axis=-1)#

使用希爾伯特變換計算解析信號。

默認情況下,轉換沿最後一個軸完成。

參數

x array_like

信號數據。一定是真的。

N 整數,可選

傅裏葉分量的數量。默認值:x.shape[axis]

axis 整數,可選

沿其進行轉換的軸。默認值:-1。

返回

xa ndarray

沿軸的每個一維陣列的 x 的解析信號

注意

信號x(t)的解析信號x_a(t)為:

其中F是傅裏葉變換,U單位階躍函數,和y希爾伯特變換x.[1]

換句話說,頻譜的負半部分被歸零,將實值信號變為複信號。希爾伯特變換信號可以從 np.imag(hilbert(x)) 獲得,原始信號可以從 np.real(hilbert(x)) 獲得。

參考

[1]

維基百科,“Analytic signal”。 https://en.wikipedia.org/wiki/Analytic_signal

[2]

Leon Cohen,“Time-Frequency 分析”,1995 年。第 2 章。

[3]

艾倫·V·奧本海姆、羅納德·W·謝弗。 Discrete-Time 信號處理,第三版,2009 年。第 12 章。ISBN 13:978-1292-02572-8

例子

在本例中,我們使用希爾伯特變換來確定amplitude-modulated 信號的幅度包絡和瞬時頻率。

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy.signal import hilbert, chirp
>>> duration = 1.0
>>> fs = 400.0
>>> samples = int(fs*duration)
>>> t = np.arange(samples) / fs

我們創建一個頻率從 20 Hz 增加到 100 Hz 的啁啾,並應用幅度調製。

>>> 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)
>>> ax0.plot(t, signal, label='signal')
>>> ax0.plot(t, amplitude_envelope, label='envelope')
>>> ax0.set_xlabel("time in seconds")
>>> ax0.legend()
>>> ax1.plot(t[1:], instantaneous_frequency)
>>> ax1.set_xlabel("time in seconds")
>>> ax1.set_ylim(0.0, 120.0)
>>> fig.tight_layout()
scipy-signal-hilbert-1.png

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.signal.hilbert。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。