MFCC详细步骤及解析

article/2025/10/20 22:20:52

MFCC(Mel-frequency cepstral coefficients):梅尔频率倒谱系数。梅尔频率是基于人耳听觉特性提出来的, 它与Hz频率成非线性对应关系。梅尔频率倒谱系数(MFCC)则是利用它们之间的这种关系,计算得到的Hz频谱特征。主要有 以下几个步骤:预加重,分帧,加窗,快速傅里叶变换(FFT),梅尔滤波器组,离散余弦变换(DCT).


1. 预加重(Pre-Emphasis)

将数字语音信号s(n)通过一个高通滤波器(high pass filter),公式如下:

y(t)=x(t)αx(t1)

一般 α 取值为0.95/0.97。

作用:

1)加强高频信息,因为一般高频能量比低频小
2)避免FFT操作中的数值问题
3)可能增大信噪比(Signal to Noise Ratio)

注意的是,现代的系统可以将这步用mean normalization代替,详细解释,


2. 分帧(framing)

这里的帧(frame)代表一小段时间t的语音数据。帧由N个采样点组成。
我们要对语音数据做傅里叶变换,将信息从时域转化为频域。但是如果对整段语音做FFT,就会损失时序信息。因此,我们假设在很短的一段时间t内的频率信息不变,对长度为t的帧做傅里叶变换,就能得到对语音数据的频域和时域信息的适当表达。

一般来说,帧的长度取值区间在20ms到40ms之间,相邻帧有50%的重叠(overlapping)。
常用的参数设置: 帧长25ms,步长(stride)10ms(15ms的重叠)

帧长(T),语音数据采样频率(F )和帧的采样点(N)之间的关系:

T=NF


3. 加窗(window)

将信号分帧后,我们将每一帧代入窗函数,窗外的值设定为0,其目的是消除各个帧两端可能会造成的信号不连续性(即谱泄露 spectral leakage)。常用的窗函数有方窗、汉明窗和汉宁窗等,根据窗函数的频域特性,常采用汉明窗(hamming window)。公式如下:

w[n]=0.540.46cos(2πnN1)

窗口长度为N, 0nN1 , 该函数形状如下:

这里写图片描述


4. 快速傅里叶变换(Fast-Fourier-Transform)

对分帧加窗后的各帧信号进行N点傅里叶变换得到各帧的频谱。N为每帧的采样点,通常情况下N的值为256或512。这也叫STFT(Short-Time Fourier-Transform)。

P=|FFT(xi)|2N

其中 xi 是信号x的第i个帧。

这里需要先介绍下Nyquist频率,奈奎斯特频率(Nyquist频率)是离散信号系统采样频率的一半,因哈里·奈奎斯特(Harry Nyquist)或奈奎斯特-香农采样定理得名。采样定理指出,只要离散系统的奈奎斯特频率高于被采样信号的最高频率或带宽,就可以避免混叠现象。在语音系统中我通常采样率取16khz,而人发生的频率在300hz~3400hz之间,按照Nyquist频率的定义就有Nyquist频率等于8khz高于人发生的最高频率,满足Nyquist频率的限制条件。FFT就是根据Nyquist频率截取采样率的一半来计算,具体来说就是,假设一帧有512个采样点,傅里叶变换的点数也是512,经过FFT计算后输出的点数是257(N/2+1),其含义表示的是从0(Hz)到采样率/2(Hz)的N/2+1点频率的成分。也就是说在经过FFT计算时不仅把信号从时域转到了频域并且去除了高于被采样信号的最高频率的点的影响,同时也降低了维度。


5.梅尔滤波器组(Mel Filter Banks)

由于人耳对不同频率的敏感程度不同,且成非线性关系,因此我们将频谱按人耳敏感程度分为多个Mel滤波器组,在Mel刻度范围内,各个滤波器的中心频率是相等间隔的线性分布,但在频率范围不是相等间隔的,这个是由于频率与Mel频率转换的公式形成的,公式如下:

m=2595log10(1+f700)

f=700(10m25951)

将能量谱通过一组Mel尺度的三角形滤波器组,定义一个有M个滤波器的滤波器组(滤波器的个数和临界带的个数相近),采用的滤波器为三角滤波器,一般用40个滤波器,每个滤波在中心频率的响应都是1,然后线性下降,一直到相邻三角滤波的中心频率处为0,如图所示:

这里写图片描述


6. 离散余弦变换(Discrete Cosine Transform)

滤波器组得到的系数是相关性很高的,因此我们用离散余弦变换(Discrete Cosine Transform)来去相关并且降维。一般来说,在自动语音识别(Automatic Speech Recognition)领域,保留得到的倒频谱系数的第2-13个,剩下的抛弃。

reference:

  1. http://haythamfayek.com/2016/04/21/speech-processing-for-machine-learning.html
  2. http://blog.csdn.net/fengzhonghen/article/details/51722555
  3. http://www.speech.cs.cmu.edu/15-492/slides/03_mfcc.pdf

http://chatgpt.dhexx.cn/article/pn4q7DDl.shtml

相关文章

MFCC理解

MFCC 在语音识别(SpeechRecognition)和话者识别(SpeakerRecognition)方面,最常用到的语音特征就是梅尔倒谱系数(Mel-scaleFrequency Cepstral Coefficients,简称MFCC)。根据人耳听觉…

MFCC特征介绍

MFCC特征介绍 在语音识别技术中,需要提取音频的特征,然后就可以使用该音频进行模型的训练或者是进行识别,目前很常用的一种特征叫做MFCC特征,又叫做梅尔倒谱系数特征。MFCC特征保留了语义相关的一些内容,过滤掉了诸如…

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

从倒谱图出发 MFCC是Mel Frequency Cepstral Coefficient的简称,要理解MFCC特征,就需要先明白这里引入的一个新的概念——Cepstral,这个形容词的名词形式为Cepstrum,即倒谱图(频谱图Spectrum前四个字母倒着拼&#xf…

MFCC特征提取

在语音识别方面,最常用到的语音特征就是梅尔倒谱系数(Mel-scaleFrequency Cepstral Coefficients,简称MFCC)。 MFCC的提取过程包括预处理、快速傅里叶变换、Mei滤波器组、对数运算、离散余弦变换、动态特征提取等步骤。 1.预处理 …

MFCC算法讲解及实现(matlab)

史上最详细的MFCC算法实现(附测试数据) 1.matlab安装voicebox语音包2.MFCC原理讲解3.MFCC算法设计实现(matlab)3.1 .wav格式语音文件提取【x(200000*1)】3.2 预加重【x(200000*1)】3.3 分帧{S(301*1103)}3.4 加窗{C(301*1103)}3.5…

Parquet encoding

Dictionary encoding

Parquet原理剖析

行存VS列存 广义的数据分析系统大致分为可以分为计算层、数据格式层和存储层。 计算层主要负责数据查询的介入和各种逻辑计算,如:MR、Spark、Flink。 存储层承载数据持久化存储,以文件语义或类似文件语义(对象存储)对接计算层。 数据格式层&…

Spark 实战 - 3.一文搞懂 parquet

一.引用 parquet 文件常见于 Spark、Hive、Streamin、MapReduce 等大数据场景,通过列式存储和元数据存储的方式实现了高效的数据存储与检索,下面主要讲 parquet 文件在 spark 场景下的存储,读取与使用中可能遇到的坑。 二.Parquet 加载方式 …

Spark Parquet使用

Spark SQL下的Parquet使用最佳实践和代码实战 分类: spark-sql(1) 一、Spark SQL下的Parquet使用最佳实践 1)过去整个业界对大数据的分析的技术栈的Pipeline一般分为以下两种方式: a)Data Source -> HD…

Arrow 之 Parquet

Parquet-format 左边是文件开头及具体的数据, 右边是文件结尾的 Footer Metadata There are three types of metadata: file metadata, column (chunk) metadata and page header metadata. All thrift structures are serialized using the TCompactProtocol. Co…

parquet存入mysql_解密列存 parquet

在做数据分析的时候,相对于传统关系型数据库,我们更倾向于计算列之间的关系。在使用传统关系型数据库时,基于此的设计,我们会扫描很多我们并不关心的列,这导致了查询效率的低下,大部分数据库 io 比较低效。因此目前出现了列式存储。Apache Parquet 是一个列式存储的文件格…

Parquet原理

在互联网大数据应用场景下,通常数据量很大且字段很多, 但每次查询数据只针对其中的少数几个字段,这时候列式存储是极佳的选择。 列式存储要解决的问题: 把IO只给查询需要用到的数据 只加载需要被计算的列空间节省 列式的压缩效…

parquet--golang使用

github 其实如果不适用一些可视化工具解析parquet文件,不太好看parquet文件内部正常应该是什么样的。但是使用一些可视化工具的话,可以发现,parquet文件会像表格,如excel文件,csv文件那样,排列数据。通过结…

Parquet

动机 创建Parquet是利用压缩性,高效的列式存储来在Haddop生态圈任何项目中应用. 记住Parquet是构建在复杂嵌套的数据结构, 并且使用记录分解和集成的算法在Dremely论文中描述.我们相信这种方法是更强大的的可以非常简单的使嵌套命令空间的扁平化. Parquet构建可以非常高效的…

Parquet 存储格式

1.介绍 Apache Parquet 是 Hadoop 生态圈中一种新型列式存储格式,它可以兼容 Hadoop 生态圈中大多数计算框架(Mapreduce、Spark 等),被多种查询引擎支持(Hive、Impala、Drill 等),并且它是语言和平台无关的。 2.特点…

parquet 简介

参考文章:parquet 简介 Parquet原理 【2019-05-29】Parquet 简介 Apache Parquet是一种能够有效存储嵌套数据的列式存储格式。 面向分析型业务的列式存储格式 由 Twitter 和 Cloudera 合作开发,2015 年 5 月从 Apache 的孵化器里毕业成为 Apache 顶…

Parquet文件详解

1、parquet文件简介 Apache Parquet是Apache Hadoop生态系统的一种免费的开源面向列的数据存储格式。 它类似于Hadoop中可用的其他列存储文件格式,如RCFile格式和ORC格式。 Apache Parquet 是由 Twitter 和 Cloudera 最先发起并合作开发的列存项目,也是…

Gson解析json数据

gson是谷歌推出的,除此之外还有阿里的FastJson,官方json和jackjson。下面通过一个实例来讲解使用gson来解析json数据: 1.先做好准备工作,在网上下载Gson的jar包,放到工程的libs(没有此目录的话自己建一个)目录下: ht…

Android Gson解析json

前言: 解析json的库有很多,如:JSON-Java、Gson、Jackson、FastJson…而Gson是谷歌的,相信自有它的好处 简介 用于json与java对象之间的转换通过 序列化和反序列化 实现功能强大,稳定性也好 使用 Gson提供了两个方…

Android 使用 Gson 解析 json 数据及生成

1.导入 Gson 包 第一种导入Gson 包的方式 在 app 文件下的 build.gradle 文件 导入 gson:2.9.1 包 implementation com.google.code.gson:gson:2.9.1第二种导入Gson 包的方式 直接去下载最新的 Gson 包 下载链接:gson.jar 选择最新的包进行下载 将下载的 gson…