scipy 科学中的希尔伯特变换问题

x3naxklr  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(155)

我正在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)

如果一个人绘制信号和包络,后者显示相当高的值都在开始和结束...见附图。任何提示如何解决这个问题,并获得一个更好的包络?
提前感谢。

dwthyt8l

dwthyt8l1#

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()

以下是脚本创建的情节:

相关问题