view 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 source
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