I'm implementing a peak detection algorithm in Python that detects only those peaks that are above a threshold magnitude. I don't want to use the inbuilt function as I have to extend this simulation to Hardware implementation also.

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

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()

The problem with this program is that it is unable to detect some peaks even though they are above the threshold.

This is the output I got:

I saw other posts with peak detection problems but couldn't find any solution. Please help and suggest corrections.

解决方案

these code

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

mintab.append((mnpos, mn))

mx = this

mxpos = x[i]

lookformax = True

only run under the condition

if abs(this)>thresh:

so your can only find a peak when the next point above the thresh is smaller than it.

put it out the condition

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐