我想知道Python中是否有函数envelope具有与此相同的结果
envelope
我已经在Python中尝试了一个envelope函数,但结果是这样的,它与我想要的不一致。
zed5wv101#
虽然你没有明确说明你使用的是什么功能,但看起来你使用的是两种不同的信封。你在matlab中调用envelope的方式,相关的描述是:[yupper,ylower] = envelope(x)返回输入序列x的上包络和下包络,作为其分析信号的幅值。x的分析信号是使用离散傅立叶变换(在hilbert中实现)找到的。该函数最初删除x的平均值,并在计算包络后将其加回。如果x是一个矩阵,则包络在x的每列上独立运行。基于这一点,我想你会在python中寻找一种获得Hilber变换的方法。可以在here中找到一个这样的例子:
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 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 = plt.figure() ax0 = fig.add_subplot(211) ax0.plot(t, signal, label='signal') ax0.plot(t, amplitude_envelope, label='envelope') ax0.set_xlabel("time in seconds") ax0.legend() ax1 = fig.add_subplot(212) ax1.plot(t[1:], instantaneous_frequency) ax1.set_xlabel("time in seconds") ax1.set_ylim(0.0, 120.0)
导致:
k75qkfdt2#
有时我会使用obspy.信号.过滤器.信封(data_array);但是在你给出的例子中你只能得到上面的线Obspy是一个非常有用的处理地震图的包。
2条答案
按热度按时间zed5wv101#
虽然你没有明确说明你使用的是什么功能,但看起来你使用的是两种不同的信封。
你在matlab中调用envelope的方式,相关的描述是:
[yupper,ylower] = envelope(x)返回输入序列x的上包络和下包络,作为其分析信号的幅值。x的分析信号是使用离散傅立叶变换(在hilbert中实现)找到的。该函数最初删除x的平均值,并在计算包络后将其加回。如果x是一个矩阵,则包络在x的每列上独立运行。
基于这一点,我想你会在python中寻找一种获得Hilber变换的方法。可以在here中找到一个这样的例子:
导致:
k75qkfdt2#
有时我会使用obspy.信号.过滤器.信封(data_array);但是在你给出的例子中你只能得到上面的线Obspy是一个非常有用的处理地震图的包。