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

这篇具有很好参考价值的文章主要介绍了深入理解MFCC(梅尔频率倒谱系数)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从倒谱图出发

  • MFCC是Mel Frequency Cepstral Coefficient的简称,要理解MFCC特征,就需要先明白这里引入的一个新的概念——Cepstral,这个形容词的名词形式为Cepstrum,即倒谱图(频谱图Spectrum前四个字母倒着拼)
  • 倒谱图是用来“提取”语音的音色(timbre)的,音色是区分说话人最有力的特征,尤其是在前深度学习时代。先直接给出求倒谱图的公式:
    C [ x ( n ) ] = F − 1 [ l o g ( ∣ F [ x ( n ) ] ∣ 2 ) ] C[x(n)] = F^{-1}[ log(|F[x(n)]|^2) ] C[x(n)]=F1[log(F[x(n)]2)]
  • 其中 x ( n ) x(n) x(n)是离散化的原始信号, F [ ⋅ ] F[\cdot] F[]是离散傅里叶变换, l o g ( ∣ ⋅ ∣ 2 ) log(|\cdot|^2) log(2)对离散傅里叶变换的结果,先取幅值,再取平方,最后取对数, F − 1 [ ⋅ ] F^{-1}[\cdot] F1[]是离散傅里叶逆变换。
    下面是每一步的演示图:
    深入理解MFCC(梅尔频率倒谱系数)
    深入理解MFCC(梅尔频率倒谱系数)
    深入理解MFCC(梅尔频率倒谱系数)
  • 最后逆变换得到的倒谱图,横坐标为倒频率(Quefrency,频率的倒数,单位是秒),纵坐标是振幅。
  • 最后一张图中的所谓1st rhamonic,是从倒谱图的右边往左看的第一个尖峰,实际上,这个1st rhamonic对应原始信号的基频。
  • 要理解本节的内容,需要有离散傅里叶变换和梅尔时频谱图的知识,可以参考深入理解傅里叶变换(三)和深入理解梅尔刻度、梅尔滤波器组和梅尔时频谱图。

为什么倒谱图能提取音色

  • 最初发出振动从而产生声音的物体,被称为声源,对于语音而言,声源就是人的声带。
  • 人的肺部排出气体,这些气体通过声门(glottis),形成脉冲(glottis pulse),此时的脉冲频率决定了声音的音高,脉冲使声带振动,声带具有共振频率,会加强该脉冲。因为声源就是人的声带,所以声带的共振频率,称为此时这段语音的基频
  • 该脉冲还需要通过声道(vocal tract)才能从人的口中离开,成为能听到的语音。声道具有共振频率,随着声道的形状和大小变化,共振频率会发生变化,声道的共振频率的存在,使语音信号出现共振峰
  • 声门脉冲、基频和共振峰、声强,对应声音的三要素:音高、音色、响度。
    深入理解MFCC(梅尔频率倒谱系数)
  • 那么倒谱图为什么能提取音色呢?我们想象最开始通过声门的气体,是一种信号,称为Glottal pulses,记为 h ( t ) h(t) h(t),声带和声道的作用等效为一个复杂的滤波器,记为 e ( t ) e(t) e(t),输出的语音信号是Glottal pulses被声道滤波后的信号,记为 x ( t ) x(t) x(t),注意,此时都是连续信号,那么存在下列等式:
    x ( t ) = h ( t ) ∗ e ( t ) x(t) = h(t) * e(t) x(t)=h(t)e(t)
  • 其中, ∗ * 指卷积运算。离散化之后,再进行离散傅里叶变换,时域卷积等价于频域乘积:
    X ( n ) = H ( n ) ⋅ E ( n ) X(n) = H(n) \cdot E(n) X(n)=H(n)E(n)
  • 接下来,先取幅值,再取平方,最后取对数:
    l o g [ ∣ X ( n ) ∣ 2 ] = 2 l o g ∣ H ( n ) ∣ + 2 l o g ∣ E ( n ) ∣ log[|X(n)|^2] = 2log|H(n)| + 2log|E(n)| log[X(n)2]=2logH(n)+2logE(n)
  • 现在已经将语音信号,分解成两个信号的和了,如下图:
    深入理解MFCC(梅尔频率倒谱系数)
  • 左下角是 2 l o g ∣ E ( n ) ∣ 2log|E(n)| 2logE(n),右下角是 2 l o g ∣ H ( n ) ∣ 2log|H(n)| 2logH(n),左下角实际上是语音信号的包络线,右下角是语音信号减去包络线之后的信号。其中,包络线有几个突起的峰(原本应该是尖峰,取对数之后平滑了),表征了基频和共振峰,是我们希望提取的信号。
  • 最后一步是是用离散傅里叶逆变换,得到倒谱图。

MFCC

  • 对于一段音频,MFCC的提取流程如下:
    1. 对音频信号进行预加重,从而提高部分高频能量,降低信号传输中高频损耗的影响。预加重本质上是一阶差分,采用下式处理:
      x [ n ] = x [ n ] − α x [ n − 1 ] , 0.9 ≤ α ≤ 1.0 x[n] = x[n] - \alpha x[n-1],0.9 \le \alpha \le 1.0 x[n]=x[n]αx[n1],0.9α1.0
    2. 短时傅里叶变换
    3. 梅尔滤波器滤波,得到梅尔时频谱图
    4. 取对数,分离信号
    5. 离散余弦变换
    6. 选取倒谱系数
  • MFCC的提取过程改良了最后一步,把离散傅里叶逆变换,改成了离散余弦变换。
  • 因为log-power spectrum的信号,可以视为两个信号的叠加,而我们要提取的基频和共振峰,可以视为叠加后的信号的低频部分。
  • 所以MFCC将log-power spectrum视为一种时域信号,对其进行傅里叶分析,然后取前 n m f c c n_{mfcc} nmfcc 个频率所对应的运算值,作为最后的MFCC特征。
  • 此外,使用离散余弦变换有如下的好处:
    • 是简化版的离散傅里叶变换
    • 运算结果是实数,正是MFCC所需要的
    • 解耦了不同梅尔滤波器组之间的重合权重,使提取出的特征更加相互独立,适用于机器学习
    • 输入log-power spectrum,输出MFCC特征,起到了降维作用

MFCC的输出

  • 通常选取前12个系数,再拼接一个当前frame的能量,共13个。

  • 越靠前的系数,包含越多的基频和共振峰的信息。

  • 取得13个系数后,还会在时序上,对13个系数求一阶差分和二阶差分,二阶差分等价于对一阶差分求一阶差分。一阶差分有后向差分、前向差分的区别,也可以对后向差分和前向差分求均值得到中心差分,中心差分误差最小:

    • 前向差分
      Δ x [ n ] = x [ n + 1 ] − x [ n ] \Delta x[n] = x[n+1] - x[n] Δx[n]=x[n+1]x[n]
    • 后向差分
      Δ x [ n ] = x [ n ] − x [ n − 1 ] \Delta x[n] = x[n] - x[n-1] Δx[n]=x[n]x[n1]
    • 中心差分
      Δ x [ n ] = x [ n + 1 ] − x [ n − 1 ] 2 \Delta x[n] = \frac{x[n+1]-x[n-1]}{2} Δx[n]=2x[n+1]x[n1]

    其中, x [ n ] x[n] x[n]表示第n帧的13个系数,将一阶差分和二阶差分与原函数值拼接起来,得到39个系数。

  • MFCC的输出可以表示为一个二维数组,shape为 [ n m f c c , f r a m e s ] [n_{mfcc},frames] [nmfcc,frames],由于是二维数组,所以可以用热力图可视化。

MFCC的优缺点

  • 优点
    • 相比较梅尔时频谱图,以更少的数据量描述了时频谱图的信息,前者滤波器个数通常为80,MFCC特征个数通常为39
    • 相比较梅尔时频谱图,特征之间的相关性更低,具有更好的区分性
    • 能提取出表征基频和共振峰的信息,滤去其他无关信息
    • 在基于GMM的声学模型中效果较好
  • 缺点
    • 相比较梅尔时频谱图,计算量更大,因为MFCC是在梅尔时频谱图的基础上得到的
    • 对噪声,尤其是加性噪声,不够鲁棒
    • 人工设计的痕迹太重,导致更大的经验风险
    • 对语音合成无效,因为不存在从MFCC特征到音频信号的逆变换

演示

  • 注意:librosa的MFCC提取算法,
    • 默认没有将当前frame的能量作为第13个系数,可以自行求,然后拼接
    • 此外,默认没有一阶差分和二阶差分,也可以自行求,然后拼接
  • 下列代码就计算了一阶差分和二阶差分,然后拼接并可视化。
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np

if "__main__" == __name__:
    filepath = r"20- Extracting MFCCs with Python\female_audio.wav"
    signal, sr = librosa.load(path=filepath, sr=16000)
    N_FFT = 512
    N_MELS = 80
    N_MFCC = 13

    mel_spec = librosa.feature.melspectrogram(y=signal,
                                              sr=sr,
                                              n_fft=N_FFT,
                                              hop_length=sr // 100,
                                              win_length=sr // 40,
                                              n_mels=N_MELS)
    mfcc = librosa.feature.mfcc(S=librosa.power_to_db(mel_spec), n_mfcc=N_MFCC)

    delta_mfcc = librosa.feature.delta(data=mfcc)
    delta2_mfcc = librosa.feature.delta(data=mfcc, order=2)
    mfcc = np.concatenate([mfcc, delta_mfcc, delta2_mfcc], axis=0)

    librosa.display.specshow(data=mfcc,
                             sr=sr,
                             n_fft=N_FFT,
                             hop_length=sr // 100,
                             win_length=sr // 40,
                             x_axis="s")
    plt.colorbar(format="%d")

    plt.show()

深入理解MFCC(梅尔频率倒谱系数)文章来源地址https://www.toymoban.com/news/detail-414350.html

  • 音频信号处理的知识非常广袤,本系列只讲解了用于机器学习的音频信号处理知识。

到了这里,关于深入理解MFCC(梅尔频率倒谱系数)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 理解梅尔频谱(mel spectrogram)

    语音处理中 常常需要用到mel spectrogram,比如在语音分类中常常会把把信号signal变成图片spectrogram的形式, 然后用分类图片的算法(比如CNN)来分类语音。 本文主要介绍什么是mel specgrogram以及如何通过librosa来获取spectrogram 和mel spectrogram 常说一个信号是多少多少赫兹的,指的是

    2024年02月05日
    浏览(28)
  • 深入 Pinia:从代码出发探索 Vue 状态管理的奥秘

    🍍 项目地址:https://github.com/mk965/read-pinia 🧑🏼‍💻 本节代码:https://github.com/mk965/read-pinia/tree/article_1 🚗源码地址: github.com/vuejs/pinia 📦打包文件: rollup.config.js 🚪入口文件: packages/pinia/src/index.ts 将 pinia/packages/pinia/src 目录下的所有文件复制到我们之前生成项目的 /src

    2023年04月25日
    浏览(85)
  • 理解ROS Topic 通信频率背后的机制

    Topic是ROS的三种通信方式中最为基本、也是常用的一种。本文对于ROS的Topic通信背后的数据吞吐机制做一个较为详细、深入的介绍。 ROS中发布一个topic的函数是这样的 有三个参数: topic 就是我们要发布的话题, queue_size 是publisher队列中可以存储的消息数量, latch 是锁存,比如

    2024年02月08日
    浏览(31)
  • STM32定时器的预装载值和预分频系数怎么理解

    我之前也是对这个很疑惑,知道我查询到一个网友的回答,感觉将的很通讯易通,边记录下来 根据定时器时钟的频率,比如时钟的频率是72MHZ,可以理解为一秒钟STM32会自己数72M次,预分频系数就是将频率分割,比如分频系数是72,则该时钟的频率会变成72MHZ/72=1MHZ,但是在设

    2024年02月15日
    浏览(32)
  • 学习stm32 pwm 多路舵机的控制(PWM 的频率的理解)

    接着上一节,pwm 的使用,控制多路舵机进行角度旋转和设置。 参考stm32f103x中文说明时钟树如下图 1.当HSI被用于作为PLL时钟的输入时,系统时钟能得到的最大频率是64MHz。 2.对于内部和外部时钟源的特性,请参考相应产品数据手册中“电气特性”章节。 用户可通过多个预分

    2024年02月13日
    浏览(23)
  • Python画音频语谱图

    语谱图指将一维的时间域音频信号 x∈R(1×n) 通过短时傅里叶变换(STFT)后得到的二维信号 X∈R(t×f) ,其中t和f分别表示时间帧数和频率段数,且语谱图的值为复数。 代码如下: 本人画图时疑惑过dB为什么有正负值这一问题,特查阅资料(链接)

    2024年02月16日
    浏览(27)
  • 谱图论:Laplacian算子及其谱性质

    给定无向图 (G=(V, E)) ,我们在上一篇博客《谱图论:Laplacian二次型和Markov转移算子》中介绍了其对应的Laplacian二次型: [mathcal{E}[f]=frac{1}{2} cdot mathbb{E}_{u sim v}left[(f(u)-f(v))^2right]] 这里 (f: Vrightarrow mathbb{R}) 为图的顶点标签, (usim v) 表示服从均匀分布的随机无向边

    2024年02月08日
    浏览(33)
  • 一、音频基础-音频分析的重要工具(语谱图)

    通过前面的描述可以知道,声音的本质就是各种声波,那么任意某一个时刻,都不可能是只有一个频率的波,而且声波也不可能是我们理解的标准的正弦波: 而一般我们对声音进行处理时,需要分析出频率当中的有哪些频率,然后才能进行后续的处理,这时候就用到傅里叶转

    2024年02月17日
    浏览(29)
  • 【linux深入剖析】深入理解基础外设--磁盘以及理解文件系统

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 我们所有的文件都是与进程相关的文件–进程打开的文件 系统中是不是所有的文件都被打开了呢?如果没

    2024年04月11日
    浏览(37)
  • 谱图论:Laplacian二次型和Markov转移算子

    以下部分是我学习CMU 15-751: TCS Toolkit的课堂笔记。由于只是个人笔记,因此许多地方在推导上可能不那么严谨,还望理论大佬多多包涵。 在本文中,我们将研究对象限定在无向图(undirected graph) (G=(V, E)) ,且满足: 有限(finite); 允许重边和自环; 不允许度为0的顶点(即

    2024年02月08日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包