Dawn@4: function [HNR] = calculate_HNR( y, fs, noOfFrames, silenceFrames, pitch ) Dawn@4: Dawn@4: %find the maximum lag M Dawn@4: DEBUG=0; Dawn@4: Dawn@4: maxPeriod = ceil(fs/getVariables('getMinFreq')); %get the default minimum fundatmental frequency Dawn@4: minPeriod = floor(fs/getVariables('getMaxFreq')); %get the default maximum fundamental frequency Dawn@4: Dawn@4: for i = 1:(noOfFrames - 1) Dawn@4: if( silenceFrames(i) == 1 ) Dawn@4: Dawn@4: % frame is not silent Dawn@4: NA = xcorr(y(:,i), y(:,i), 'coeff'); Dawn@4: NA = NA( ceil(length(NA)/2) : end ); Dawn@4: Dawn@4: if(DEBUG) Dawn@4: subplot(211); plot(y(:,i)); title(i); Dawn@4: subplot(212); plot(NA); hold on; Dawn@4: end Dawn@4: Dawn@4: % find the maximum nearset to the predicted pitch Dawn@4: f0 = pitch(i); Dawn@4: if( (f0 < minPeriod) || (isnan(f0)) ) Dawn@4: f0 = minPeriod; Dawn@4: end Dawn@4: % perform a search outwards from that point Dawn@4: startSearch = floor(f0-(f0*0.1)); Dawn@4: endSearch = ceil(f0+(f0*0.1)); Dawn@4: if( startSearch > length(NA) ) Dawn@4: startSearch = length(NA) - 20; Dawn@4: end Dawn@4: if( endSearch > length(NA) ) Dawn@4: endSearch = length(NA); Dawn@4: end Dawn@4: [max_value max_position] = max( NA( startSearch : endSearch )); Dawn@4: Dawn@4: if(DEBUG) Dawn@4: plot( max_position + startSearch - 1, max_value, 'gx' ); Dawn@4: plot( startSearch : endSearch, NA(startSearch : endSearch), 'r'); Dawn@4: hold off; Dawn@4: end Dawn@4: Dawn@4: HR(i) = max_value; Dawn@4: Dawn@4: if( HR(i) < 0) Dawn@4: % if the sample is negative it probably means the frame is Dawn@4: % silent so just set to 'most noisy so far' Dawn@4: % if(i>1) Dawn@4: % HNR(i) = min( HNR ); Dawn@4: % else Dawn@4: HNR(i) = NaN; Dawn@4: % end Dawn@4: else Dawn@4: HNR(i)= 10*log10(HR(i)/(1-HR(i))); Dawn@4: end Dawn@4: if(DEBUG) title(HNR(i)); end Dawn@4: else Dawn@4: HNR(i) = NaN; Dawn@4: end Dawn@4: Dawn@4: end Dawn@4: Dawn@4: Dawn@4: Dawn@4: Dawn@4: Dawn@4: Dawn@4: Dawn@4: Dawn@4: