view 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
line wrap: on
line source
%
%    Calculation of F0 from Summary SAI 
%    Irino, T.
%    31 Jan 00
%    modified from CalPeakSumSAI(SAIval, fs, NumPeak);
%
%    function [F0estSAI, MeanSAI, ModMeanSAI] ...
%             = CalF0estSAI(SAIval, fs, Frs, StrobeLoc, MaxF0, PreF0);
%    INPUT:  SAIval : SAI value
%            fs     : Sampling frequency
%            StrobeLoc: Number of Strobe Location (TimeInterval == 0)
%	     MaxF0:  Maximum value of F0
%	     PreF0:  Pre-Estimated value of F0
%    OUTPUT: F0estSAI: Estimated F0 from SAI
%            MeanSAI:   Summary of SAI
%            ModMeanSAI: Modified version of MeanSAI for period detection
%
function [F0estSAI, MeanSAI, ModMeanSAI, F0estSAIprof, ProfSAI ] ...
             = CalF0estSAI(SAIval, fs, Frs, StrobeLoc, MaxF0, PreF0);

if nargin < 4, StrobeLoc = 5*fs/1000+1; end; % at 5 ms
if nargin < 5, MaxF0 = 400; end;
if nargin < 6, PreF0 = 150; end;

MinF0 = 80;
MeanSAI = mean(SAIval);
[NCh LenSAI] = size(SAIval);

[dummy nc1] = min(abs(Frs-500));
% wgtChSAI = [ (1:nc1)'/nc1; ones(NCh-nc1,1)]; useless
wgtChSAI = ones(NCh,1);

nTilt = StrobeLoc + fix(fs/max(PreF0,MinF0)); % F0 > 80 Hz
nnt = [0:(LenSAI-nTilt)];
wgtTISAI = [zeros(1,StrobeLoc-1), ones(1,nTilt-StrobeLoc),  ...
		(1 - nnt/max(nnt)) ];
ModMeanSAI = mean((wgtChSAI*wgtTISAI).*SAIval);

%[dummy nc0] = min(abs(Frs-70)); % Frs > 100
nc0 = 1;
wgtProSAI = [zeros(1,nc0), (1 - ((nc0+1):nc1)/nc1) zeros(1,NCh-nc1)]';

ProfSAI = wgtProSAI.*mean(SAIval')';
[dummy mp] = max(ProfSAI);
F0estSAIprof = Frs(mp);

ThreshUV = 0.95;

   F0estSAI = 0;
   if  max(MeanSAI) == 0, F0estSAI = 0; return; end;

   [PeakVal1 PeakLoc1 ] = max(MeanSAI);
   if PeakLoc1 ~= StrobeLoc;	
  	disp([ 'StrobeLoc is strangely detected at ' int2str(PeakLoc1)]);
	F0estSAI = 0;
 	return;
   end;

   ModMeanSAI2 = ModMeanSAI;
   nz = StrobeLoc+(0: fix(fs/MaxF0)-1);
   ModMeanSAI2(nz) = zeros(size(nz)); % suppress 1st peak
   [PeakVal2 PeakLoc2] = max(ModMeanSAI2);
   F0estSAI = fs/(PeakLoc2-StrobeLoc);
	
   [TroughVal dummy] = min(ModMeanSAI(StrobeLoc:PeakLoc2));
   if TroughVal/PeakVal2 >= ThreshUV;
	F0estSAI = 0;
   end;