annotate Code/Descriptors/Matlab/Common/findMaxima.m @ 4:92ca03a8fa99 tip

Update to ICASSP 2013 benchmark
author Dawn Black
date Wed, 13 Feb 2013 11:02:39 +0000
parents
children
rev   line source
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