语音信号MFCC算法简析

要进行语音处理,可以借助已经集成的工具包,如voicebox。

在Matlab7里toolbox里添加voicebox工具包。官方下载地址,在command里输入

<!-- lang: shell -->
>> addpath(genpath('E:\soft\Matlab\toolbox\voicebox'))  
>> savepath

路径写自己PC里voicebox的位置。

MFCC流程

MFCC是这样的一个流程:

在此输入图片描述

Matlab实现数据读入

<!-- lang: shell -->
[x,fs,bits,opt_ck]=wavread('turan.wav',[1018 1400]');

x的返回值是一个382*2的数组,说明是左右二通道。该语句读取文件名为turan.wav的音频文件,并将音频数据存储在x中,返回给用户使用。音频数据的值域为[-1,1],被归一化了。

在C里面是把语音数据读入到一个一维数组,因此要进行左右声道数据分离。而Matlab中也为了跟踪调试数据换成单声道。

x=x(:,1); %获取左声道数据

C实现预加重

<!-- lang: cpp -->
void PreEmphasise (float *s, float k)
{
int i;
float preE;//加重系数

preE = k;
for (i=ipframesize;i>=2;i--)
   s[i] -= s[i-1]*preE;
s[1] *= 1.0-preE;
}

预加重在时域上的求法很像差分,在频域上起一个高通滤波器的作用。S2(n)=S(n)-aS(n-1)的传递函数进行Z变换就是H(z)=1-a(Z^(-1))。画出它的频谱图就可以直观看出这是一个高通滤波器,加强语音信号的共振峰。具体关于Z变换的知识可以参加奥本海默《Signals & Systems》P534。如果看不懂,就去做几道信号与系统习题吧。

分帧加窗

我们把语音信号看做平稳的,实际语音信号可能很长。为了便于处理整个信号,每次只处理一小段(10ms~30ms)的数据。这就是分帧,为了保证信号的连续性,帧与帧之间有部分重叠。

而直接对信号进行截断(加矩形窗)会产生频率泄露,一般都是加汉明窗。汉明窗和正弦函数很像,用Matlab命令plot(hamming(100))绘制出的图像如下:

在此输入图片描述

FFT的作用

FFT在一般应用中是用来滤波。先正变换滤掉一部分频谱分量,再作逆变换把信号变回来达到滤波的目的。但是FFT还有另外一个作用,比如在这个应用中是对每一帧进行FFT变换,求频谱进而求得幅度谱。求得的幅度谱用在后面的Mel尺度的三角形滤波器组中。

这次看FFT算法真有种重温旧梦的感觉。对以前学的信号与系统、数字信号处理重新审视了一下,其实这些东西还真是不错。

Refrence

[1].http://my.oschina.net/jamesju/blog/193343

[2].http://hi.baidu.com/sunsee/item/1d669014316d9fdcbe90426c

[3].http://blog.csdn.net/xiaoding133/article/details/8106672

你可能感兴趣的:(语音信号MFCC算法简析)