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

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

Mel频率和Hz频率的关系

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

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

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

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

Fmel=2595lg(1+f/700)F_{mel}=2595lg(1+f/700) Fmel​=2595lg(1+f/700)
FmelF_{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−az−1H(z)=1-az^{-1} H(z)=1−az−1
式中,a为一个常数。

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

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

2、快速傅里叶变换

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

3、计算谱线能量

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

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

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

5、计算DCT倒谱

FFT倒谱x^(n)\hat x(n)x^(n)为:
x^(n)=FT−1[X^(k)]\hat x(n)=FT^{-1}[\hat X(k)] x^(n)=FT−1[X^(k)]
式中,
X^(k)=lnFT[x(n)]=lnX(k)\hat X(k)=ln{FT[x(n)]}=ln{X(k)} X^(k)=lnFT[x(n)]=lnX(k)
而序列x(n)的DCT为:
X(k)=2N∑n=0N−1C(k)x(n)cos[π(2n+1)k2N],k=0,1,⋯,N−1X(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=0∑N−1​C(k)x(n)cos[2Nπ(2n+1)k​],k=0,1,⋯,N−1
式中,参数N是序列x(n)的长度,C(k)是正交因子,可表示为:
C(k)={22,k=01,k=1,2,⋯,N−1C(k)=\begin{cases} \frac{\sqrt2}{2},k=0\\ 1, k=1,2,\cdots,N-1\end{cases} C(k)={22​​,k=01,k=1,2,⋯,N−1​
DCT倒谱和FFT倒谱很相似。把mel滤波器的能量取对数后,再计算DCT:
mfcc(i,n)=2M∑m=0M−1log[S(i,m)]cos[πn(2m−1)2M],k=0,1,⋯,N−1mfcc(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=0∑M−1​log[S(i,m)]cos[2Mπn(2m−1)​],k=0,1,⋯,N−1
式中S(i,m)是第4步求出的Mel滤波器能量。m是指第m个Mel滤波器,i是指第i帧,n是DCT后的谱线。

这样就计算出了MFCC参数。

6、倒谱提升窗口

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

c^m=ωmCm\hat c_m=\omega_mC_m c^m​=ωm​Cm​

7、差分倒谱参数

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

差分参数的计算公式如下:
d(n)=1∑i=−kki2∑i=−kki⋅c(n+i)d(n)=\frac{1}{\sqrt{\sum^k_{i=-k}i^2}}\sum^k_{i=-k}i·c(n+i) d(n)=∑i=−kk​i2​1​i=−k∑k​i⋅c(n+i)
这里c和d都表示一帧语音参数,k为常数,通常取2,这时差分参数就称为当前帧的前两帧和后两帧参数的线性组合。

由此公式可求出差分参数的一阶MFCC差分参数,用同样的公式对一阶差分参数进行计算,可以得到二阶差分MFCC参数。实际应用中,将MFCC参数和各阶差分参数合并为一个完整的矢量,作为一帧语音信号的参数。

mfcc代码

代码如下:

function ccc=mfcc_m(x,fs,p,frameSize,inc)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                 function ccc=mfcc_m(x);
%对输入的语音序列x进行MFCC参数的提取,返回MFCC参数和一阶
%差分MFCC参数,Mel滤波器的个数为p,采样频率为fs
%对x每frameSize点分为一帧,相邻两帧之间的帧移为inc
% FFT的长度为帧长
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 按帧长为frameSize,Mel滤波器的个数为p,采样频率为fs
% 提取Mel滤波器参数,用汉明窗函数
bank=melbankm(p,frameSize,fs,0,0.5,'m');
% 归一化Mel滤波器组系数
bank=full(bank);
bank=bank/max(bank(:));% DCT系数,12*p
for k=1:12n=0:p-1;dctcoef(k,:)=cos((2*n+1)*k*pi/(2*p));
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,frameSize,inc);
n2=fix(frameSize/2)+1;
% 计算每帧的MFCC参数
for i=1:size(xx,1)y = xx(i,:);s = y' .* hamming(frameSize);t = abs(fft(s));t = t.^2;c1=dctcoef * log(bank * t(1:n2));c2 = c1.*w'; % 倒谱提升m(i,:)=c2';
end%差分系数
dtm = zeros(size(m));
for i=3:size(m,1)-2dtm(i,:) = -2*m(i-2,:) - m(i-1,:) + m(i+1,:) + 2*m(i+2,:);
end
dtm = dtm / 3;
%合并MFCC参数和一阶差分MFCC参数
ccc = [m dtm];
%去除首尾两帧,因为这两帧的一阶差分参数为0
ccc = ccc(3:size(m,1)-2,:);

Mel频率倒谱系数-MFCC相关推荐

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

    声音处理之-梅尔频率倒谱系数(MFCC) 梅尔(Mel)频率分析 在语音识别(SpeechRecognition)和话者识别(SpeakerRecognition)方面,最常用到的语音特征就是梅尔倒谱 ...

  2. 语音信号的梅尔频率倒谱系数(MFCC)的原理讲解及python实现

    梅尔倒谱系数(MFCC) 梅尔倒谱系数(Mel-scale FrequencyCepstral Coefficients,简称MFCC).依据人的听觉实验结果来分析语音的频谱, MFCC分析依据的听觉 ...

  3. 语音信号的同态处理、倒谱分析和Mel频率倒谱系数

    1 同态处理 信号的同态处理也称同态滤波.大概步骤为: f(x,y)→ln→DFT→H(u,v)→(DFT)-1→exp→g(x,y) 虽然,一般用于图像处理.但是,博主将同态滤波用于语音信号的滤波. ...

  4. 梅尔频率倒谱系数MFCC总结

    一.听觉特性. 人们不能完全搞清楚人耳的内部构造,这就不能利用状态空间的方法来分析人耳的听觉特性.但是,可以把人耳当成黑匣子,声音作为激励,人类的反应作为响应,利用信号与系统的经典分析方法,把声音作用 ...

  5. 语音信号处理之(四)梅尔频率倒谱系数(MFCC)

    在任意一个Automatic speech recognition 系统中,第一步就是提取特征.换句话说,我们需要把音频信号中具有辨识性的成分提取出来,然后把其他的乱七八糟的信息扔掉,例如背景噪声啊, ...

  6. 基于听觉特性的Mel频率倒谱分析

    基于听觉特性的Mel频率倒谱分析 心理学研究表明:人类对于声音音调的感觉其实都不是线性的 客观上:用频率表示 主观上:音调的单位用Mel标度 公式 根据人耳对低频信号比对高频信号更敏感这一原则,研究者 ...

  7. MFCC梅尔频率倒谱系数

    MFCC梅尔频率倒谱系数原理及python实现 文章目录 MFCC梅尔频率倒谱系数原理及python实现 MFCC梅尔频率倒谱系数的原理 计算MFCC的步骤 1.音频信号文件读取及预加重 2.信号分帧 ...

  8. 【语音识别】之梅尔频率倒谱系数(mfcc)及Python实现

    [语音识别]之梅尔频率倒谱系数(mfcc)及Python实现 一.mel滤波器 二.mfcc特征 Python实现 语音识别系统的第一步是进行特征提取,mfcc是描述短时功率谱包络的一种特征,在语音识 ...

  9. 深入理解MFCC(梅尔频率倒谱系数)

    从倒谱图出发 MFCC是Mel Frequency Cepstral Coefficient的简称,要理解MFCC特征,就需要先明白这里引入的一个新的概念--Cepstral,这个形容词的名词形式为C ...

最新文章

  1. 2015内蒙古计算机考试成绩,2015年新疆公务员考试笔试成绩计算机加分说明
  2. Effective Java读书笔记五:异常
  3. Buuctf(pwn)ciscn_2019_n_8
  4. vs2008打开vs2010所做的项目的方法
  5. 如何自定义类加载器?
  6. windows安全模式_Windows 安全模式的功能和作用
  7. ubantu下面U盘无法识别
  8. hdu 4323 Magic Number dp 多校联合赛(三)第四题
  9. matlab用实时脚本编写函数,matlab中关于函数文件和脚本文件使用实例(转载)
  10. Kettle(Pentaho Data Integration) 下载安装使用介绍/功能汇总
  11. python word转excel题库_【Python应用软件】Word表格怎么转换Excel#Word表格汇总Excel
  12. Mybatis-plus最新代码生成器(3.5.1+)的使用
  13. 8box播放器的引用
  14. 蓝牙Bluetooth模块介绍
  15. MyBatis实战【上】
  16. CTF CRYPTO 从零开始的RSA1
  17. java 类继承命名_Java oop 代码7:A1,A2继承A且B1,B1继承B且A,B继承C的商品类,人物模型类两道题...
  18. uniapp开发微信小程序使用painter生成海报
  19. 超级浏览器怎么使用,1分钟讲清楚
  20. SWF逆向之AnyGantt 去水印

热门文章

  1. 【激光测距仪方案】激光测距仪的测量原理及作用方法
  2. Symantec Backup Exec备份SAN存储上的VMware
  3. ecshop 简单修改 可做淘宝客网站
  4. ISDB-T DVB-T DTV ATV
  5. uni-app 页面生命周期
  6. No constructor found in com.think.pojo.Curd matching [java.lang.Long, java
  7. 使用这个传感器模块,你也可以监测你身边的空气质量了
  8. mac mini u盘安装系统_用u盘安装win7系统详细步骤
  9. 我要学编程,看什么书好?--^_^,这里推荐一些个人觉得很不错的书(三)
  10. The Pilots Brothers refrigerator's 题解