title: Detecting Peaks in a FFT Plot
body: <p>I was wondering how is it possible to detect new peaks within an FFT plot in Python.
  let's say i have this simple Plot:<a href="https://i.stack.imgur.com/V8d5V.png" rel="noreferrer"><img src="https://i.stack.imgur.com/V8d5V.png" alt="enter image description here"></a>
  And i want to automatically measure the 'Similarity' or the Peaks location within a noisy Signal, i have tried to use the cosine Similarity but my real Signal is way too noisy, and with even if i add a new peak to the signal, i keep getting a Cosine of 0.9 since it's only one peak.
  This is an example of my real signal, and i also have the problem that my signal can be shiffted within the measures, so i can't get a stable frequency array they can be within a window of +/- 100 Hz : 
  <a href="https://i.stack.imgur.com/lAucU.png" rel="noreferrer"><img src="https://i.stack.imgur.com/lAucU.png" alt="enter image description here"></a>
  This the code that used for the first Plot :</p>
  
  <pre><code>import numpy as np
  from pylab import *
  import scipy.fftpack
  
  # Number of samplepoints
  N = 600
  # sample spacing
  T = 1.0 / 800.0
  x = np.linspace(0.0, N*T, N)
  y1 = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)+ 0.7*np.sin(30.0 * 2.0*np.pi*x)+ 0.5*np.sin(10.0 * 2.0*np.pi*x)
  y2 = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)+ 0.2*np.sin(60.0 * 2.0*np.pi*x)+ 0.4*np.sin(40.0 * 2.0*np.pi*x)
  yf1 = scipy.fftpack.fft(y1)
  yf2 = scipy.fftpack.fft(y2)
  xf = np.linspace(0.0, 1.0/(2.0*T), N/2)
  
  fig, ax = plt.subplots()
  plot(xf, 2.0/N * np.abs(yf1[:N/2]))
  plot(xf, 2.0/N * np.abs(yf2[:N/2]))
  xlabel('Freq (Hz)',fontsize=16,weight='bold')
  ylabel('|Y(freq)|',fontsize=16,weight='bold')
  ax = gca()
  fontsize = 14
  for tick in ax.xaxis.get_major_ticks():
      tick.label1.set_fontsize(fontsize)
      tick.label1.set_fontweight('bold')
  for tick in ax.yaxis.get_major_ticks():
      tick.label1.set_fontsize(fontsize)
      tick.label1.set_fontweight('bold')
  grid(True)
  show()
  def cosine_similarity(v1,v2):
      "compute cosine similarity of v1 to v2: (v1 dot v2)/{||v1||*||v2||)"
      sumxx, sumxy, sumyy = 0, 0, 0
      for i in range(len(v1)):
          x = v1[i]; y = v2[i]
          sumxx += x*x
          sumyy += y*y
          sumxy += x*y
      return sumxy/math.sqrt(sumxx*sumyy)
  
  print 'Cosine Similarity', cosine_similarity(2.0/N * np.abs(yf1[:N/2]),2.0/N * np.abs(yf2[:N/2]))
  </code></pre>
  
  <p>I have also though of setting a threshold, but sometime the peaks within the real signal can be smaller than the pre-defined Threshold.
  Any ideas ?</p>