今天就跟大家聊聊有关如何理解语音信号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算法真有种重温旧梦的感觉。对以前学的信号与系统、数字信号处理重新审视了一下,其实这些东西还真是不错。
看完上述内容,你们对如何理解语音信号MFCC算法有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。