Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Peak detection in Python [Eli Billauer]
function [maxtab, mintab]=peakdet(v, delta, x)
%PEAKDET Detect peaks in a vector
% [MAXTAB, MINTAB] = PEAKDET(V, DELTA) finds the local
% maxima and minima ("peaks") in the vector V.
% MAXTAB and MINTAB consists of two columns. Column 1
% contains indices in V, and column 2 the found values.
%
% With [MAXTAB, MINTAB] = PEAKDET(V, DELTA, X) the indices
% in MAXTAB and MINTAB are replaced with the corresponding
% X-values.
%
% A point is considered a maximum peak if it has the maximal
% value, and was preceded (to the left) by a value lower by
% DELTA.
% Eli Billauer, 3.4.05 (Explicitly not copyrighted).
% This function is released to the public domain; Any use is allowed.
maxtab = [];
mintab = [];
v = v(:); % Just in case this wasn't a proper vector
if nargin < 3
x = (1:length(v))';
else
x = x(:);
if length(v)~= length(x)
error('Input vectors v and x must have same length');
end
end
if (length(delta(:)))>1
error('Input argument DELTA must be a scalar');
end
if delta <= 0
error('Input argument DELTA must be positive');
end
mn = Inf; mx = -Inf;
mnpos = NaN; mxpos = NaN;
lookformax = 1;
for i=1:length(v)
this = v(i);
if this > mx, mx = this; mxpos = x(i); end
if this < mn, mn = this; mnpos = x(i); end
if lookformax
if this < mx-delta
maxtab = [maxtab ; mxpos mx];
mn = this; mnpos = x(i);
lookformax = 0;
end
else
if this > mn+delta
mintab = [mintab ; mnpos mn];
mx = this; mxpos = x(i);
lookformax = 1;
end
end
end
import sys
from numpy import NaN, Inf, arange, isscalar, asarray, array
def peakdet(v, delta, x = None):
"""
Converted from MATLAB script at http://billauer.co.il/peakdet.html
Returns two arrays
function [maxtab, mintab]=peakdet(v, delta, x)
%PEAKDET Detect peaks in a vector
% [MAXTAB, MINTAB] = PEAKDET(V, DELTA) finds the local
% maxima and minima ("peaks") in the vector V.
% MAXTAB and MINTAB consists of two columns. Column 1
% contains indices in V, and column 2 the found values.
%
% With [MAXTAB, MINTAB] = PEAKDET(V, DELTA, X) the indices
% in MAXTAB and MINTAB are replaced with the corresponding
% X-values.
%
% A point is considered a maximum peak if it has the maximal
% value, and was preceded (to the left) by a value lower by
% DELTA.
% Eli Billauer, 3.4.05 (Explicitly not copyrighted).
% This function is released to the public domain; Any use is allowed.
"""
maxtab = []
mintab = []
if x is None:
x = arange(len(v))
v = asarray(v)
if len(v) != len(x):
sys.exit('Input vectors v and x must have same length')
if not isscalar(delta):
sys.exit('Input argument delta must be a scalar')
if delta <= 0:
sys.exit('Input argument delta must be positive')
mn, mx = Inf, -Inf
mnpos, mxpos = NaN, NaN
lookformax = True
for i in arange(len(v)):
this = v[i]
if this > mx:
mx = this
mxpos = x[i]
if this < mn:
mn = this
mnpos = x[i]
if lookformax:
if this < mx-delta:
maxtab.append((mxpos, mx))
mn = this
mnpos = x[i]
lookformax = False
else:
if this > mn+delta:
mintab.append((mnpos, mn))
mx = this
mxpos = x[i]
lookformax = True
return array(maxtab), array(mintab)
if __name__=="__main__":
from matplotlib.pyplot import plot, scatter, show
series = [0,0,0,2,0,0,0,-2,0,0,0,2,0,0,0,-2,0]
maxtab, mintab = peakdet(series,.3)
plot(series)
scatter(array(maxtab)[:,0], array(maxtab)[:,1], color='blue')
scatter(array(mintab)[:,0], array(mintab)[:,1], color='red')
show()
@golobor
Copy link

golobor commented Jul 1, 2016

thanks for the code!

@algerianmaster
Copy link

algerianmaster commented Aug 3, 2016

please how to use this with PyOpenCl ?

@mpiannucci
Copy link

mpiannucci commented Sep 20, 2016

Here is a go version I converted https://github.com/mpiannucci/peakdetect

@Rishie13
Copy link

Rishie13 commented Dec 3, 2016

Is there a way I can preprocess csv files and show output for accelerometer?

@atikalidyad
Copy link

atikalidyad commented May 23, 2017

can i implement it in GNURadio? Thank you very much

@JorgeHormaza
Copy link

JorgeHormaza commented Dec 4, 2017

Mate, I just want to say Thank you so much because you save my life with this script.

@PZiso
Copy link

PZiso commented Mar 29, 2018

Great coding ! Thanks a lot!

@LuisAli22
Copy link

LuisAli22 commented Jun 20, 2018

Thank you so much

@15738897318
Copy link

15738897318 commented Oct 7, 2018

有关峰值点检测的研究促进这一领域的快速发展,我希望有志之士团结合作共同推进,同时我正在做峰值检测的学术课题,希望与有意者交流探讨,联系方式:m15738897318@gail.com,谢谢

@primehaxor
Copy link

primehaxor commented Nov 17, 2018

Thank you for this snippet, it works perfectly in my implementation.

@cgi1
Copy link

cgi1 commented Feb 4, 2020

Thanks man!

@TravisH0301
Copy link

TravisH0301 commented Mar 10, 2021

Thanks for sharing your code! It works very well for my project.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment