Mercurial > hg > emotion-detection-top-level
diff Code/General/readFormantValueFromFile.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/General/readFormantValueFromFile.m Wed Feb 13 11:02:39 2013 +0000 @@ -0,0 +1,165 @@ +function [] = readFormantValueFromFile( statsFileID, metricFileName, metricName, vuv ) + +DEBUG=0; + +FileID = fopen( metricFileName ); + +if( FileID <= 0 ) %does the file exist? + % if not + + message = ['WARNING: MISSING ' metricName ' FILE']; + disp( message ); + fprintf( statsFileID, '\t \s missing', metricName ); + + else + % file format is not straight forward + noOfValues = 0; + formants = []; + while( ~(feof(FileID)) ) + + % search for numberOfFormants + thestr = fgetl(FileID); + + if( strfind( thestr , 'numberOfFormants' ) > 0 ) + noOfValues = noOfValues + 1; + %numberOfFormants found + pos = find( thestr == '=' ); + numberOfFormants = str2num(thestr(pos+2:end)); + formants( noOfValues, 1 ) = numberOfFormants; + % discard the 'formant []' line + thestr = fgetl(FileID); + % now read the formant positions + for (i=0:numberOfFormants-1) + thestr = fgetl(FileID); + pos = find( thestr == '=' ); + formants( noOfValues, i+2 ) = str2num(thestr( pos+2 : end )); + end + + % discard the 'bandwidth []' line + thestr = fgetl(FileID); + % now read the formant bandwidths + for (i=0:numberOfFormants-1) + thestr = fgetl(FileID); + pos = find( thestr == '=' ); + formants( noOfValues, i+2+numberOfFormants ) = str2num(thestr( pos+2 : end )); + end + + end + end + fclose(FileID); + + + if(DEBUG) + timeShift = length(formants) / length(vuv); + subplot(211); hold off; + subplot(212); hold off; + for( idx = 1: length( formants )/10 ) + frameIdx = floor( idx / timeShift ) + 1; + if( frameIdx <= length(vuv) ) + if( vuv( frameIdx ) == 0 ) + % frame is silent + subplot(211); plot( idx, formants( idx,2 ), 'w.' ); hold on; + subplot(211); plot( idx, formants( idx,3 ), 'w.' ); + subplot(211); plot( idx, formants( idx,4 ), 'w.' ); + % plot bandwidths + subplot(212); plot( idx, formants( idx,5 ), 'w.' ); hold on; + subplot(212); plot( idx, formants( idx,6 ), 'w.' ); + subplot(212); plot( idx, formants( idx,7 ), 'w.' ); + elseif( vuv( frameIdx ) == 1 ) + % frame is voiced + subplot(211); plot( idx, formants( idx,2 ), 'y.' ); hold on; + subplot(211); plot( idx, formants( idx,3 ), 'c.' ); + subplot(211); plot( idx, formants( idx,4 ), 'g.' ); + % plot bandwidths + subplot(212); plot( idx, formants( idx,5 ), 'y.' ); hold on; + subplot(212); plot( idx, formants( idx,6 ), 'c.' ); + subplot(212); plot( idx, formants( idx,7 ), 'g.' ); + else + %frame is unvoiced + subplot(211); plot( idx, formants( idx,2 ), 'r.' ); hold on; + subplot(211); plot( idx, formants( idx,3 ), 'r.' ); + subplot(211); plot( idx, formants( idx,4 ), 'r.' ); + % plot bandwidths + subplot(212); plot( idx, formants( idx,5 ), 'r.' ); hold on; + subplot(212); plot( idx, formants( idx,6 ), 'r.' ); + subplot(212); plot( idx, formants( idx,7 ), 'r.' ); + end + else + frameIdx + end + end + end + + [ noOfSamples formantDataSize ] = size( formants ); + maxNoOfFormants = (formantDataSize - 1)/2; % the array contains the number of formants, then the position of each formant, then the bandwidth of each formant. + voicedFormant = []; + voicedBandwidth = []; + % find the basic metric set for the voiced frames only + validSamples = min( noOfSamples, length(vuv) ); + for( idx = 1: validSamples ) + if( vuv( idx ) == 1 ) + % frame is voiced + formantsThisFrame = formants(idx,1); + theFormants = formants( idx, 2 : formantsThisFrame+1 ); + theBandwidths = formants( idx, formantsThisFrame+2 : (formantsThisFrame*2)+1 ); + % we want to ignore any results that contain less than the + % max number of formants as then one of the formants is set to + % zero and the detection is not reliable + % DON'T THINK THIS IS STILL VALID + % DO WE WANT TO DISCARD FORMANT SETS THAT CONTAIN '0' FORMANT + % POSITIONS FOR VOICED SEGMENTS? + if( formantsThisFrame == maxNoOfFormants ) + voicedFormant = [ voicedFormant ; theFormants ]; + voicedBandwidth = [ voicedBandwidth; theBandwidths ]; + else + % pad with zeros + diff = maxNoOfFormants - formantsThisFrame; + theFormants = [ theFormants zeros( 1, diff )]; + voicedFormant = [ voicedFormant ; theFormants ]; + theBandwidths = [ theBandwidths zeros( 1, diff )]; + voicedBandwidth = [ voicedBandwidth; theBandwidths ]; + end + + end + end + + % get the basic formant metrics + formantFrequencyMeans = []; + formantGradientMean = []; + formantBandwidthMean = []; + + fprintf( statsFileID, '\t %s %d ', 'maxNoOfFormants', maxNoOfFormants ); + + for( formantIdx = 1:maxNoOfFormants ) + % formant position + [ metrics ] = basicMetricSet( voicedFormant(:,formantIdx), statsFileID ); + formantFrequencyMeans = [ formantFrequencyMeans metrics(1) ]; + % formant gradient + formantGradient = gradient( voicedFormant(:,formantIdx) ); + [ metrics ] = basicMetricSet( formantGradient, statsFileID ); + formantGradientMean = [formantGradientMean metrics(1)]; + % formant second derivative + formantGradient = gradient( formantGradient ); + [ metrics ] = basicMetricSet( formantGradient, statsFileID ); + % formant bandwidth + [ metrics ] = basicMetricSet( voicedBandwidth(:,formantIdx), statsFileID ); + formantBandwidthMean = [formantBandwidthMean metrics(1)]; + % formant bandwidth gradient + formantGradient = gradient( voicedBandwidth(:,formantIdx)); + [ metrics ] = basicMetricSet( formantGradient, statsFileID ); + % formant bandwidth second derivative + formantGradient = gradient( formantGradient ); + [ metrics ] = basicMetricSet( formantGradient, statsFileID ); + end + + % calculate the basic metrics set for the ... + % ... mean of all formant frequencies + meanMetrics = basicMetricSet( formantFrequencyMeans, statsFileID ); + % ... mean of all formant frequency gradients + meanMetrics = basicMetricSet( formantGradientMean, statsFileID ); + % ... mean of all formant bandwidths + meanMetrics = basicMetricSet( formantBandwidthMean, statsFileID ); +end + + + \ No newline at end of file