tomwalters@0
|
1 %
|
tomwalters@0
|
2 % Calculation of F0 from Summary SAI
|
tomwalters@0
|
3 % Irino, T.
|
tomwalters@0
|
4 % 31 Jan 00
|
tomwalters@0
|
5 % modified from CalPeakSumSAI(SAIval, fs, NumPeak);
|
tomwalters@0
|
6 %
|
tomwalters@0
|
7 % function [F0estSAI, MeanSAI, ModMeanSAI] ...
|
tomwalters@0
|
8 % = CalF0estSAI(SAIval, fs, Frs, StrobeLoc, MaxF0, PreF0);
|
tomwalters@0
|
9 % INPUT: SAIval : SAI value
|
tomwalters@0
|
10 % fs : Sampling frequency
|
tomwalters@0
|
11 % StrobeLoc: Number of Strobe Location (TimeInterval == 0)
|
tomwalters@0
|
12 % MaxF0: Maximum value of F0
|
tomwalters@0
|
13 % PreF0: Pre-Estimated value of F0
|
tomwalters@0
|
14 % OUTPUT: F0estSAI: Estimated F0 from SAI
|
tomwalters@0
|
15 % MeanSAI: Summary of SAI
|
tomwalters@0
|
16 % ModMeanSAI: Modified version of MeanSAI for period detection
|
tomwalters@0
|
17 %
|
tomwalters@0
|
18 function [F0estSAI, MeanSAI, ModMeanSAI, F0estSAIprof, ProfSAI ] ...
|
tomwalters@0
|
19 = CalF0estSAI(SAIval, fs, Frs, StrobeLoc, MaxF0, PreF0);
|
tomwalters@0
|
20
|
tomwalters@0
|
21 if nargin < 4, StrobeLoc = 5*fs/1000+1; end; % at 5 ms
|
tomwalters@0
|
22 if nargin < 5, MaxF0 = 400; end;
|
tomwalters@0
|
23 if nargin < 6, PreF0 = 150; end;
|
tomwalters@0
|
24
|
tomwalters@0
|
25 MinF0 = 80;
|
tomwalters@0
|
26 MeanSAI = mean(SAIval);
|
tomwalters@0
|
27 [NCh LenSAI] = size(SAIval);
|
tomwalters@0
|
28
|
tomwalters@0
|
29 [dummy nc1] = min(abs(Frs-500));
|
tomwalters@0
|
30 % wgtChSAI = [ (1:nc1)'/nc1; ones(NCh-nc1,1)]; useless
|
tomwalters@0
|
31 wgtChSAI = ones(NCh,1);
|
tomwalters@0
|
32
|
tomwalters@0
|
33 nTilt = StrobeLoc + fix(fs/max(PreF0,MinF0)); % F0 > 80 Hz
|
tomwalters@0
|
34 nnt = [0:(LenSAI-nTilt)];
|
tomwalters@0
|
35 wgtTISAI = [zeros(1,StrobeLoc-1), ones(1,nTilt-StrobeLoc), ...
|
tomwalters@0
|
36 (1 - nnt/max(nnt)) ];
|
tomwalters@0
|
37 ModMeanSAI = mean((wgtChSAI*wgtTISAI).*SAIval);
|
tomwalters@0
|
38
|
tomwalters@0
|
39 %[dummy nc0] = min(abs(Frs-70)); % Frs > 100
|
tomwalters@0
|
40 nc0 = 1;
|
tomwalters@0
|
41 wgtProSAI = [zeros(1,nc0), (1 - ((nc0+1):nc1)/nc1) zeros(1,NCh-nc1)]';
|
tomwalters@0
|
42
|
tomwalters@0
|
43 ProfSAI = wgtProSAI.*mean(SAIval')';
|
tomwalters@0
|
44 [dummy mp] = max(ProfSAI);
|
tomwalters@0
|
45 F0estSAIprof = Frs(mp);
|
tomwalters@0
|
46
|
tomwalters@0
|
47 ThreshUV = 0.95;
|
tomwalters@0
|
48
|
tomwalters@0
|
49 F0estSAI = 0;
|
tomwalters@0
|
50 if max(MeanSAI) == 0, F0estSAI = 0; return; end;
|
tomwalters@0
|
51
|
tomwalters@0
|
52 [PeakVal1 PeakLoc1 ] = max(MeanSAI);
|
tomwalters@0
|
53 if PeakLoc1 ~= StrobeLoc;
|
tomwalters@0
|
54 disp([ 'StrobeLoc is strangely detected at ' int2str(PeakLoc1)]);
|
tomwalters@0
|
55 F0estSAI = 0;
|
tomwalters@0
|
56 return;
|
tomwalters@0
|
57 end;
|
tomwalters@0
|
58
|
tomwalters@0
|
59 ModMeanSAI2 = ModMeanSAI;
|
tomwalters@0
|
60 nz = StrobeLoc+(0: fix(fs/MaxF0)-1);
|
tomwalters@0
|
61 ModMeanSAI2(nz) = zeros(size(nz)); % suppress 1st peak
|
tomwalters@0
|
62 [PeakVal2 PeakLoc2] = max(ModMeanSAI2);
|
tomwalters@0
|
63 F0estSAI = fs/(PeakLoc2-StrobeLoc);
|
tomwalters@0
|
64
|
tomwalters@0
|
65 [TroughVal dummy] = min(ModMeanSAI(StrobeLoc:PeakLoc2));
|
tomwalters@0
|
66 if TroughVal/PeakVal2 >= ThreshUV;
|
tomwalters@0
|
67 F0estSAI = 0;
|
tomwalters@0
|
68 end;
|
tomwalters@0
|
69
|
tomwalters@0
|
70
|
tomwalters@0
|
71
|