Date: Jan 15, 2013 1:49 PM
Author: Derek Goring
Subject: Re: Peak Detection Matlab

On Wednesday, January 16, 2013 5:59:10 AM UTC+13, Dara Roberts wrote:
> I have wrote some MATLAB code in relation to detecting peaks above a certain threshold(see below).The code however is detecting too many peaks for each single peak I am trying to detect(unable to upload graph). I am trying to design an algorithm to reject peaks that are too close together, lets say if they are within 100 samples. Could someone please help me with this??
>
>
>
>
>
> %Finding median over 100 values
>
> N=100;
>
> for i=1:length(testdata)-N
>
> newvalue(i+N/2)=median(testdata(i:i+N-1));
>
> end
>
>
>
>
>
> %peak detection of signal - median
>
> delta = testdata(1:length(newvalue))-newvalue';
>
> delta(1:N/2)=0; %% the first N/2 values should be set to zero;
>
>
>
>
>
> plot(delta,'g');
>
> W = delta;
>
>
>
>
>
> for j=1:length(delta);
>
> x(j) = W(j)^2;
>
> end
>
>
>
> y = sum(x)
>
>
>
> energy = sqrt((y/length(delta)))
>
>
>
> threshold = (0.7*energy) %% 0.7 is an arbitrary choice
>
> line([0 length(delta)],[threshold threshold]) %% to visualize, plot the threshold across the plot
>
>
>
> i=1
>
> for n=(delta(N/2) + 2):length(delta)-1
>
> if (delta(n)>=delta(n-1) & delta(n)>=delta(n+1) )
>
> if (delta(n)>= threshold) ;
>
>
>
> index(i)=n;
>
> i=i+1;
>
> end
>
> end
>
> end
>
>
>
>
>
>
>
> hold on
>
>
>
> plot(index,delta(index),'r+')


Instead of all those loops, do it using vectors:
S=diff(y); % Calculate the slopes
S1=S(2:end);
S2=S(1:end-1);
% Look for locations of peaks and troughs
imx=find(S1.*S2 <= 0 & S1-S2 < 0 & S2 > 0)+1;
imn=find(S1.*S2 <= 0 & S1-S2 > 0 & S1 > 0)+1;

Now you have the locations of all the peaks (and troughs)
t=[0:length(y)-1]';
plot(t,y,'b-',t(imx),y(imx),'ro',t(imn),y(imn),'gs')
So, now, you can apply your algorithm to reject peaks less than a threshold.