PICKPEAKS is similar to MATLAB's FINDPEAKS; it returns local peaks and their indices for the input X. The main differences are that PICKPEAKS
- is faster (much faster for large vectors),
- allows X to be a 2D matrix (not just a vector) and the user can specify across which dimension to look for peaks.
- picks either peaks or troughs.
- does not provide the FINDPEAKS option ‘THRESHOLD’.
- does not provide the FINDPEAKS’ options: ‘MINPEAKHEIGHT’, ‘NPEAKS’, ‘SORTSTR’. Those can be achieved easily by manipulating the output. E.g. if Vo, Io are the output of PICKPEAKS, the following will yield the same result as setting ‘MINPEAKHEIGHT’ to 0.5:
i = find(Vo<0.5);
Vo(i) = ;
Io(i) = ;
The syntax is
[Vo,Io] = PICKPEAKS(X,npts,dim,mode);
Examples of usage are:
[Vo,Io] = PICKPEAKS(X);
[Vo,Io] = PICKPEAKS(X,,,’troughs’);
[Vo,Io] = PICKPEAKS(X,10,,’troughs’); % require at least 10 samples distance between troughs.
[Vo,Io] = PICKPEAKS(X,,2); % search for peaks across rows
The screenshot was generated by
x = randn(200,1);
tic, [val,ind] = pickpeaks(x,10); toc
tic, [pks,loc] = findpeaks(x,'minpeakdistance',10); toc
figure, plot(x), hold all, plot(ind,val,'ro', loc,pks,'k+', 'MarkerSize',10), legend('x','pickpeaks','findpeaks')
Notice another difference between FINDPEAKS and PICKPEAKS: FINDPEAKS does not qualify some peaks (e.g. 3 peaks around sample 50) because there are other peaks in their vicinity, which did not qualify either. PICKPEAKS will pick those as well.