scipy 如何获取和绘制信号包络

l5tcr1uw  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(279)

我想知道Python中是否有函数envelope具有与此相同的结果

我已经在Python中尝试了一个envelope函数,但结果是这样的,它与我想要的不一致。

zed5wv10

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)

导致:

k75qkfdt

k75qkfdt2#

有时我会使用obspy.信号.过滤器.信封(data_array);但是在你给出的例子中你只能得到上面的线Obspy是一个非常有用的处理地震图的包。

相关问题