diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Code/Test/formant_tracker.m	Wed Feb 13 11:02:39 2013 +0000
@@ -0,0 +1,116 @@
+function[formant]=formant_tracker(input,dimension,step,window_size,p,threshold)
+% %Formant_tracker based on LPC Analysis
+% format:[formants]=formant_tracker(input,dimension,step,window_size,p,threshold)
+% where,
+% input:input speech waveform;
+% dimension:input size, in number of samples.
+% step:step size , in number of samples;
+% window_size: frame/window size, in number of samples;
+% p: number of LP coeffcients;
+% threshold: the threshold value for pole magnitude.Poles having higher magnitude are candidates for being formant
+% frequencies.
+% 
+% Author:Narsimh Kamath.
+% NITK, India.Thanks!
+num=1;
+dimension-window_size;
+    
+for i=1:step:(dimension/50)-window_size
+    
+    frame=input(num*step-window_size/2:num*step+window_size/2);
+     
+ 
+
+for k=1:p+1
+    autocorrelation(k)=0;
+    for l=1:window_size-k
+        autocorrelation(k)=autocorrelation(k)+frame(l)*frame(l+k-1);
+    end 
+    autocorrelation(k)=autocorrelation(k)/window_size;
+end
+
+t=window_size/2;
+for k=20:t
+    acf(k)=0;
+    for l=1:window_size-k
+        acf(k)=acf(k)+frame(l)*frame(l+k-1);
+    end 
+    acf(k)=acf(k)/window_size;
+end
+[rr,ii]=max(acf(10:t));
+tp=10000/ii;
+
+alpha=zeros(p,p);
+a=zeros(p,1);
+E=zeros(p,1);
+E(1)=autocorrelation(1);
+for i=1:p
+    sum=0;
+    for j=1:i-1
+        if(i)>1
+        sum=sum+alpha(j,(i-1))*autocorrelation(abs(i-j)+1);
+        end
+    end
+    
+        k(i)=(autocorrelation(i+1)-sum)/E(i);
+        alpha(i,i)=k(i);
+        if i>1
+            for j=1:i-1
+                alpha(j,i)=alpha(j,i-1)-k(i)*alpha(i-j,i-1);
+            end
+        end
+        E(i+1)=(1-k(i)^2)*E(i);
+        var=E(i+1);
+    end
+    for j=1:p
+        a(j)=alpha(j,p);
+    end
+    f=[1 -a'];
+  gain=0;
+  p;
+    for i =1:p+1
+        gain=gain+f(i)*autocorrelation(i);
+    end
+   gain;
+    gain=gain^0.5;
+   
+
+root1=roots([1,-a']);
+
+    mag_root=abs(root1);
+    arg_root=angle(root1);
+    my_roots(:,num) = mag_root(:);
+%     if( max(frame) > 0.001 )
+%         subplot(311); plot(frame);
+%         subplot(312); plot(abs(fft(frame)));
+%         subplot(313); plot(mag_root);
+%     end
+    k=1;
+    for j=1:p
+        if mag_root(j)>threshold
+            if arg_root(j)>0  &arg_root(j)<pi
+            formant(num,k)=arg_root(j)/pi*5000;
+            
+            num;
+            k;
+            k=k+1;
+            end
+        end
+    end
+   
+    
+    num=num+1;
+end
+ s=size(formant);
+    for i=1:length(formant)
+        for j=1:s(2)
+            if formant(i,j)==0
+                formant(i,j)=NaN;
+            end
+        end
+    end
+   
+    plot(formant,'.b');
+    return;
+end
+    
\ No newline at end of file