Mercurial > hg > emotion-detection-top-level
diff Code/Descriptors/Matlab/MPEG7/calculate_HNR.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/MPEG7/calculate_HNR.m Wed Feb 13 11:02:39 2013 +0000 @@ -0,0 +1,70 @@ +function [HNR] = calculate_HNR( y, fs, noOfFrames, silenceFrames, pitch ) + + %find the maximum lag M + DEBUG=0; + + maxPeriod = ceil(fs/getVariables('getMinFreq')); %get the default minimum fundatmental frequency + minPeriod = floor(fs/getVariables('getMaxFreq')); %get the default maximum fundamental frequency + + for i = 1:(noOfFrames - 1) + if( silenceFrames(i) == 1 ) + + % frame is not silent + NA = xcorr(y(:,i), y(:,i), 'coeff'); + NA = NA( ceil(length(NA)/2) : end ); + + if(DEBUG) + subplot(211); plot(y(:,i)); title(i); + subplot(212); plot(NA); hold on; + end + + % find the maximum nearset to the predicted pitch + f0 = pitch(i); + if( (f0 < minPeriod) || (isnan(f0)) ) + f0 = minPeriod; + end + % perform a search outwards from that point + startSearch = floor(f0-(f0*0.1)); + endSearch = ceil(f0+(f0*0.1)); + if( startSearch > length(NA) ) + startSearch = length(NA) - 20; + end + if( endSearch > length(NA) ) + endSearch = length(NA); + end + [max_value max_position] = max( NA( startSearch : endSearch )); + + if(DEBUG) + plot( max_position + startSearch - 1, max_value, 'gx' ); + plot( startSearch : endSearch, NA(startSearch : endSearch), 'r'); + hold off; + end + + HR(i) = max_value; + + if( HR(i) < 0) + % if the sample is negative it probably means the frame is + % silent so just set to 'most noisy so far' +% if(i>1) +% HNR(i) = min( HNR ); +% else + HNR(i) = NaN; +% end + else + HNR(i)= 10*log10(HR(i)/(1-HR(i))); + end + if(DEBUG) title(HNR(i)); end + else + HNR(i) = NaN; + end + + end + + + + + + + + +