title: Peak detection algorithm in Python
body: <p>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. </p>
  
  <pre><code>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)&gt;thresh:
              if this &gt; mx:
                  mx = this
                  mxpos = x[i]
              if this &lt; mn:
                  mn = this
                  mnpos = x[i]
              if lookformax:
                  if (this &lt; mx-delta):
                      if (mx&gt;abs(thresh)) and not isnan(mxpos):
                          maxtab.append((mxpos, mx))
                      mn = this
                      mnpos = x[i]
                      lookformax = False
              else:
                  if (this &gt; mn+delta):
                      if (mn&lt;-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()
  </code></pre>
  
  <p>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:</p>
  
  <p><img src="https://i.stack.imgur.com/WKEch.png" alt="Peak Detection Output"></p>
  
  <p>I saw other posts with peak detection problems but couldn't find any solution. Please help and suggest corrections.</p>