annotate 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
rev   line source
Dawn@4 1 function [HNR] = calculate_HNR( y, fs, noOfFrames, silenceFrames, pitch )
Dawn@4 2
Dawn@4 3 %find the maximum lag M
Dawn@4 4 DEBUG=0;
Dawn@4 5
Dawn@4 6 maxPeriod = ceil(fs/getVariables('getMinFreq')); %get the default minimum fundatmental frequency
Dawn@4 7 minPeriod = floor(fs/getVariables('getMaxFreq')); %get the default maximum fundamental frequency
Dawn@4 8
Dawn@4 9 for i = 1:(noOfFrames - 1)
Dawn@4 10 if( silenceFrames(i) == 1 )
Dawn@4 11
Dawn@4 12 % frame is not silent
Dawn@4 13 NA = xcorr(y(:,i), y(:,i), 'coeff');
Dawn@4 14 NA = NA( ceil(length(NA)/2) : end );
Dawn@4 15
Dawn@4 16 if(DEBUG)
Dawn@4 17 subplot(211); plot(y(:,i)); title(i);
Dawn@4 18 subplot(212); plot(NA); hold on;
Dawn@4 19 end
Dawn@4 20
Dawn@4 21 % find the maximum nearset to the predicted pitch
Dawn@4 22 f0 = pitch(i);
Dawn@4 23 if( (f0 < minPeriod) || (isnan(f0)) )
Dawn@4 24 f0 = minPeriod;
Dawn@4 25 end
Dawn@4 26 % perform a search outwards from that point
Dawn@4 27 startSearch = floor(f0-(f0*0.1));
Dawn@4 28 endSearch = ceil(f0+(f0*0.1));
Dawn@4 29 if( startSearch > length(NA) )
Dawn@4 30 startSearch = length(NA) - 20;
Dawn@4 31 end
Dawn@4 32 if( endSearch > length(NA) )
Dawn@4 33 endSearch = length(NA);
Dawn@4 34 end
Dawn@4 35 [max_value max_position] = max( NA( startSearch : endSearch ));
Dawn@4 36
Dawn@4 37 if(DEBUG)
Dawn@4 38 plot( max_position + startSearch - 1, max_value, 'gx' );
Dawn@4 39 plot( startSearch : endSearch, NA(startSearch : endSearch), 'r');
Dawn@4 40 hold off;
Dawn@4 41 end
Dawn@4 42
Dawn@4 43 HR(i) = max_value;
Dawn@4 44
Dawn@4 45 if( HR(i) < 0)
Dawn@4 46 % if the sample is negative it probably means the frame is
Dawn@4 47 % silent so just set to 'most noisy so far'
Dawn@4 48 % if(i>1)
Dawn@4 49 % HNR(i) = min( HNR );
Dawn@4 50 % else
Dawn@4 51 HNR(i) = NaN;
Dawn@4 52 % end
Dawn@4 53 else
Dawn@4 54 HNR(i)= 10*log10(HR(i)/(1-HR(i)));
Dawn@4 55 end
Dawn@4 56 if(DEBUG) title(HNR(i)); end
Dawn@4 57 else
Dawn@4 58 HNR(i) = NaN;
Dawn@4 59 end
Dawn@4 60
Dawn@4 61 end
Dawn@4 62
Dawn@4 63
Dawn@4 64
Dawn@4 65
Dawn@4 66
Dawn@4 67
Dawn@4 68
Dawn@4 69
Dawn@4 70