scipy中的希尔伯特变换问题
Posted
技术标签:
【中文标题】scipy中的希尔伯特变换问题【英文标题】:Hillbert transform issue in scipy 【发布时间】:2020-09-27 08:42:46 【问题描述】:我正在尝试使用 Scipy 中的希尔伯特变换来计算信号的包络。 这是代码,
import numpy as np
from scipy.signal import hilbert
A=2
lamb=20
w=2*np.pi*100
signal = A**(-lamb*t)*(np.sin(w*t+5)+np.cos(w*t+5))
analytic_signal = hilbert(signal)
amplitude_envelope = np.abs(analytic_signal)
如果绘制信号和包络线,后者在开始和结束时都显示出相当高的值......见附图。有关如何解决此问题并获得更好信封的任何提示?
提前致谢。
【问题讨论】:
【参考方案1】:hilbert
的一个基本假设是输入信号是周期性的。如果您将信号扩展为周期性的,那么在 t=1 时,从长而平的尾部到信号初始突发的重复会有一个很大的跳跃。
处理此问题的一种方法是将hilbert
应用于信号的偶数扩展,例如将信号与自身的反向副本连接起来,例如np.concatenate((signal[::-1], signal))
。这是执行此操作的脚本的修改版本:
import numpy as np
from scipy.signal import hilbert
import matplotlib.pyplot as plt
A = 2
lamb = 20
w = 2*np.pi*100
fs = 8000
T = 1.0
t = np.arange(int(fs*T)) / fs
signal = A**(-lamb*t)*(np.sin(w*t+5)+np.cos(w*t+5))
# Make an even extension of `signal`.
signal2 = np.concatenate((signal[::-1], signal))
analytic_signal2 = hilbert(signal2)
# Get the amplitude of the second half of analytic_signal2
amplitude_envelope = np.abs(analytic_signal2[len(t):])
plt.plot(t, signal, label='signal')
plt.plot(t, amplitude_envelope, label='envelope')
plt.xlabel('t')
plt.legend(framealpha=1, shadow=True)
plt.grid()
plt.show()
这是脚本创建的情节:
【讨论】:
谢谢,沃伦。有趣的。如果说 fs=200,那么即使使用这种技术也会出现同样的问题。我读到过这是所谓的吉布斯效应,但我忽略了这是否是正确的说法。您对如何以更一般的方式规避这一点有任何线索吗?感谢您的回复。 采样率 fs=200 对于您示例中的信号来说太低了。 fs=200 时,结果将显示aliasing。信号的振荡部分的频率为 100,fs=200 正是频率为 100 的纯正弦信号的Nyquist rate,但您的信号不是纯正弦振荡。它具有指数衰减,因此其光谱含量将超过 100。 有道理。感谢您的及时回复,沃伦。最好的。以上是关于scipy中的希尔伯特变换问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 Apple Accelerate 框架的希尔伯特变换(分析信号)?