My Blog

Work hard, play hard !

梅尔倒谱系数

Mel Frequency Cepstral Coefficient (MFCC)

这是我写的第二篇博客,这篇博客主要介绍MFCC,也是总结目前所学的《语音信号处理》知识。

很多语音自动识别系统(ASR)中,第一步就是提取语音特征,提取特征是为了提取语音中具有分辨性的信息,去除情绪、噪声等。

为了理解语音模型,我们先来理解一下声道模型。

MFCC特征在语音识别系统中广泛使用。它由Davis和Mermelstein在二十世纪九十年代引入,并成为state-of-art,当然,后续的深度学习是另话了。在MFCC此之前,还有LPCC特征,下一篇文章将介绍LPCC。

什么是MFCC,怎样计算它?

首先,给出MFCC的计算过程,后续会具体说明每一步。

  1. 将信号分帧,这是所有语音处理的第一步.

  2. 每一帧做DFT变换,得到离散频谱.

  3. 计算梅尔滤波器组,对信号滤波,并计算每个滤波器滤波之后的能量总和.

  4. 对所有的能量总和取对数.

  5. 对上述的对数能量做DCT变换.

  6. 保留DCT变换后,前12-13个系数,即为梅尔系数.

得到梅尔系数后,通常会取一阶差分和二阶差分作为动态特征,一帧的总能量也会作为特征。

具体步骤

信号分帧

第一步,对信号分帧(分帧是为了方便处理)。通常一帧20-40ms(标准的是25ms),对于16k采样率来说,也就是320-640个采样点,每一帧10ms,步长也就是160个采样点。

离散傅里叶变换

第二步,对每一帧信号做N点离散傅里叶变换,N=512,取前257个系数。

其中h(n)是N个点的窗,比如汉明窗、矩形窗等,K是DFT的长度。然后计算每一个频率的能量,并归一化:

设计梅尔滤波器组

第三步,计算梅尔滤波器组。通常设计20-40个三角滤波器(一般设置26个),假设设计$m=26$个三角滤波器,也就是说得到(26,257)的矩阵,将滤波器矩阵装置,与信号的能量相乘,就会得到26个系数。这26个系数表示信号通过每个滤波器之后,剩余的能量。下图为梅尔滤波器组:

下面具体说明,怎样得到梅尔滤波器组。先说明什么是梅尔频率,梅尔频率是基于人类听觉实验的。实验表明,相较于高频,人类的听觉对低频变化比较敏感,它与频率的转换关系如下:

将梅尔频率转换成频率:

要设计梅尔滤波器组,首先确定高频上限和低频下限,对于采样率为16K的语音信号而言,上限为$f_h=8000HZ$,下限设为$f_l=300HZ$即可(上限频率为采样率1/2)。得到上下限后,利用梅尔频率转换公式,将上下限频率转换成梅尔频率,$f_{mh}=2834.99 Mels, f_{ml}=401.25 Mels$, 再计算梅尔频率间隔,$\Delta = \frac{f_{mh} - f_{ml}}{m}$,这里m为滤波器的个数,为了方便,这里$m=10$,便得到:

m(i)=401.25, 622.50, 843.75, 1065.00, 1286.25, 1507.50, 1728.74, 1949.99, 2171.24, 2392.49, 2613.74, 2834.99

利用频率转换公式,将上述梅尔频率转换成频率:

h(i) = 300, 517.33, 781.90, 1103.97, 1496.04, 1973.32, 2554.33, 3261.62, 4122.63, 5170.76, 6446.70, 8000

然而,并没有按照上述的精确频率设计滤波器,而是将这些频率映射到最近的DFT频率。映射如下:

其中K为DFT的点数,samplerate为采样率, floor为向下取整。得到:

f(i) = 9,16,25,35,47,63,81,104,132,165,206,256

最后我们根据$f(i)$设计滤波器组,第一个滤波器从第一个点开始,在第二点达到峰值,在第三个点回到零。

这就是梅尔滤波器组。

对数变换

第四步,对第三步的26个系数取对数,为什么要取对数呢?这里面涉及到同态语音信号处理,目前不了解,后续涉及到会单独总结。

离散余弦变换

第五步,对第四步的结果做离散余弦变换DCT,得到倒谱系数。对于ASR来说,只有前12-13个系数被保留,这个系数就叫做梅尔倒谱系数。

参考

guide-mel-frequency-cepstral-coefficients-mfccs