MFCC原理及代码

来源:互联网 发布:修改图片的软件 编辑:程序博客网 时间:2024/05/16 10:28

MFCC是Mel-Frequency Cepstral Coefficients的缩写,包含两个关键步骤:转化到梅尔频率,然后进行倒谱分析。

梅尔刻度的滤波器组在低频部分的分辨率高,跟人耳的听觉特性是相符的。
做法是:首先对时域信号进行傅里叶变换转换到频域,然后再利用梅尔频率刻度的滤波器组对应频域信号进行切分,最后每个频率段对应一个数值。

倒谱分析

倒谱的含义是:对时域信号做傅里叶变换,然后取log,然后再进行反傅里叶变换。可以分为复倒谱、实倒谱和功率倒谱,我们用的是功率倒谱。
倒谱分析可用于将信号分解,两个信号的卷积转化为两个信号的相加。所以进行倒谱分析目的就是获得频谱的包络信息。包络部分对应的是频谱的低频信息,而细节部分对应的是频谱的高频信息。倒谱分析已经将两部分对应的时域信号的卷积关系转化为了线性加关系,所以只需要将倒谱通过一个低通滤波器即可获得包络部分对应的时域信号

基本流程

预加重

目的
为了消除发声过程中,声带和嘴唇造成的效应,来补偿语音信号受到发音系统所压抑的高频部分。并且能突显高频的共振峰。
简单理解就是在频域上面都乘以一个系数,这个系数跟频率成正相关,所以高频的幅值会有所提升。

加窗

目的
用于平滑信号,使用汉明窗加以平滑的话,相比于矩形窗函数,会减弱FFT以后旁瓣大小以及频谱泄露。

频域转换

目的
将时域信号转化到频域进行后续的频率分析

使用梅尔刻度滤波器组过滤

目的
因为频域信号有很多冗余,滤波器组可以对频域的幅值进行精简,每一个频段用一个值来表示。
实现
对于FFT得到的幅度谱,分别跟每一个滤波器进行频率相乘累加,得到的值即为该帧数据在在该滤波器对应频段的能量值。如果滤波器的个数为22,那么此时应该得到22个能量值
能量值取log

由于人耳对声音的感知并不是线性的,用log这种非线性关系更好描述。取完log以后才可以进行倒谱分析。

离散余弦变换

DCT和DFT类似,但是只使用实数,不涉及复数运算。信号经过DCT变换以后,能量会集中到低频部分,可以用于图像压缩。
1. 目的
按照倒谱的定义,该步需要进行反傅里叶变换然后通过低通滤波器获得最后的低频信号。这里使用DCT直接就可以获取频率谱的低频信息。
由于滤波器之间是有重叠的,所以前面的获得的能量值之间是具有相关性的,DCT还可以对数据进行降维压缩和抽象,获得最后的特征参数。相比于傅里叶变换,离散余弦变换的结果没有虚部,更好计算。

差分

目的
由于语音信号是时域连续的,分帧提取的特征信息只反应了本帧语音的特性,为了使特征更能体现时域连续性,可以在特征维度增加前后帧信息的维度。常用的是一阶差分和二阶差分。

代码
注意用一段信号,而非整段信号,可以对信号进行分帧处理
分帧注意事项
窗口长度,一般帧移占帧长1/3