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 |