0

我正在尝试使用 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)

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

提前致谢。在此处输入图像描述

4

1 回答 1

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

这是脚本创建的情节: 在此处输入图像描述

于 2020-06-08T12:26:03.363 回答