License

Copyright (c) 2017, Tom O'Haver
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the distribution

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

A set of fast customizable functions for locating and measuring the peaks in noisy time-series signals. Adjustable parameters allow discrimination of "real" signal peaks from noise and background. Determines the position, height, and width of each peak by least-squares curve-fitting. It can find and count over 10,000 peaks per second, and find and measure 1800 peaks per second, in very large signals. Includes two interactive versions, one with mouse-controlled sliders and one with keyboard control, for adjusting the peak finding criteria in real-time. Self-contained demos show how it works. See http://terpconnect.umd.edu/~toh/spectrum/PeakFindingandMeasurement.htm for details.

Black Hawk, sorry I didn't see this earlier; evidently I am no longer getting email notifications and I don't go on the Matlab site very often. I'll check the errors you got. Make sure you have the latest version - some debugging has already been done. Do the demos in the internal help file not work?

It appears like findpeaksb and findpeaksb3 have never been tested or debugged. That is extremely disappointing. There are just too many errors, and I tried debugging findpeaksb3 without success. Here are some basic examples for findpeaksb3:

- Line 164: why do you put "MeasuredError(peak)=Error" if Error is a 1x2 row vector? Or was it done on purpose..? That obviously gives the error message "In an assignment A(I) = B, the number of elements in B and I must be the same." So the line has to be modified to something like "MeasuredError(peak)=Error(1)", or "=Error(2)" depending on what you want.

- Lines 121, 236 and 151: why do you put "signal=[XXX',YYY']"? This makes a row vector of the independent variable concatenated with the dependent variable. Why didn't you simply choose "signal=[XXX,YYY]" so that signal is automatically a two-column matrix, 1st column=independent variable and 2nd column=dependent variable. That would also avoid the huge confusion when calling the peakfit function in which line 382 "if datasize(1)<datasize(2),signal=signal';end
" is not very useful...

- The cases when length(signal)=0 or 1 are not considered at all, yielding errors when these cases are encountered

Sorry for being very direct but I think the scripts should have been carefully tested and debugged prior to submission. It is very frustrating to spend time debugging from A to Z without success a code that one hasn't written.

There is a typo there on my part; the number should be 1.06447.... Here's why: The simplest expression for a Gaussian peak is y=exp(-x^2). This has a full-width at half maximum of 2 * sqrt(ln(2)=1.66561 and the area under the curve is sqrt(pi)= 1.77245. So the width/height ratio is 1.06447.... The peak area is proportional to both peak height and width. Therefore the area is 1.06447 * peak height * peak width. Hint: You can use Wolfram Alpha (http://www.wolframalpha.com) to do all the algebra for stuff like that.

Dear Tom,
Sorry about this really basic question, but could you please explain to me the reasoning behind calculating the area of the peak using 1.0646 * peak height * peak width? I'm not sure where the 1.0646 value comes from.

Iman, you can use File > Import Data to import data files in various format, including three sound formats (.au, .snd, and .wav). These is also a Data Acquisition Toolbox that I would assume has additional data import capabilities.

Dieter, I would be glad to add that if you could define quantitatively what you mean by peak start and end - for example, when the amplitude of the signal reaches 1% of the peak amplitude. Or would some other definition be more appropriate for your work?

Andre, iPeak reports only the position, height, and width of peak parameterized as Gaussians, not the parabolic results of polyfit. But you can generate the Gaussian model from height.*exp(-((x-position)./(0.6005615.*width)) .^2) and plot it over the raw data. iPeak does this automatically for the peaks detected in the upper window.

One quick question: I would like to overlay the fitted parabola onto the raw data that I used findpeaks on, for visualization purposes (and to show that the fits are reasonable).

I tried going into the function and doing polyval on the coefs that are returned by polyfit, but this doesn't produce anything sensible.

I would like the drawn parabola to have the same units as the original data. Perhaps I could re-create the parabola from the output of findpeaks (ie the width, height, mean, etc), but it seems that polyval and other parabola drawers parameterize the parabolas in other ways.

Use the "pan and zoom" capabilities of these programs to inspect the whole signal closely. If the signal has important features that cover a very wide amplitude range or are superimposed on a much larger baseline or background, then those features may not be visible when the entire signal is plotted normally. Try using a semilog(x,y) plot, or use iSignal's semilog mode (H key).

i have a .xls file, i saved data of that in a matrix like : r=xlsread(.xls)
now its needed to find peaks but this discrete data (r) is noisy data and using of 'findpeaks' command give me a lot of numbers of peaks (because of nois).
i think your code can help me. so, could you tell me how can i use this?
best regard

Latest version just uploaded corrects a bug in the FindPeakSlidersG script that caused a malfunction when individual peaks are viewed if the x-axis data series does not start with zero.

Christof Devriendt

21 Jun 2008

Just what I needed! Thank you very much!

Ralph Ernstorfer

28 Apr 2008

fast and reliable tool ... thanks for sharing!

Julius Kusuma

11 Jan 2008

Very useful interactive software! Thanks for sharing this.

Hugo Banziger

19 Nov 2007

Please gat back to me with your private phone number.

Regards,
Dr. Hugo.

Karan Jain

6 Nov 2007

This is a good algorithm but can it be changed to give peeks over a certain datum instead of the trough values.

Li XinBo

9 Sep 2007

Your algorithm is excellent.But I find a problem in it.
Your algorithm is limited only when the data are positive number.If all the data are negative and there is peak points.Your algorithm can't detect the peak points.
But I can translate the coordinate axis.
It is to make all the y data into positive number. Then using your algorithm we can find the peak points.
I think you can modify your algorithm and make it adapt to the situation that the data is all negative number.
If you can modify your algorithm,please send the message to my email.(lygwxr@yahoo.com.cn)
Thank your.
A student from BIT of China

Matthew Butcher

3 May 2007

You saved my MEng project with this one. I credited you thogh, don't worry.
Many thanks Tom,
Matt.

Tom Driscoll

12 Apr 2007

Perfect for scientific data processing. Good performance without being overly complicated. You just saved me a week of my time.

Dmitry Kazachk

20 Jan 2007

Would be greate if it will do deconvolution and gave the areas for deconvolved peaks.
In general - great tool!

BHARATH KUMAR

21 Dec 2006

Tom O'Haver

14 Oct 2006

K. Tampa is correct; extreme.m is the one to use if you want to find ALL the minima and maxima. But "Peak finding and measurement" is intended to distinguish real peaks from noise in experimentally measured signals and to measure their height, position, and width. Two completely different purposes.

mcs swamy

3 Oct 2006

K. Tampa

15 Sep 2006

Get EXTREME.M in this site and you'll find the ALL peaks (minima and maxima!) of
rand(10^6,1) in less than a second, 10^7 in about 10 sec, and from matrix too, so...

Tom O'Haver

24 Aug 2006

Version 1.2, dated August 24, 2006, is even faster than the previous version It can find and measure 1000 peaks in a 1,000,000 point signal in 13 seconds.

Frank Anold

20 Aug 2006

It is pretty good and easy to use. Yet some commercial software,such as origin, can do faster.

Updates

8 Feb 2017

4.0

Added several new functions including measurepeaks, autofindpeaks, and autopeaks plus test scripts for each.

4 May 2016

3.3

Bug fix

2 May 2016

3.2

Included version 7.7 of iPeak.

22 Apr 2016

3.1

Bug fix. Data vectors x and y can be either column or row vectors.

20 Apr 2016

3.0

Bug fixes and speed improvements.

24 Oct 2015

2.0

This version contains several small corrections, additions, and bug fixes.

24 Apr 2015

1.19

This version includes updated versions of several functions.

14 Nov 2013

1.18

This version includes updated versions of findpeaksfit.m and findpeaksb.m.

11 Jun 2013

1.17

This version includes findpeaksL.m for Lorentzian peaks, and findpeaksGSS.m and findpeaksLSS that compute the 1% start and end positions.

20 May 2013

1.16

This version includes new command-line functions findpeaksplot.m, findpeaksnr.m, and peakstats.m. plus version 5.3 of iPeak.

28 Dec 2012

1.14

Version 5 has faster jumps between peaks with spacebar and tab keys; other small bug fixes.

31 Aug 2012

1.13

This version includes some additional demos plus version 4 of the interactive iPeak function.

9 May 2012

1.11

Typo correction.

9 May 2012

1.10

This zip file includes version 3.9 of the interactive iPeak function.

28 Oct 2011

1.8

This version includes the findvalleys function and version 3.81 of the interactive iPeak function.

20 Sep 2011

1.5

Bug fix

12 Sep 2011

1.4

Includes the version 3.2 update of iPeak and version 4 of findpeaks.m, as well as the older 2008 version with sliders.