Dawn@4
|
1 function [Maxima, countMaxima] = findMaxima(f, step)
|
Dawn@4
|
2
|
Dawn@4
|
3 %
|
Dawn@4
|
4 % MAXIMA ESTIMATION
|
Dawn@4
|
5 %
|
Dawn@4
|
6 % function [Maxima, countMaxima] = findMaxima(f, step);
|
Dawn@4
|
7 %
|
Dawn@4
|
8 % This function estimates the local maxima of a sequence
|
Dawn@4
|
9 %
|
Dawn@4
|
10 % ARGUMENTS:
|
Dawn@4
|
11 % f: the input sequence
|
Dawn@4
|
12 % step: the size of the "search" window
|
Dawn@4
|
13 %
|
Dawn@4
|
14 % RETURN:
|
Dawn@4
|
15 % Maxima: [2xcountMaxima] matrix containing:
|
Dawn@4
|
16 % 1. the maxima's indeces
|
Dawn@4
|
17 % 2. tha maxima's values
|
Dawn@4
|
18 % countMaxima: the number of maxima
|
Dawn@4
|
19 %
|
Dawn@4
|
20
|
Dawn@4
|
21
|
Dawn@4
|
22
|
Dawn@4
|
23 %
|
Dawn@4
|
24 % STEP 1: find maxima:
|
Dawn@4
|
25 %
|
Dawn@4
|
26
|
Dawn@4
|
27 countMaxima = 0;
|
Dawn@4
|
28 for (i=1:length(f)-step-1) % for each element of the sequence:
|
Dawn@4
|
29 if (i>step)
|
Dawn@4
|
30 if (( mean(f(i-step:i-1))< f(i)) && ( mean(f(i+1:i+step))< f(i)))
|
Dawn@4
|
31 % IF the current element is larger than its neighbors (2*step window)
|
Dawn@4
|
32 % --> keep maximum:
|
Dawn@4
|
33 countMaxima = countMaxima + 1;
|
Dawn@4
|
34 Maxima(1,countMaxima) = i;
|
Dawn@4
|
35 Maxima(2,countMaxima) = f(i);
|
Dawn@4
|
36 end
|
Dawn@4
|
37 else
|
Dawn@4
|
38 if (( mean(f(1:i))<= f(i)) && ( mean(f(i+1:i+step))< f(i)))
|
Dawn@4
|
39 % IF the current element is larger than its neighbors (2*step window)
|
Dawn@4
|
40 % --> keep maximum:
|
Dawn@4
|
41 countMaxima = countMaxima + 1;
|
Dawn@4
|
42 Maxima(1,countMaxima) = i;
|
Dawn@4
|
43 Maxima(2,countMaxima) = f(i);
|
Dawn@4
|
44 end
|
Dawn@4
|
45
|
Dawn@4
|
46 end
|
Dawn@4
|
47 end
|
Dawn@4
|
48
|
Dawn@4
|
49 %
|
Dawn@4
|
50 % STEP 2: post process maxima:
|
Dawn@4
|
51 %
|
Dawn@4
|
52
|
Dawn@4
|
53 MaximaNew = [];
|
Dawn@4
|
54 countNewMaxima = 0;
|
Dawn@4
|
55 i = 0;
|
Dawn@4
|
56 while (i<countMaxima)
|
Dawn@4
|
57 % get current maximum:
|
Dawn@4
|
58 i = i + 1;
|
Dawn@4
|
59 curMaxima = Maxima(1,i);
|
Dawn@4
|
60 curMavVal = Maxima(2,i);
|
Dawn@4
|
61
|
Dawn@4
|
62 tempMax = Maxima(1,i);
|
Dawn@4
|
63 tempVals = Maxima(2,i);
|
Dawn@4
|
64
|
Dawn@4
|
65 % search for "neighbourh maxima":
|
Dawn@4
|
66 while ((i<countMaxima) && ( Maxima(1,i+1) - tempMax(end) < step / 2))
|
Dawn@4
|
67 i = i + 1;
|
Dawn@4
|
68 tempMax(end+1) = Maxima(1,i);
|
Dawn@4
|
69 tempVals(end+1) = Maxima(2,i);
|
Dawn@4
|
70 end
|
Dawn@4
|
71
|
Dawn@4
|
72
|
Dawn@4
|
73 % find the maximum value and index from the tempVals array:
|
Dawn@4
|
74 %MI = findCentroid(tempMax, tempVals); MM = tempVals(MI);
|
Dawn@4
|
75
|
Dawn@4
|
76 [MM, MI] = max(tempVals);
|
Dawn@4
|
77
|
Dawn@4
|
78 if (MM>0.02*mean(f)) % if the current maximum is "large" enough:
|
Dawn@4
|
79 countNewMaxima = countNewMaxima + 1; % add maxima
|
Dawn@4
|
80 % keep the maximum of all maxima in the region:
|
Dawn@4
|
81 MaximaNew(1,countNewMaxima) = tempMax(MI);
|
Dawn@4
|
82 MaximaNew(2,countNewMaxima) = f(MaximaNew(1,countNewMaxima));
|
Dawn@4
|
83 end
|
Dawn@4
|
84 tempMax = [];
|
Dawn@4
|
85 tempVals = [];
|
Dawn@4
|
86 end
|
Dawn@4
|
87
|
Dawn@4
|
88 Maxima = MaximaNew;
|
Dawn@4
|
89 countMaxima = countNewMaxima;
|
Dawn@4
|
90
|
Dawn@4
|
91
|