|
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() |
Thanks for sharing your script. This saves me a huge headache!
Justin