helper function: computes transfer functions of MFCC filter bands see function from Slaneys Auditory Toolbox (Matlab)
13def ToolMfccFb(iFftLength, f_s):
14
15
16 f_start = 133.3333
17
18 iNumLinFilters = 13
19 iNumLogFilters = 27
20 iNumFilters = iNumLinFilters + iNumLogFilters
21
22 linearSpacing = 66.66666666
23 logSpacing = 1.0711703
24
25
26 f = np.zeros(iNumFilters + 2)
27 f[np.arange(0, iNumLinFilters)] = f_start + np.arange(0, iNumLinFilters) * linearSpacing
28 f[np.arange(iNumLinFilters, iNumFilters + 2)] = f[iNumLinFilters - 1] * logSpacing**np.arange(1, iNumLogFilters + 3)
29
30
31 if f[iNumFilters - 1] >= f_s / 2:
32 f = f[f < f_s / 2]
33 iNumFilters = f.shape[0] - 2
34
35 f_l = f[np.arange(0, iNumFilters)]
36 f_c = f[np.arange(1, iNumFilters + 1)]
37 f_u = f[np.arange(2, iNumFilters + 2)]
38
39
40 H = np.zeros([iNumFilters, iFftLength])
41 afFilterMax = 2 / (f_u - f_l)
42 f_k = np.arange(0, iFftLength) / (iFftLength - 1) * f_s / 2
43
44
45 for c in range(0, iNumFilters):
46
47 i_l = np.argmax(f_k > f_l[c])
48 i_u = np.max([0, np.argmin(f_k <= f_c[c]) - 1])
49 H[c, np.arange(i_l, i_u + 1)] = afFilterMax[c] * (f_k[np.arange(i_l, i_u + 1)] - f_l[c]) / (f_c[c] - f_l[c])
50
51 i_l = i_u + 1
52 i_u = np.max([0, np.argmin(f_k < f_u[c]) - 1])
53 H[c, np.arange(i_l, i_u + 1)] = afFilterMax[c] * (f_u[c] - f_k[np.arange(i_l, i_u + 1)]) / (f_u[c] - f_c[c])
54
55 return H