Mel频率倒谱系数-MFCC

Posted Squid _

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mel频率倒谱系数-MFCC相关的知识,希望对你有一定的参考价值。

MFCC:Mel频率倒谱系数的缩写。

目的:模拟人耳对不同频率语音的感知

Mel频率和Hz频率的关系

人类对不同频率语音有不同的感知能力:

  • 1kHz以下,与频率成线性关系。
  • 1kHz以上,与频率成对数关系。

Mel频率倒谱系数(MFCC)则是利用它们之间的这种关系,计算得到的Hz频谱特征。

由于Mel频率与Hz频率之间非线性的对应关系,使得MFCC随着频率的提高,其计算精度随之下降。因此,在应用中常常只使用低频MFCC,而丢弃中高频MFCC。

F m e l = 2595 l g ( 1 + f / 700 ) F_{mel}=2595lg(1+f/700) Fmel=2595lg(1+f/700)
F m e l F_{mel} Fmel是以美尔(Mel)为单位的感知频率;f是以Hz为单位的实际频率。

Mel滤波器组

具体频率组的公式后面再说

在matlab中有个voicebox工具箱中有一个melbankm函数可用于计算Mel滤波器组。

h=melbankm(p,n,fs,fl,fh,w);
%{
fs是采样频率
fh是设计滤波器最高频率(用fs进行归一,一般为0)
fl是设计滤波器最低频率(用fs进行归一,一般为0.5)
p是在fl和fh之间设计mel滤波器的个数
n是一帧FFT后数据的长度
w是窗函数,'t'是三角窗,'n'和'm'是海明窗和汉宁窗
输出h是滤波器的频域响应,是一个p*(n/2+1)的数组,p个滤波器就有p个滤波器的频域响应,每个滤波器的响应曲线长为n/2+1,相当于取正频率的部分
}%

我们可以用代码的形式画出mel滤波器组的样子:

% pr3_3_1 
clear all; clc; close all;

% 调用melbankm函数,在0-0.5区间设计24个Mel滤波器,用三角形窗函数
bank=melbankm(24,256,8000,0,0.5,'t');
bank=full(bank);
bank=bank/max(bank(:));              % 幅值归一化

df=8000/256;                         % 计算分辨率
ff=(0:128)*df;                       % 频率坐标刻度
for k=1 : 24                         % 绘制24个Mel滤波器响应曲线
    plot(ff,bank(k,:),'k','linewidth',2); hold on;
end
hold off; grid;
xlabel('频率/Hz'); ylabel('相对幅值')
title('Mel滤波器组的频率响应曲线')

得出下图

mfcc特征参数的提取

步骤:

1、预处理(预加重、分帧、加窗)

2、快速傅里叶变换

3、计算谱线能量

4、计算通过Mel滤波器的能量

5、计算DCT倒谱

1、预处理

之前讲过分帧分窗了

预加重:目的是为了补偿高频分量的损失,提升高频分量。预加重的滤波器常设为
H ( z ) = 1 − a z − 1 H(z)=1-az^{-1} H(z)=1az1
式中,a为一个常数。

分帧:由于语音信号是一个准稳态信号,把它分成较短的帧,在每一帧中可将其看做稳态信号,可用处理稳态信号的方法来处理。同时,为了使一帧到另一帧之间参数能较平稳的过渡,在两帧之间互相有部分重叠。

加窗:目的是减少频域中的泄漏,将对每一帧语音乘以汉明窗或海宁窗。语音信号处理x(n)经处理后为 x i ( m ) x_i(m) xi(m),其中下标为第i帧。

2、快速傅里叶变换

将时域数据变成频域数据
X ( i , k ) = F F T ( x i ( m ) ) X(i,k)=FFT(x_i(m)) X(i,k)=FFT(xi(m))

3、计算谱线能量

对每一帧FFT后的数据计算谱线的能量:
E ( i , k ) = [ X ( i , k ) ] 2 E(i,k)=[X(i,k)]^2 E(i,k)=[X(i,k)]2

4、计算通过Mel滤波器的能量

把求出的每帧谱线能量谱通过Mel滤波器,并计算在该Mel滤波器中的能量。在频域中相当于把每帧的能量谱E(i,k)(其中i表示第i帧,k表示频谱中第k条谱线)与滤波器的频域响应 H m ( k ) H_m(k) Hm(k)相乘并相加:
S ( i , m ) = ∑ k = 0 N − 1 E ( i , k ) H m K , 0 ≤ m < M S(i,m)=\\sum_{k=0}^{N-1}E(i,k)H_mK, 0\\leq m<M S(i,m)=k=0N1E(i,k)HmK,0m<M

5、计算DCT倒谱

FFT倒谱 x ^ ( n ) \\hat x(n) x^(n)为:
x ^ ( n ) = F T − 1 [ X ^ ( k ) ] \\hat x(n)=FT^{-1}[\\hat X(k)] x^(n)=FT1[X^(k)]
式中,
X ^ ( k ) = l n F T [ x ( n ) ] = l n X ( k ) \\hat X(k)=ln{FT[x(n)]}=ln{X(k)} X^(k)=lnFT[x(n)]=lnX(k)
而序列x(n)的DCT为:
X ( k ) = 2 N ∑ n = 0 N − 1 C ( k ) x ( n ) c o s [ π ( 2 n + 1 ) k 2 N ] , k = 0 , 1 , ⋯   , N − 1 X(k)=\\sqrt{\\frac{2}{N}}\\sum^{N-1}_{n=0}C(k)x(n)cos[\\frac{\\pi(2n+1)k}{2N}],k=0,1,\\cdots,N-1 X(k)=N2 n=0N1C(k)x(n)cos[2Nπ(2n+1)k],k=0,1,,N1
式中,参数N是序列x(n)的长度,C(k)是正交因子,可表示为:
C ( k ) = { 2 2 , k = 0 1 , k = 1 , 2 , ⋯   , N − 1 C(k)=\\begin{cases} \\frac{\\sqrt2}{2},k=0\\\\ 1, k=1,2,\\cdots,N-1\\end{cases} C(k)={22 k=01k=1,2,,N1
DCT倒谱和FFT倒谱很相似。把mel滤波器的能量取对数后,再计算DCT:
m f c c ( i , n ) = 2 M ∑ m = 0 M − 1 l o g [ S ( i , m ) ] c o s [ π n ( 2 m − 1 ) 2 M ] , k = 0 , 1 , ⋯   , N − 1 mfcc(i,n)=\\sqrt{\\frac{2}{M}}\\sum^{M-1}_{m=0}log[S(i,m)]cos[\\frac{\\pi n(2m-1)}{2M}],k=0,1,\\cdots,N-1 mfcc(i,n)=M2 m=0M1log[S(i,m)]cos[2Mπn(2m1)],k=0,1,,N1
式中S(i,m)是第4步求出的Mel滤波器能量。m是指第m个Mel滤波器,i是指第i帧,n是DCT后的谱线。

这样就计算出了MFCC参数。

6、倒谱提升窗口

在为每帧数据计算出K阶MFCC参数后,通常还要为这K个系数分别乘以不同的权系数ω,实际上是一个短的窗口。
ω m = 1 + K 2 s i n ( π m K ) , 1 ≤ m ≤ K \\omega_m=1+\\frac{K}{2}sin(\\frac{\\pi m}{K}),1\\leq m\\leq K ωm=1+2Ksin(Kπm),1mK

c ^ m = ω m C m \\hat c_m=\\omega_mC_m c^m=ωmCm

7、差分倒谱参数

标准的MFCC参数只反映了语音参数的静态特性,而人耳对语音的动态特征更为敏感,如何获得反映语音动态变化的参数,通常是用差分倒谱参数来描述这种特性。

差分参数的计算公式如下:
d ( n ) = 1 ∑ i = − k k i

以上是关于Mel频率倒谱系数-MFCC的主要内容,如果未能解决你的问题,请参考以下文章

声音处理之-梅尔频率倒谱系数(MFCC)

浅谈MFCC

MFCC、FBank、LPC总结

语音识别基于MFCC的GMM语音识别matlab源码

C/C++ 中的梅尔频率倒谱系数 (MFCC)

语音识别基于MFCC和SVM的特定人性别识别matlab源码