最近一直在做语音方面的工作,由于任务需要所以提取MFCC特征,并保存为语谱图,在以下的讲述中我并没有用到什么源码或者相关理论,但是它给了一个很好的诠释,让我在写自己的代码时有章可循,谢谢原著作者。
需要注意的是,下文中的data.txt的来源:
1.使用Matlab的函数audiorecorder进行录音
2.使用Matlab的函数getaudiodata获取音频数组
3.将获取的音频数组存入Data.txt文件。
MFCC参数提取步骤
——>预加重
——>分帧
——>对每一帧加窗
——>对每一帧补零
——>各帧信号的FFT变换及其功率谱
——>梅尔滤波(通过40个滤波器)
——>取对数
——>DCT变换
——>归一化
1.预加重
如果数据在低频的强度大于高频,就会不利于处理,因此需要通过一个传递函数为s[n]-a*s[n]的高通滤波器。滤去数据中的低频成分,使高频特性更加突现。
2.分帧
分帧就是将N个采样点集合成一个观测单位。我们设定每帧涵盖的时间是25ms,因为采样率是16000,所以得到每帧的样本点个数是400。
另外,为了避免相邻两帧的变化过大,因此会让两相邻帧之间有一段重叠区域。我们设定的重叠区域是15ms,所以就是每隔10ms取一帧。
3.对每一帧加窗
分帧后马上进行FFT,由于转换时会将帧内信号当作周期信号处理,所以在帧的两个端点处会发生突变,转换出来的频谱与原信号频谱差别很大。所以要对每一帧加窗,使帧内信号作FFT时的两个端点处不会发生突变。
我们采用的窗是汉明窗:(M为帧长,即400)
4.对每一帧补零
我们要对每一帧信号进行FFT,而FFT要求输入数据长度一定是2^K,现在一帧为400个采样点,所以补零至最接近的512位。
5.各帧信号的FFT变换及其功率谱
对分帧加窗后的各帧信号进行512点的FFT变换得到各帧的频谱。并对语音信号的频谱取模平方得到语音信号的功率谱。
6.梅尔滤波(通过40个滤波器)
40个三角滤波器在MEL谱上均匀分布,每两个滤波器间有50%的重叠部分。
所以要先把实际频率转换成梅尔频率,实际频率最小为0Hz,最大为16000 / 2 = 8000Hz
转换成梅尔频率后,我们要实现的是40个滤波器,所以计算这40个滤波器的梅尔频率分布,然后把梅尔频率转换成实际频率
然后根据实际频率的数组,计算出f数组,公式如下(h数组就是40个滤波器的实际频率分布数组):
最后根据以下公式,计算滤波器的输出(m为滤波器的个数)
以下为10个滤波器的图:
7.取对数
三角窗滤波器组的输出求取对数,可以得到近似于同态变换的结果。
8.DCT变换
对对数能量梅尔谱进行DCT变换,取前13维输出,得到梅尔倒谱。
公式为:
9.归一化
对所有的梅尔倒谱归一化。
先求出所有倒谱向量的均值向量