最好先看下下面三篇(其中系统的讲述了离散傅里叶变换,能量密度谱为什么是DFT系数的平方除以总点数,为什么512点的离散傅里叶变换只选前257个分量,离散余弦变换,为什么采样频率要大于真实信号最大频率的两倍,频谱混叠,频谱泄露,为什么要用窗函数等等),做知识储备,如果上述问题不懂,一定要去看哦,都可以找到答案。然后MFCC的提取过程就特别好理解。因为我就是这么学过来的!本文是我看了代码以后做的总结,我觉得这篇总结有些东西写的不清楚,就参考这个改的。
一、数据准备
格式为.wav的音频文件,可以从这里下载,.wav文件存储的是录音设备按固定频率采取的真实声波的某个点。
采样频率一般为8000Hz和16000Hz,采样频率需要大于真实信号最大频率的2倍,才不会导致频谱混叠。比如声卡采样率是8000HZ,那么可以认为原始信号的最大频率处是4000HZ,注意,原始信号的源头是声带一张一合把肺部气体排出,这一张一合的频率叫做基音频率(声音波由3个阶段,声带发出的基音频率是第一阶段;第二阶段是气体声波经过长约17cm的声道,据说第二阶段作为声音音色音质以及文本无关声纹识别中的重要部位,也是共振峰产生的场所;第三阶段是唇口鼻舌,这些部位影响声音的发音,比如元音辅音等),为了理解清晰,原始信号的频率可以默认为是声带一张一合的频率,而声卡采样频率则是1秒钟采取多少个点,所以这两者有本质的区别,但都是频率。
使用python(scipy和numpy库)的(rate,signal) = scipy.io.wavfile.read("Ansel.wav"),读取信号signal = [ 0 0 -1 ..., 627 611 702],这是个含有107000个元素的数组,还可以得到该声音文件的采样频率,此处频率rate=8000Hz。
二,预加重,{A(1*107000)}
个人理解为,由于声带和嘴唇的效应,人的发音系统会抑制语音信号的高频部分,那么低频段能量大,高频段能量小,高频部分的幅值会比较小,高频部分的信噪比(信号幅值/噪音幅值)比较小,换言之,你能从一堆茂密高大的杂草里找到你种的那根正品草吗!预加重就是解决这些问题的,相当于高通滤波器,提高高频部分啦。
一般取值为0.95/0.97。
做法:signal = [ 0 0 -1 ..., 627 611 702]含有107000个点,针对这些点,套用公式signal[i]=signal[i+1]-0.97*signal[i],得到一个新的数组A=[ 0. 0. -1. ..., -40.36 2.81 109.33],数组大小还是107000。