如何找出峰值上升和衰减
how to find out peak rise and decay
我正在做一些信号处理,我是新手。我正在使用 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)
我想我是在寻找第一个时刻或导数
这取决于信号的类型,特别是对于此信号,一种有效的方法是找到所有峰值,然后通过由突出范围中点定义的突出阈值过滤峰值。
一旦我有了感兴趣的峰,我就使用了前一个和下一个峰的位置。
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)
,这不是衍生品的实际价值,而是相关的features特征。
另外如果你想找到最大 de
我正在做一些信号处理,我是新手。我正在使用 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)
我想我是在寻找第一个时刻或导数
这取决于信号的类型,特别是对于此信号,一种有效的方法是找到所有峰值,然后通过由突出范围中点定义的突出阈值过滤峰值。
一旦我有了感兴趣的峰,我就使用了前一个和下一个峰的位置。
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)
,这不是衍生品的实际价值,而是相关的features特征。
另外如果你想找到最大 de