如何将 mel-filterbank 应用于信号?

信息处理 过滤器 离散信号 mfcc
2022-01-30 19:26:00

我找到了这个描述。据此,下一步是“装箱”,其中

分箱意味着每个 FFT 幅度系数乘以相应的滤波器增益并将结果累加。他们描述的确切程序是什么?

2个回答

Binning 是对 DFT 的(平方)幅度的平均操作。你可能会有256DFT 箱,但仅在附近20滤波器组的输出。因此,您需要平均 DFT 箱组以减少维度25620. 对于梅尔缩放滤波器组,平均函数(内核)通常是三角形的,即中心的 DFT 箱比其他箱获得更多的权重。例如,让用于平均最低 DFT 频率的第一个内核存储在一个数组中W1[k],k=0,,K1,然后该滤波器组通道的输出计算为

(1)y1=k=0K1W1[k]R[k]

在哪里R[k]是(平方)DFT 幅度。这样你计算所有20滤波器组输出。你只需要知道(定义)权重Wi[k]以及由相应内核平均的 DFT 指数范围。

这个对相关问题的回答也可能会有所帮助(另请查看评论)。

您可以在 Voicebox matlab 工具箱中找到一些示例:

http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html

在 Mathworks 网站上,您可以找到一个可能的答案:

https://www.mathworks.com/matlabcentral/fileexchange/32849-htk-mfcc-matlab/content/mfcc/mfcc.m

你能发布你自己的版本或努力吗?

关于您关于过滤器组的具体问题:

在 Mels 中查找最大频率:例如,如果您的频率范围是 300Hz-8kHz,您将有 401-2835 Mels(使用频率到 Mels 转换)。Find bin center Mel freq:如果你想要 10 个 bin,你必须有 12 点 11 个区域;所以 bin 宽度=(2835-401)/11=222; 垃圾箱约为:bwm(i) = 401.3、622.5、843.8、1065.0、1286.3、1507.5、1728.8、1950.0、2171.2、2392.5、2613.8、2835;将 Mel 频率转换回线性频率:值将是:bwf(i) = 300、517、782、1104、1496、1973、2554、3262、4123、5171、6446、8000;然后你可以继续计算。

一些代码:

f1=300;
f2=3700;
n=10;
fm1=2595*log10(1+f1/700);
fm2=2595*log10(1+f2/700);
fmw=(fm2-fm1)/(n+1);
fm=fm1:fmw:fm2;
f=700*(exp(fm/1125)-1);
% for plotting
x1=ones(1,n+2);
x1(1:2:(n+2))=0;
x2= zeros(1,n+2);
x2(1:2:(n+2))=1;
plot(f(1:11),x1(1:11))
hold on
plot(f(2:12),x2(2:12))
hold off