帮助计算/理解MFCC:梅尔频率倒谱系数


17

我一直在网上阅读点点滴滴,但我无法将它们拼凑在一起。我对信号/ DSP有一定的背景知识,应该足以满足此要求。我有兴趣最终使用Java对该算法进行编码,但是我还不完全了解它,这就是为什么我在这里(它算作数学,对吗?)。

我认为这与我的知识差距一起起作用。

  1. 从您的音频语音样本开始,比如说一个.wav文件,您可以将其读入数组。把这种阵列,其中Ñ范围为0 1 ... ñ - 1(所以Ñ样品)。这些值对应于我猜想的音频强度-振幅。x[n]n0,1,,N1N

  2. 将音频信号分成10ms左右的不同“帧”,假设语音信号是“固定的”。这是量化的一种形式。因此,如果您的采样率为44.1KHz,则10ms等于441个采样或值。x[n]

  3. 进行傅立叶变换(为计算起见,使用FFT)。现在,这是在整个信号上还是在每个单独帧上完成的?我认为这是有区别的,因为一般来说,傅立叶变换会查看信号的所有元素,因此Fx [ n ] Fx 1 [ n ] Fx 2 [ n ] ... F结合x N [ n ] 其中xx[n]F(x[n])F(x1[n])F(x2[n])F(xN[n])是较小的帧。无论如何,假设我们进行了一些FFT,最后剩下 X [ k ]xi[n]X[k]

  4. 映射到梅尔刻度,并进行记录。我知道如何将常规频率数字转换为梅尔刻度。对于每个X [ ķ ]:(以下简称“x轴”如果你让我),你可以在这里做公式http://en.wikipedia.org/wiki/Mel_scale。但是,“ y值”或X [ k ]的幅度如何?它们是否只是保持相同的值,而是移动到新的Mel(x-)轴上的适当位置?我在某篇论文中看到有关记录X [ k ]的实际值的某些事情,因为如果X [ k ] = A [ kkX[k]X[k]X[k],其中一个信号被假定为您不需要的噪声,此方程的对数运算将乘性噪声转换为加性噪声,希望可以对其进行滤波(?)。X[k]=A[k]B[k]

  5. 现在,最后一步是从上方获取修改后的的DCT (但是最终被修改了)。然后,您将获得最终结果的振幅,这些就是您的MFCC。我读到一些有关丢弃高频值的内容。X[k]

因此,我正在尝试逐步解决如何计算这些人的问题,显然有些事情使我难以理解。

另外,我听说过使用“滤波器组”(基本上是带通滤波器的阵列),不知道这是指从原始信号制作帧,还是在FFT之后制作帧?

最后,我看到有关具有13个系数的MFCC的一些信息吗?


1
这是一个很好的问题,但是这里有很多要回答的问题。我建议将其分解为2-3个不同的问题(如果要保持连续性,可以参考另一个问题),以便可以更轻松地回答。
jonsca

由于您之前曾在math.SE上问过同样的问题(并被告知dsp.SE是一个更好的家),因此也许您应该删除关于math.SE的问题。
Dilip Sarwate

我删除了math.SE版本
YoungMoney

非常好的内容丰富的教程,谢谢您

1
嘿,您在您的问题中说:“映射到梅尔刻度,然后进行记录。我知道如何将常规频率数字转换为梅尔刻度。” 你能帮我计算一下这部分吗?因为我的FFt输出为x [k] = 1 * 184,但我的三角带通滤波器的设置为20 * 3。那我该如何乘以两者。请ASAp
Ayush Agrawal

Answers:


25

一步步...

1.&2。这是对的。注意,这些帧通常是重叠的,例如,帧0是样本0到440;帧0是样本0到440。帧1是样本220至660;第2帧是样本440到880,依此类推...还要注意,将窗口函数应用于该帧中的样本。

3。对每一帧进行傅立叶变换。其背后的动机很简单:语音信号随时间变化,但在短段内保持稳定。您想单独分析每个短片段-因为在此片段上,信号足够简单,可以用很少的系数有效地描述。想到有人说“你好”。您不希望通过一次分析所有声音来看到所有音素都折叠成一个频谱(FFT折叠了时间信息)。您希望看到“ hhhhheeeeeeeeeeelloooooooooooo”以逐步识别该单词,因此必须将其分解为短段。

NN=40

一旦定义了这些频率,我们将计算每个频率附近的FFT幅度(或能量)的加权和。

看下面的图片,代表一个带有12个bin的过滤器组:

Mel frequency filterbank with 12 channels

第8个档位的中心频率约为2kHz。通过将1600至2800 Hz左右的加权FFT能量相加得到第8个仓中的能量-权重在2kHz左右达到峰值。

实施说明:这一系列加权和可以在单个操作中完成-“滤波器组矩阵”与FFT能量矢量的矩阵相乘。

因此,在此阶段,我们已将FFT频谱“汇总”为一组40个能量值(在图中为12个),每个能量值对应于不同的频率范围。我们记录这些值。

5。下一步是采用40个对数能量序列的DCT。这将产生40个值。首先ķ 系数是MFCC(通常, ķ=13)。实际上,第一个DCT系数是在上一步中计算出的所有对数能量的总和-因此,它是信号响度的整体度量,并且对信号的实际频谱含量不是很有帮助-经常被丢弃用于语音识别或说话人ID应用,其中系统必须对响度变化具有鲁棒性。


关于梅尔(Mel)滤波器组的一个简短问题-高度/幅度范围为1.8-2很重要,或者它们可以是单位(1)高度吗?
YoungMoney 2013年

1
这并不重要。使用最大 在1.0对2.0处的幅值只会在步骤4偏移对数能量一个常数,因此只会影响步骤5的第一个系数(无论如何通常都会舍弃)。请注意,某些实现方式使用能量归一化,以便滤波器越宽,其峰值幅度越低(i.imgur.com/IOaLa.gif)。这可能会导致识别应用程序中的轻微性能变化。如果您看一下正在使用的MFCC实现,则实际上每个步骤都有许多小变化-bit.ly/ULatdL
pichenettes 2013年

这是一个古老的话题,但是我需要问一些关于图表的问题。如果奈奎斯特(Nyquist)是4kHz,为什么那些带限滤波器超过4kHz。MFCC可以吗?通常,您不希望过滤器通过Nyquist吗?我对吗?
Celdor

2
您是否参考了为什么使用 N = 40梅尔滤波器组频率(或26,我看到的另一个常见值)?
James Owers

1
39 mel步骤4来自哪里?
Gert Kommer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.