scipy.signal.
hilbert#
- scipy.signal.hilbert(x, N=None, axis=-1)[源代码]#
使用希尔伯特变换计算解析信号。
默认情况下,沿着最后一个轴进行变换。
- 参数:
- xarray_like
信号数据。必须是实的。
- Nint,可选
傅里叶分量的数量。默认:
x.shape[axis]
- axisint,可选
执行变换的轴。默认:-1。
- 返回:
- xandarray
x 的解析信号,其中 axis 上的每一个一维数组
注释
信号
x(t)
的解析信号x_a(t)
为\[x_a = F^{-1}(F(x) 2U) = x + i y\]其中 F 是傅里叶变换,U 是单位阶跃函数,y 是 x 的希尔伯特变换。 [1]
换句话说,频率频谱的负半部分归零,将实值信号转变成复信号。希尔伯特变换的信号可以从
np.imag(hilbert(x))
中获取,原始信号则可以从np.real(hilbert(x))
中获取。参考文献
[1]维基百科,“解析信号”。 https://en.wikipedia.org/wiki/Analytic_signal
[2]Leon Cohen,“时频分析”,1995 年。第 2 章。
[3]Alan V. Oppenheim、Ronald W. Schafer。离散时间信号处理,第三版,2009 年。第 12 章。ISBN 13: 978-1292-02572-8
示例
在此示例中,我们使用希尔伯特变换来确定幅度包络和调幅信号的瞬时频率。
>>> 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()