Advertisement

语音特征参数MFCC提取过程详解

阅读量:

一、MFCC概述

在语音处理领域中,Mel-Frequency Cepstrum (MFC) 代表一个语音信号的短期功率谱,在梅尔尺度上执行逆余弦变换后所得到的结果。具体而言,在频域中对一个语音信号进行短时加窗处理后计算出其功率谱,在该频域尺度上取对数后再应用逆余弦变换即可得到Mel-Frequency Cepstrum (MFC)这一特征参数。

梅尔频率倒谱系数(Mel-frequency cepstral coefficients, 简称MFCCs)共同构成一个MFC集合,在Mel频域中提取的倒谱特征。与传统的倒谱不同,在MFC中频带采用等间距的Mel尺度划分,在感知特性上更为贴近人类听觉系统的特点。

梅尔倒谱系数(Mel-scale Frequency Cepstral Coefficients, 简称MFCC)。基于对人耳听觉机制的研究发现, 人耳对于不同频率的声音具有不同的敏感度水平。在200Hz至5000Hz频段内的语音信号对其清晰度的影响尤为显著。当两个不同响度的声音同时作用于人耳时,则较高响度声音中的高频成分会对较低响度声音中的低频感知产生影响, 这种现象被称为掩蔽效应。由于低频声音沿内耳蜗基底膜行波传播的距离远高于高频声音, 因此通常情况下, 低频声音能够有效抑制高频声音, 而高频声音难以抑制低频声音。值得注意的是, 在低频区域内的临界带宽范围要小于高频区域。因此, 在处理语音信号时, 我们可以在频率域内按照临界带宽由密到疏地设置一组带通滤波器组进行信号处理。将每个滤波器输出的能量作为信号的基本特征进行分析处理后即可作为语音识别的关键特征输入系统。值得注意的是, 这种特征提取方法无需对输入信号做出任何假设或限制条件, 同时充分利用了人类听觉系统的研究成果优势特点. 因此相比传统的信道模型线性预测编码(LPCC)方法而言, 该参数系统不仅具有更好的鲁棒性优势特性, 而且在信噪比下降的情况下依然能保持较好的识别性能

梅尔倒谱系数(Mel-scale Frequency Cepstral Coefficients, 简称MFCC)源自于Mel尺度频域中的倒谱参数;它反映了人耳对频率感知的非线性特征;而其与频率之间的关系则可通过以下公式进行近似表征:

式中f为频率,单位为Hz。下图展示了Mel频率与线性频率的关系:

人耳的听觉特性遵循Mel频率的变化规律,在此特性下,在实际频率低于1MHz时呈现出线性排列的现象,在实际频率高于1MHz时则表现出对数变化的特点。

二、 MFCC的提取过程

基本流程图如下所示:

1. 预加重

预加重处理其实是将语音信号通过一个高通滤波器:

[

](http://static.oschina.net/uploads/space/2014/0115/165259_ENSs_852488.jpg)

参数μ在区间[0.9, 1.0]内,在实际应用中通常取值为0.97。预加重的作用在于增强高频成分,在确保整个频率范围(从低频到高频)内使得信号频谱趋于平滑,并能在相同信噪比条件下进行频谱分析。这一过程不仅是为了消除发生过程中声带和嘴唇产生的效应而对语音信号进行补偿——即弥补由于发音系统对高频部分抑制所带来的缺失——同时也为了突出语音信号中的高频共振峰特性。

2. 分帧

将N个采样点组合成一个观测单元,并命名为帧,在实际应用中常见参数设置多在256至512范围内使用;这些设置大致覆盖时长在约20至30毫秒之间;为了减少前后帧之间的变化幅度过大这一问题;从而使得每两个相邻帧之间有一个重叠区域;其中包含M个采样点;而M通常取值范围大约在N的一半到三分之一区间内;在语音识别中常用的采样频率通常是8千赫兹至16千赫兹;例如,在采用8千赫兹频率时;若每帧包含有256个采样点,则其对应时间长度计算如下:(即)(具体计算过程略)结果得到时间长度为32毫秒

3. 加窗

对每个帧应用汉明窗窗口函数...以便提高两端的连续性特性。假设通过分帧处理后的信号序列表示为S(n)其中n=0,1,…,N-1N代表每个帧的长度则经过汉明窗处理后得到的新序列可表示为

](http://static.oschina.net/uploads/space/2014/0115/170038_KDjx_852488.jpg) , W(n)形式如下:

[

](http://static.oschina.net/uploads/space/2014/0115/170120_zhHa_852488.jpg)

不同的a值会产生不同的汉明窗,一般情况下a取0.46

4. 快速傅立叶变换

由于在时域中对信号进行分析往往难以直接反映其特性,在频域分析方法则能够更好地揭示其内在规律

[

]()(4)

式中x(n)为输入的语音信号,N表示傅里叶变换的点数。

5. 三角带通滤波器

三角形带通滤波器组的设计过程如下:

基于语音信号的抽样频率设定、帧长设定N=256以及滤波器数量设定为22个的情况而言, 从而推导出最大频率值。

根据公式:

可以求得出最大的Mel频率为:

在Mel频谱尺度上,在一定范围之内各组三角滤波器具有等间距排列的特点。基于此特性可进一步推导出相邻两组三角滤波器中心频率之间的间距计算公式如下:

由此可知,在Mel尺度上的中心频率可通过与线性频率相关的关系式计算得出。各个三角形滤波器的中心频率值均可用此方法确定。

由上面的中心频率可以计算出对应的线性刻度上的频率。如下图所示:

利用一组基于Mel尺度设计的三角形滤波器组对功率谱进行处理,并构建一个包含K个滤波器的设计方案(其中每个设计对应的临界带数量相近)。所有这些设计均采用三角形形状作为其特征函数,在这种情况下每个三角形形状都具有中心频率f(m),其中m从1到K依次取值。在实际应用中通常选择K值在22至26之间。这些不同频率范围内的相邻三角形形状之间的间距随着m值减小而逐渐缩小,在m增大时则会逐渐变宽以适应更高的频率区域

在Mel频率轴上均匀设置了一系列三角形滤波器的中心频率c(l),其中每个三角形滤波器具有明确的上下限边界参数o(h,l)、c(h,l)和h(h,l),这些参数满足特定的关系条件以确保信号的有效分解与重构过程

6. 计算每个滤波器组输出的对数能量为:

[

](http://static.oschina.net/uploads/space/2014/0115/170955_1B4i_852488.jpg)

7. 经离散余弦变换(DCT)得到MFCC系数:

[

]()

将上述对数能量值输入到离散余弦变换算法中进行计算处理后,在Mel尺度下完成倒谱分析以获得第L阶Mel尺度倒谱系数。其中L代表MFCC特征的级数数量,在实际应用中通常选取范围为12至16个等级。这里M表示三角滤波器的数量

8. 对数能量

此外,在每一段中的一帧的能量(定义为该段时间内信号的能量),也是语音的重要特征之一,并且相对容易计算出来。基于此基础之上,在每一段中通常还会增加一帧的对数能量(具体定义如下:每一段内信号平方后累加的结果取常用对数后再乘以10),从而使得每一段的基本语音特征增加了额外的一维信息——其中包括每段的一帧对数能量以及剩余的部分倒频谱参数。

改写说明

9. 动态差分参数的提取(包括一阶差分和二阶差分)

典型的倒谱参数MFCC仅表征了语音参数中的静特;而语音信号中的动特则可通过这些静特之差分谱加以描述。实验结果表明:将动特与静特结合能有效提升系统的识别能力;差分参数计算采用以下公式

[

]()(8)

在式中,Δt代表第t时刻的一阶差分,C_t代表第t个倒谱系数,Q定义为倒谱系数的最高阶数,而K则表示一阶导数的时间间隔,其取值范围为1或2.通过将上式的计算结果再次代入公式,则可以得到二阶差分的参数.

总结:

因此,MFCC的全部组成其实是由:

该系统采用一种三维MFCC特征组合方案(包括N/3个MFCC系数、N/3个一阶差分参数以及N/3个二阶差分参数)并附加了帧能量特征(其中一项可根据需求进行替换)。该方案通过将不同维度的信息融合在一起实现语音识别任务。

三、Matlab实现

复制代码
    % MFCC implement with Matlab %
    [x fs]=wavread('test.wav');
    bank=melbankm(24,256,fs,0,0.4,'t'); %Mel滤波器的阶数为24,FFT变换的长度为256,采样频率为16000Hz
    %归一化Mel滤波器组系数
    bank=full(bank); %full() convert sparse matrix to full matrix
    bank=bank/max(bank(:));
    for k=1:12
    n=0:23;
    dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24));
    end
    w=1+6*sin(pi*[1:12]./12);%归一化倒谱提升窗口
    w=w/max(w);%预加重滤波器
    xx=double(x);
    xx=filter([1-0.9375],1,xx);%语音信号分帧
    xx=enframe(xx,256,80);%对xx 256点分为一帧
    %计算每帧的MFCC参数
    for i=1:size(xx,1)
    y=xx(i,:);
    s=y'.*hamming(256);
    t=abs(fft(s));%FFT快速傅里叶变换
    t=t.^2;
    c1=dctcoef*log(bank*t(1:129));
    c2=c1.*w';
    m(i,:)=c2;
    end
    %求一阶差分系数
    dtm=zeros(size(m));
    for i=3:size(m,1)-2
    dtm(i,:)=-2*m(i-2,:)-m(i-1,:)+m(i+1,:)+2*m(i+2,:);
    end
    dtm=dtm/3;
    %求取二阶差分系数
    dtmm=zeros(size(dtm));
    for i=3:size(dtm,1)-2
    dtmm(i,:)=-2*dtm(i-2,:)-dtm(i-1,:)+dtm(i+1,:)+2*dtm(i+2,:);
    end
    dtmm=dtmm/3;
    %合并mfcc参数和一阶差分mfcc参数
    ccc=[m dtm dtmm];
    %去除首尾两帧,以为这两帧的一阶差分参数为0
    ccc=ccc(3:size(m,1)-2,:);
    ccc;
    subplot(2,1,1);
    ccc_1=ccc(:,1);
    plot(ccc_1);title('MFCC');ylabel('幅值');
    [h,w]=size(ccc);
    A=size(ccc);
    subplot(2,1,2);
    plot([1,w],A);
    xlabel('维数');ylabel('幅值');
    title('维数与幅值的关系');

所得结果为:

全部评论 (0)

还没有任何评论哟~