scipy.signal.hilbert¶
- scipy.signal.hilbert(x, N=None, axis=- 1)[源代码]¶
使用希尔伯特变换计算解析信号。
默认情况下,变换沿最后一个轴完成。
- 参数
- xarray_like
信号数据。一定是真的。
- N整型,可选
傅立叶分量的数量。默认值:
x.shape[axis]
- axis整型,可选
要沿其执行变换的轴。默认值:-1。
- 退货
- xandarray
的解析信号 x ,每个一维阵列的 axis
注意事项
解析信号
x_a(t)
信号的数量x(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
里昂·科恩,“时频分析”,1995。第二章。
- 3
书名/作者Alan V.Oppenheim,Ronald W.Schafer。离散时间信号处理,第三版,2009。第12章,ISBN13:978129212818
示例
在这个例子中,我们使用希尔伯特变换来确定幅度调制信号的幅度包络和瞬时频率。
>>> 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()