当前位置:   article > 正文

c++ 提取傅里叶描述子_MFCC特征提取

c++实现mfcc特征提取

deaa03a545f4fe0e11695256828fb9bf.png

梅尔倒谱系数(MFCC)做为语音信号处理中的常见特征之一,在各个语音任务中都取得了不错的效果,本文将讲解一下MFCC特征的通用的提取过程。与大家一起探讨一下~

9240e013c1ded26dba76691ccd73e98d.png
MFCC特征通用提取过程

预设连续语音为

共含有107000个点;预加重系数
帧长为
,帧移
;窗函数为
,fft的个数为
,采样频率为

预加重、分帧、加窗

  • 预加重

预加重的目的是为了去除口唇辐射的影响,增加语音的高频分辨率,其具体实现可以用差分方程实现:


预加重后,语音信号变化为
,数组大小还是107000。 其中预加重系数
  • 分帧

为了保证输入信号是平稳的,我们需要将语音分成一小段(帧),也就是分帧。帧数为

,则其
numframes 

对连续语音

个采样点为一帧的长度,以
个采样点为相邻帧移动的距离,对不足一帧长的进行补零,最终我们可以获得
个帧。
  • 加窗

加窗是为了解决由于信号的非周期截断,导致频谱在整个频带内发生了拖尾现象的泄漏问题,可以使得使全局更加连续,避免出现吉布斯效应。窗函数一般为“汉明”窗、‘’‘汉宁’窗、矩形窗。

加窗相当于把每一语音帧里面的抽样点与窗函数中对应元素的相乘。设每一帧为

则加窗操作为:
  1. for i in range(frame_len):
  2. x[i] = x[i]*w[i]

快速傅里叶变换 FFT

离散傅里叶变化的公式如下:

,其中

为满足FFT“分治”的策略,我们需要对帧长

进行补零,使其补零后的长度
为2的幂次方;比如当原始帧长为
,我们对其进行补零后的长度为
,其中
  • 在采样频率 为
    的情况下,
    的n只是一个离散的数值,那每一点到底代表了什么频率分量?
假设采样频率是
,则
,所以事实上把
的式子里面的
替换。很明显,在特定的
点的频率分量的频率为
,从而得出
代表的是频率为
的频率“分量”

因为傅里叶变化固有的性质:实数信号变换的结果

是一组复数,里面一半数据和另一半是共轭的,因此有一半的FFT是多余的,所以经过的FFT输出的维度为
,(实数和虚数不分开表示的情况下)经过FFT后,计算频谱图的功率谱。

Mel滤波器组

MFCC的分析着眼于人耳的听觉特征,人耳所听到的声音高低与声音的频率并不成线性正比关系,而用Mel频率尺度更符合人耳的听觉特性。Mel频率与实际频率的具体关系为如下:

67aba292322d242ac028487dd1445a7a.png
Mel频率尺度滤波器组

其实现过程如下:

baf8c1743d027b7a76b49e710a3a8b7f.png
相邻三角形滤波器之间的关系
  1. 根据上述公式将实际频率尺度转化为Mel频率尺度
  2. 在Mel频率域上确定最低频率
    、与最高频率
    和Mel滤波器个数
    。将每一个三角形滤波器的中心频率
    在Mel频率与上等间隔分配。设
    分别为第
    个三角形滤波器的下限、中心频率、上限,则:
  3. 每个三角形滤波器
    为:

4.根据语音信号的功率谱

,求每一个三角形滤波器的输出:

注意上述式子的采样点“k”与实际频率f的对应关系为:

倒谱分析

语音信号的倒谱分析就是求信号倒谱特征参数的过程,可以通过同态处理来处理。同态处理实现了卷积关系变化为求和关系的分离操作。

8a728ab135462025e59d7f63e1dae381.png
频谱图

上图是一个语音的频率图,其中红色细线为频谱的包络(Spectral Envelope),包络携带声音的辨识属性,特别重要,因此我们需要把它提取出来。为了将其提取出来,我可以使用同态处理的方法:

  1. 我们可以将频谱看成频谱包络(Spectral Envelope)与频谱细节(Spectral details)的乘积。因此我们对其求log,将其转化为加性关系
  2. 其中频谱包络(Spectral Envelope)可以视为“低频信号”、频谱细节(Spectral details)可以识别“高频信号”
  3. 通过DCT将其分离,我们称为“倒谱”,对DCT结果保存前若干维的低频信息即为频谱包络(Spectral Envelope)

29fb65acaf7d3a5d81171ff74af24c93.png

Delta与二阶Delta

MFCC只是描述了一帧语音上的谱包络,但是语音信号似乎有一些动态上的信息,因此就引入了一阶差分(deltas)和二阶差分(deltas-deltas),其计算公式如下:

其中t表示第几帧,N通常取2,c指的就是MFCC中的某个系数。deltas-deltas就是在deltas上再计算以此deltas。

引用

furious:深入理解离散傅里叶变换(DFT)​zhuanlan.zhihu.com
edfb2d830a652de9170db57f4347cbc3.png
Anssel:AI(I)语音(I):MFCC特征参数提取​zhuanlan.zhihu.com
6d928b86537429f5ac3f1315a29a9801.png
倒谱分析(Cepstrum Analysis)​blog.csdn.net
a792f5c3c867738775cb6ba8b84043f3.png

《语音信号处理》赵力著

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/104929
推荐阅读
相关标签
  

闽ICP备14008679号