Dawn@4
|
1 function BW = func_getBWfromFMT(FMT, voiced, method)
|
Dawn@4
|
2 % formant to bandwidth mapping function
|
Dawn@4
|
3 %
|
Dawn@4
|
4 % Author: Yen-Liang Shue and Markus Iseli, Speech Processing and Auditory Perception Laboratory, UCLA
|
Dawn@4
|
5 % Copyright UCLA SPAPL 2009
|
Dawn@4
|
6
|
Dawn@4
|
7 if (nargin == 2) % use the Mannell formula
|
Dawn@4
|
8 BW = (80 + 120 * FMT/5000) * (2 - voiced);
|
Dawn@4
|
9
|
Dawn@4
|
10 elseif (nargin == 3 && strcmp(method, 'hm')) % use the Hawks and Miller formula
|
Dawn@4
|
11 F0 = voiced;
|
Dawn@4
|
12 BW = getbw_HawksMiller(FMT, F0)';
|
Dawn@4
|
13
|
Dawn@4
|
14 end
|
Dawn@4
|
15
|
Dawn@4
|
16
|
Dawn@4
|
17 %-------------------------------------------------------------------------
|
Dawn@4
|
18 function BW = getbw_HawksMiller(FMT,F0)
|
Dawn@4
|
19 % Reference: Hawks, Miller, "A formant bandwidth estimation procedure for vowel
|
Dawn@4
|
20 % synthesis," JASA, vol 97, no. 2, 1995
|
Dawn@4
|
21
|
Dawn@4
|
22 [r, c] = size(FMT);
|
Dawn@4
|
23 if (r > c)
|
Dawn@4
|
24 FMT = FMT';
|
Dawn@4
|
25 end
|
Dawn@4
|
26
|
Dawn@4
|
27 S = 1+0.25*(F0-132)/88; % bandwidth scaling factor as a function of F0
|
Dawn@4
|
28
|
Dawn@4
|
29 % coefficients C1 (for Fx<500 Hz) and C2 (Fx>=500Hz)
|
Dawn@4
|
30 C1 = [165.327516, -6.73636734e-1, 1.80874446e-3, -4.52201682e-6, 7.49514000e-9, -4.70219241e-12];
|
Dawn@4
|
31 C2 = [15.8146139, 8.10159009e-2, -9.79728215e-5, 5.28725064e-8, -1.07099364e-11, 7.91528509e-16];
|
Dawn@4
|
32
|
Dawn@4
|
33 F = [ones(1, length(FMT)); FMT; FMT.^2; FMT.^3; FMT.^4; FMT.^5];
|
Dawn@4
|
34 mask = FMT<500; % Fx < 500 Hz
|
Dawn@4
|
35 mask = repmat(mask,length(C1),1);
|
Dawn@4
|
36
|
Dawn@4
|
37 BW = S' .* (C1*(F .* mask) + C2*(F .* ~mask));
|