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
|