annotate aim-mat/modules/usermodule/mellin/MIpack/CalF0estSAI.m @ 4:537f939baef0 tip

various bug fixes and changed copyright message
author Stefan Bleeck <bleeck@gmail.com>
date Tue, 16 Aug 2011 14:37:17 +0100
parents 74dedb26614d
children
rev   line source
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