annotate Code/Test/formant_tracker.m @ 4:92ca03a8fa99 tip

Update to ICASSP 2013 benchmark
author Dawn Black
date Wed, 13 Feb 2013 11:02:39 +0000
parents
children
rev   line source
Dawn@4 1 function[formant]=formant_tracker(input,dimension,step,window_size,p,threshold)
Dawn@4 2 % %Formant_tracker based on LPC Analysis
Dawn@4 3 % format:[formants]=formant_tracker(input,dimension,step,window_size,p,threshold)
Dawn@4 4 % where,
Dawn@4 5 % input:input speech waveform;
Dawn@4 6 % dimension:input size, in number of samples.
Dawn@4 7 % step:step size , in number of samples;
Dawn@4 8 % window_size: frame/window size, in number of samples;
Dawn@4 9 % p: number of LP coeffcients;
Dawn@4 10 % threshold: the threshold value for pole magnitude.Poles having higher magnitude are candidates for being formant
Dawn@4 11 % frequencies.
Dawn@4 12 %
Dawn@4 13 % Author:Narsimh Kamath.
Dawn@4 14 % NITK, India.Thanks!
Dawn@4 15 num=1;
Dawn@4 16 dimension-window_size;
Dawn@4 17
Dawn@4 18 for i=1:step:(dimension/50)-window_size
Dawn@4 19
Dawn@4 20 frame=input(num*step-window_size/2:num*step+window_size/2);
Dawn@4 21
Dawn@4 22
Dawn@4 23
Dawn@4 24 for k=1:p+1
Dawn@4 25 autocorrelation(k)=0;
Dawn@4 26 for l=1:window_size-k
Dawn@4 27 autocorrelation(k)=autocorrelation(k)+frame(l)*frame(l+k-1);
Dawn@4 28 end
Dawn@4 29 autocorrelation(k)=autocorrelation(k)/window_size;
Dawn@4 30 end
Dawn@4 31
Dawn@4 32 t=window_size/2;
Dawn@4 33 for k=20:t
Dawn@4 34 acf(k)=0;
Dawn@4 35 for l=1:window_size-k
Dawn@4 36 acf(k)=acf(k)+frame(l)*frame(l+k-1);
Dawn@4 37 end
Dawn@4 38 acf(k)=acf(k)/window_size;
Dawn@4 39 end
Dawn@4 40 [rr,ii]=max(acf(10:t));
Dawn@4 41 tp=10000/ii;
Dawn@4 42
Dawn@4 43 alpha=zeros(p,p);
Dawn@4 44 a=zeros(p,1);
Dawn@4 45 E=zeros(p,1);
Dawn@4 46 E(1)=autocorrelation(1);
Dawn@4 47 for i=1:p
Dawn@4 48 sum=0;
Dawn@4 49 for j=1:i-1
Dawn@4 50 if(i)>1
Dawn@4 51 sum=sum+alpha(j,(i-1))*autocorrelation(abs(i-j)+1);
Dawn@4 52 end
Dawn@4 53 end
Dawn@4 54
Dawn@4 55 k(i)=(autocorrelation(i+1)-sum)/E(i);
Dawn@4 56 alpha(i,i)=k(i);
Dawn@4 57 if i>1
Dawn@4 58 for j=1:i-1
Dawn@4 59 alpha(j,i)=alpha(j,i-1)-k(i)*alpha(i-j,i-1);
Dawn@4 60 end
Dawn@4 61 end
Dawn@4 62 E(i+1)=(1-k(i)^2)*E(i);
Dawn@4 63 var=E(i+1);
Dawn@4 64 end
Dawn@4 65 for j=1:p
Dawn@4 66 a(j)=alpha(j,p);
Dawn@4 67 end
Dawn@4 68 f=[1 -a'];
Dawn@4 69 gain=0;
Dawn@4 70 p;
Dawn@4 71 for i =1:p+1
Dawn@4 72 gain=gain+f(i)*autocorrelation(i);
Dawn@4 73 end
Dawn@4 74 gain;
Dawn@4 75 gain=gain^0.5;
Dawn@4 76
Dawn@4 77
Dawn@4 78 root1=roots([1,-a']);
Dawn@4 79
Dawn@4 80 mag_root=abs(root1);
Dawn@4 81 arg_root=angle(root1);
Dawn@4 82 my_roots(:,num) = mag_root(:);
Dawn@4 83 % if( max(frame) > 0.001 )
Dawn@4 84 % subplot(311); plot(frame);
Dawn@4 85 % subplot(312); plot(abs(fft(frame)));
Dawn@4 86 % subplot(313); plot(mag_root);
Dawn@4 87 % end
Dawn@4 88 k=1;
Dawn@4 89 for j=1:p
Dawn@4 90 if mag_root(j)>threshold
Dawn@4 91 if arg_root(j)>0 &arg_root(j)<pi
Dawn@4 92 formant(num,k)=arg_root(j)/pi*5000;
Dawn@4 93
Dawn@4 94 num;
Dawn@4 95 k;
Dawn@4 96 k=k+1;
Dawn@4 97 end
Dawn@4 98 end
Dawn@4 99 end
Dawn@4 100
Dawn@4 101
Dawn@4 102 num=num+1;
Dawn@4 103 end
Dawn@4 104 s=size(formant);
Dawn@4 105 for i=1:length(formant)
Dawn@4 106 for j=1:s(2)
Dawn@4 107 if formant(i,j)==0
Dawn@4 108 formant(i,j)=NaN;
Dawn@4 109 end
Dawn@4 110 end
Dawn@4 111 end
Dawn@4 112
Dawn@4 113 plot(formant,'.b');
Dawn@4 114 return;
Dawn@4 115 end
Dawn@4 116