python - Python中的峰值检测算法
问题描述
我在 Python 中实现了一个峰值检测算法,它只检测那些高于阈值幅度的峰值。我不想使用内置功能,因为我还必须将此模拟扩展到硬件实现。
from math import sin,isnan
from pylab import *
def peakdet(v, delta,thresh,x):
delta=abs(delta)
maxtab = []
mintab = []
v = asarray(v)
mn, mx = v[0], v[0]
mnpos, mxpos = NaN, NaN
lookformax = True
for i in arange(len(v)):
this = v[i]
if abs(this)>thresh:
if this > mx:
mx = this
mxpos = x[i]
if this < mn:
mn = this
mnpos = x[i]
if lookformax:
if (this < mx-delta):
if (mx>abs(thresh)) and not isnan(mxpos):
maxtab.append((mxpos, mx))
mn = this
mnpos = x[i]
lookformax = False
else:
if (this > mn+delta):
if (mn<-abs(thresh)) and not isnan(mnpos):
mintab.append((mnpos, mn))
mx = this
mxpos = x[i]
lookformax = True
return array(maxtab), array(mintab)
#Input Signal
t=array(range(100))
series=0.3*sin(t)+0.7*cos(2*t)-0.5*sin(1.2*t)
thresh=0.95 #Threshold value
delta=0.0 #
a=zeros(len(t)) #
a[:]=thresh #
maxtab, mintab = peakdet(series,delta,thresh,t)
#Plotting output
scatter(array(maxtab)[:,0], array(maxtab)[:,1], color='red')
scatter(array(mintab)[:,0], array(mintab)[:,1], color='blue')
xlim([0,t[-1]])
title('Peak Detector')
grid(True)
plot(t,a,color='green',linestyle='--',dashes=(5,3))
plot(t,-a,color='green',linestyle='--',dashes=(5,3))
annotate('Threshold',xy=(t[-1],thresh),fontsize=9)
plot(t,series,'k')
show()
这个程序的问题是它无法检测到一些峰值,即使它们高于阈值。这是我得到的输出:
我看到其他有峰值检测问题的帖子,但找不到任何解决方案。请帮助并提出更正建议。
解决方案
解决方案find_peaks
fromscipy.signal
from scipy.signal import find_peaks
import numpy as np
import matplotlib.pyplot as plt
# Input signal
t = np.arange(100)
series = 0.3*np.sin(t)+0.7*np.cos(2*t)-0.5*np.sin(1.2*t)
# Threshold value (for height of peaks and valleys)
thresh = 0.95
# Find indices of peaks
peak_idx, _ = find_peaks(series, height=thresh)
# Find indices of valleys (from inverting the signal)
valley_idx, _ = find_peaks(-series, height=thresh)
# Plot signal
plt.plot(t, series)
# Plot threshold
plt.plot([min(t), max(t)], [thresh, thresh], '--')
plt.plot([min(t), max(t)], [-thresh, -thresh], '--')
# Plot peaks (red) and valleys (blue)
plt.plot(t[peak_idx], series[peak_idx], 'r.')
plt.plot(t[valley_idx], series[valley_idx], 'b.')
plt.show()
结果图如下所示。
请注意,它find_peaks
有一个参数height
,我们在这里称之为thresh
. 它还有一个名为 的参数threshold
,它正在做其他事情。
推荐阅读
- apache-kafka - 卡夫卡消费者群体滞后:整个案例问题的初始和低
- node.js - 传递数据以在快速车把中查看
- android - 如何在 EditText 中制作始终可见、可填充的提示?
- java - 将带有 JSch 的文件上传到 SFTP 服务器时如何保留修改时间
- networking - Calico:felix 如何更新主机上的 iptables 规则和 ip 路由?
- java - Java Azure SDK,com.microsoft.aad.adal4j.AcquireTokenCallable 类的执行失败
- python - 我通过 python 网络抓取获取空表数据
- c - 如何制作可以通过 cmd 访问并在 c 中获取参数的 print.exe
- javascript - 如何在 JavaScript 中动态地将图像添加到级联选择?
- python - 为什么 add_command 中的语句不能正常工作?