【问题标题】:Hillbert transform issue in scipyscipy中的希尔伯特变换问题
【发布时间】: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)

如果绘制信号和包络线,后者在开始和结束时都显示出相当高的值......见附图。有关如何解决此问题并获得更好信封的任何提示?

提前致谢。

【问题讨论】:

    标签: python scipy hilbert-curve


    【解决方案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。
    • 有道理。感谢您的及时回复,沃伦。最好的。
    猜你喜欢
    • 2019-10-16
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 2018-11-26
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多