【问题标题】:how to find out peak rise and decay如何找出峰值上升和衰减
【发布时间】:2021-02-27 13:55:37
【问题描述】:

我做了一些信号处理,我是新手。我正在使用 scipy.signal 进行计算。 我能够找到峰高、宽度,但我想知道我是否也能找到峰时间的上升和衰减时间。这将是从左侧宽度点到最高峰值点的距离,然后是从最高峰值点到右侧宽度点的距离。

所以,到目前为止我有这个,来自教程

import matplotlib.pyplot as plt
from scipy.misc import electrocardiogram
from scipy.signal import find_peaks
x = electrocardiogram()[2000:4000]
peaks, _ = find_peaks(x, height=0)
plt.plot(x)
plt.plot(peaks, x[peaks], "x")
plt.plot(np.zeros_like(x), "--", color="gray")
plt.show()

esults_full = peak_widths(x, peaks, rel_height=1)

我想我正在寻找第一时刻或导数

【问题讨论】:

  • 您希望以什么单位回答? scipy.misc.electrocardiogram 数据的单位是 mV vs 秒,采样率为 360 Hz。这意味着每个样本代表 (1/360) 秒。如果您知道峰值之前、峰值时和峰值之后的采样位置和电压电平,那么您就拥有了所需的一切。要获得时间,它只是样本数 * 1/360 秒。为了得到一阶导数,也就是变化率,它只是毫伏的变化除以时间的变化。

标签: scipy signal-processing


【解决方案1】:

这取决于信号的类型,特别是对于此信号,一种有效的方法是找到所有峰值,然后通过由突出范围中的中点定义的突出阈值过滤峰值。

p>

一旦我有了感兴趣的峰,我就会使用上一个和下一个峰的位置。

import numpy as np
import matplotlib.pyplot as plt
from scipy.misc import electrocardiogram
from scipy.signal import find_peaks, peak_prominences
x = electrocardiogram()[2000:3500]
#b, a = butter(4, 0.001, 'high')
#x = lfilter(b, a, x)
peaks, _ = find_peaks(x)
prominences, _, _ = peak_prominences(x, peaks)
selected = prominences > 0.5 * (np.min(prominences) + np.max(prominences))
left = peaks[:-1][selected[1:]]
right = peaks[1:][selected[:-1]]
top = peaks[selected]

plt.figure(figsize=(14, 4))
plt.plot(x)
plt.plot(top, x[top], "x")
plt.plot(left, x[left], ".", markersize=20)
plt.plot(right, x[right], ".", markersize=20)
plt.show()

如果您想使用高度阈值,删除低于信号频率的频率会很有趣。

from scipy.signal import butter, lfilter
x = electrocardiogram()
plt.figure(figsize=(14, 4))
b, a = butter(4, 0.01, 'high')
plt.plot(x[2000:10000])
x = lfilter(b, a, x)
plt.plot(x[2000:10000])
plt.legend(['original', 'highpass filtered'])

关于编码风格偏好,如果你来自 MATLAB,你可能已经习惯了全局范围内的一切,但我总是说模块是你的朋友 :)。我会简单地导入scipy.signal 而不是将它们的成员函数作为全局变量导入,您可以为模块使用一些别名,如import matplotlib.pyplot as plt,您可以找到每个模块使用的别名,但这更适用于程序员互操作性,不是强制性的,所以我按照你的风格编写了代码。

衍生物

你可以使用rise = (peaks[top] - peaks[left]) / (top - left)fall = (peaks[top] - peaks[right]) / (top - right),这不是导数的实际值,而是相关的特征特征。

如果你想找到最大值

【讨论】:

  • 谢谢,但我将如何计算峰值上升和衰减。或者换句话说,一阶矩或一阶导数或斜率。
  • 我正在寻找一个值来给出峰值的上升和下降,以便可以将其转换为特征。
  • 哇,现在我发现我对这篇文章的编辑不完整。有什么帮助吗,你还对这个感兴趣吗,如何让答案可以接受?
猜你喜欢
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多