annotate extra codes/f0detectionyin.m @ 3:1c0f36c348d4

extra code for matlab
author Katerina <katkost@gmail.com>
date Sat, 20 Apr 2013 13:03:01 +0100
parents
children
rev   line source
katkost@3 1 function f0 = f0detectionyin(x,fs,ws,minf0,maxf0)
katkost@3 2 % x: input signal, fs: sampling rate, ws: integration window length, minf0: minimum f0, maxf0: maximum f0
katkost@3 3 % f0: fundamental frequency detected in Hz
katkost@3 4 maxlag = ws-2; % maximum lag
katkost@3 5 th = 0.1; % set threshold
katkost@3 6 d = zeros(maxlag,1); % init variable
katkost@3 7 d2 = zeros(maxlag,1); % init variable
katkost@3 8 % compute d(tau)
katkost@3 9 x1 = x(1:ws);
katkost@3 10 cumsumx = sum(x1.^2);
katkost@3 11 cumsumxl = cumsumx;
katkost@3 12 xy = xcorr(x(1:ws*2),x1);
katkost@3 13 xy = xy(ws*2+1:ws*3-2);
katkost@3 14 for lag=0:maxlag-1
katkost@3 15 d(1+lag) = cumsumx + cumsumxl - 2*xy(1+lag);
katkost@3 16 cumsumxl = cumsumxl - x(1+lag).^2 + x(1+lag+ws+1)^2;
katkost@3 17 end
katkost@3 18 cumsum = 0;
katkost@3 19 % compute d'(tau)
katkost@3 20 d2(1) = 1;
katkost@3 21 for lag=1:maxlag-1
katkost@3 22 cumsum = cumsum + d(1+lag);
katkost@3 23 d2(1+lag) = d(1+lag)*lag./cumsum;
katkost@3 24 end
katkost@3 25 % limit the search to the target range
katkost@3 26 minf0lag = 1+round(fs./minf0); % compute lag corresponding to minf0
katkost@3 27 maxf0lag = 1+round(fs./maxf0); % compute lag corresponding to maxf0
katkost@3 28 if (maxf0lag>1 && maxf0lag<maxlag)
katkost@3 29 d2(1:maxf0lag) = 100; % avoid lags shorter than maxf0lag
katkost@3 30 end
katkost@3 31 if (minf0lag>1 && minf0lag<maxlag)
katkost@3 32 d2(minf0lag:end) = 100; % avoid lags larger than minf0lag
katkost@3 33 end
katkost@3 34 % find the best candidate
katkost@3 35 mloc = 1 + find((d2(2:end-1)<d2(3:end)).*(d2(2:end-1)<d2(1:end-2))); % minima
katkost@3 36 candf0lag = 0;
katkost@3 37 if (length(mloc)>0)
katkost@3 38 I = find(d2(mloc)<th);
katkost@3 39 if (length(I)>0)
katkost@3 40 candf0lag = mloc(I(1));
katkost@3 41 else
katkost@3 42 [Y,I2] = min(d2(mloc));
katkost@3 43 candf0lag = mloc(I2);
katkost@3 44 end
katkost@3 45 candf0lag = candf0lag; % this is zero-based indexing
katkost@3 46 if (candf0lag>1 & candf0lag<maxlag)
katkost@3 47 % parabolic interpolation
katkost@3 48 lval = d2(candf0lag-1);
katkost@3 49 val = d2(candf0lag);
katkost@3 50 rval= d2(candf0lag+1);
katkost@3 51 candf0lag = candf0lag + .5*(lval-rval)./(lval-2*val+rval);
katkost@3 52 end
katkost@3 53 end
katkost@3 54 ac = min(d2);
katkost@3 55 f0lag = candf0lag-1; % convert to zero-based indexing
katkost@3 56 f0 = fs./f0lag; % compute candidate frequency in Hz
katkost@3 57 if (ac > 0.2) % voiced/unvoiced threshold
katkost@3 58 f0 = 0; % set to unvoiced
katkost@3 59 end
katkost@3 60