MATLAB Answers

Sort of peak analysis

19 views (last 30 days)
Diego R
Diego R on 6 Sep 2019
Commented: darova on 8 Sep 2019
I'd like to analyze this graph (is a vector) to have an answer like this:
for 1 to number of peaks:
PEAK_1=[start of peak_1, finish of peak_1, maximum, area under peak_1]
PEAK_2=[start of peak_2, finish of peak_2, maximum, area under peak_2]
...
...
PEAK_N=[start of peak_N, finish of peak_N, maximum, area under peak_N]
I am planning to do a "for" loop checking each value and its predecesor to determine when does a peak start and finish and a while to take the actions. My question is, is there any easier way to determine when does each peak star and finish?
Also, if anybody has any imaginative way better than mine it will be welcome.

  5 Comments

Show 2 older comments
dpb
dpb on 7 Sep 2019
Then look for the first zero either side of each peak returned by findpeaks -- or, use the width from findpeaks with one side with the threshold level at zero.
Alternatively, if the signal is noise-free as appears (but, of course, the scaling is such small deviations may not be apparent in the graph) find where diff() is +/- and the first/second element is zero. Converting the signal to sign() could help.
Image Analyst
Image Analyst on 8 Sep 2019
Diego, are you not seeing all the answers below, in the official "Answers" section rather than up here in the Comments section? If you need more help, then attach your signal in a .mat file with the paper clip icon.
darova
darova on 8 Sep 2019
i agree

Sign in to comment.

Accepted Answer

darova
darova on 7 Sep 2019
How i found start and end of each peak
% generate some data
x = linspace(-1,17);
y = sin(x);
y = y.*(y>0);
thresh = 0.1;
ind = find(abs(y) < thresh); % find 'zeros' points
i = find( diff(ind)>1 ); % find breaks
i = [i; i+1]; % add 'end' points for each peak
i = reshape(i,2,[])';
ind = ind(i); % two columns: start - end points
plot(x,y,'.-b')
hold on
plot(x(ind),y(ind),'or')
plot([min(x) max(x)],[1 1]*thresh)
Use finpeaks() to get max value for each peak
Use trapz() to calculate area

  0 Comments

Sign in to comment.

More Answers (2)

Image Analyst
Image Analyst on 7 Sep 2019
If you have the Image Processing Toolbox, you could use regionprops
props = regionprops(signal < 0, 'PixelIdxList');
It will give you, for each peak, the starting and stopping point. You could also ask for MeanIntensity and Area and multiply those together to get the area under the curve. Let me know if you can't figure it out, and attach your signal in a .mat file.

  0 Comments

Sign in to comment.


Fabio Freschi
Fabio Freschi on 7 Sep 2019
If the signal is not too noisy you can work with ‘diff’ and look for the change of sign

  0 Comments

Sign in to comment.

Sign in to answer this question.

Tags