Mercurial > hg > emotion-detection-top-level
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Code/Descriptors/Matlab/Common/findMaxima.m Wed Feb 13 11:02:39 2013 +0000 @@ -0,0 +1,91 @@ +function [Maxima, countMaxima] = findMaxima(f, step) + +% +% MAXIMA ESTIMATION +% +% function [Maxima, countMaxima] = findMaxima(f, step); +% +% This function estimates the local maxima of a sequence +% +% ARGUMENTS: +% f: the input sequence +% step: the size of the "search" window +% +% RETURN: +% Maxima: [2xcountMaxima] matrix containing: +% 1. the maxima's indeces +% 2. tha maxima's values +% countMaxima: the number of maxima +% + + + +% +% STEP 1: find maxima: +% + +countMaxima = 0; +for (i=1:length(f)-step-1) % for each element of the sequence: + if (i>step) + if (( mean(f(i-step:i-1))< f(i)) && ( mean(f(i+1:i+step))< f(i))) + % IF the current element is larger than its neighbors (2*step window) + % --> keep maximum: + countMaxima = countMaxima + 1; + Maxima(1,countMaxima) = i; + Maxima(2,countMaxima) = f(i); + end + else + if (( mean(f(1:i))<= f(i)) && ( mean(f(i+1:i+step))< f(i))) + % IF the current element is larger than its neighbors (2*step window) + % --> keep maximum: + countMaxima = countMaxima + 1; + Maxima(1,countMaxima) = i; + Maxima(2,countMaxima) = f(i); + end + + end +end + +% +% STEP 2: post process maxima: +% + +MaximaNew = []; +countNewMaxima = 0; +i = 0; +while (i<countMaxima) + % get current maximum: + i = i + 1; + curMaxima = Maxima(1,i); + curMavVal = Maxima(2,i); + + tempMax = Maxima(1,i); + tempVals = Maxima(2,i); + + % search for "neighbourh maxima": + while ((i<countMaxima) && ( Maxima(1,i+1) - tempMax(end) < step / 2)) + i = i + 1; + tempMax(end+1) = Maxima(1,i); + tempVals(end+1) = Maxima(2,i); + end + + + % find the maximum value and index from the tempVals array: + %MI = findCentroid(tempMax, tempVals); MM = tempVals(MI); + + [MM, MI] = max(tempVals); + + if (MM>0.02*mean(f)) % if the current maximum is "large" enough: + countNewMaxima = countNewMaxima + 1; % add maxima + % keep the maximum of all maxima in the region: + MaximaNew(1,countNewMaxima) = tempMax(MI); + MaximaNew(2,countNewMaxima) = f(MaximaNew(1,countNewMaxima)); + end + tempMax = []; + tempVals = []; +end + +Maxima = MaximaNew; +countMaxima = countNewMaxima; + +