笔记来源于https://www.cnblogs.com/LXP-Never/p/10918590.html#top,该文是笔者在从零开始学习过程中所做的笔记,如果错误,欢迎指正!
MFCC是依据人的听觉实验结果来对语音的频谱进行处理的一种方法,其基本流程包括预加重、分帧、加窗、FFT、Mel滤波器组、DCT。
预加重
预加重处理其实是将语音信号通过一个高通滤波器,计算公式为
y
(
t
)
=
x
(
t
)
−
α
x
(
t
−
1
)
,
y(t)=x(t)-\alpha x(t-1),
y(t)=x(t)−αx(t−1),
其中
α
\alpha
α常取值为0.97或0.95。预加重的作用是平衡频谱,避免在傅里叶变换的计算过程中出现数值问题,改善信噪比(信噪比的定义为信号功率与噪声功率的比率,用于比较所需信号的强度与背景噪声的强度)。
分帧
在完成预加重处理后,需要将信号分成短时帧,这是因为音频信号中的频率是随时间变化的,随着时间的推移会丢失频率的信息,所以在大多数情况下,直接对音频信号进行傅里叶变换是没有意义的。因此假设信号中的频率在短时间内是平稳的,可以在所截取的短时帧内进行傅里叶变换,进而连接相邻帧得到信号频率轮廓的良好近似。
分帧的具体操作为将N个采样点合成一个观测单位(即帧,N的取值常为256或512),同时为了避免相邻帧的变化过大,往往会保证相邻帧之间有一定长度的重复,在取帧中如果所得帧长度不够则以0补充。
加窗
在完成分帧处理后,会对每个帧乘以一个窗函数(如汉明窗),用以增加帧左端和右端的连续性,其计算公式为
W
(
n
,
a
)
=
(
1
−
a
)
−
a
×
cos
(
2
π
n
N
−
1
)
,
W(n, a)=(1-a)-a \times \cos \left(\frac{2 \pi n}{N-1}\right),
W(n,a)=(1−a)−a×cos(N−12πn),
其中
N
N
N即为上述所选取的帧的长度,
a
a
a常取0.46,
n
n
n取1到
N
N
N,加窗处理即将帧内对应位置的数据乘以该函数对应位置的数据,所得结果即为处理完的数据。
FFT
傅里叶变换
傅里叶变换可以将一个周期函数表达成三角函数的线性组合,根据组成该函数的三角函数的周期,与平时从时间的维度观察函数不同,傅里叶变换可以从频率高低的维度观察函数,即可以得到该函数在不同频率上的分布(即频谱,频谱是频率谱密度的简称,是频率的分布曲线),即一个信号由哪些正弦波叠加而成。
但是傅里叶变换有个缺点,其处理过程中会忽略信号的时间信息,对非平稳信号处理有天生的缺陷。且由于计算机中表达数据是离散的,所以对计算机中数据采用傅里叶变换时采用的是离散傅里叶变换(DFT)。
离散傅里叶变换
信号的相关性计算是直接将待测信号与一个已知信号(某一正弦波)的对应点相乘的结果相加,得到的结果称为幅值,表示该信号含有该正弦波的幅度。其计算公式为
X
(
k
)
=
∑
n
=
0
N
−
1
x
(
n
)
e
−
2
π
i
k
N
,
0
≤
k
≤
N
,
X(k)=\sum_{n=0}^{N-1} x(n) e^{\frac{-2 \pi i k}{N}}, \quad 0 \leq k \leq N,
X(k)=n=0∑N−1x(n)eN−2πik,0≤k≤N,
其中
X
(
k
)
X(k)
X(k)可展开得到
sin
\sin
sin和
cos
\cos
cos相关的幅值,
N
N
N表示这一帧内采样点的个数。离散傅里叶处理完成后得到的结果就是该帧在不同频率下的幅值。但由于DFT的共轭对称性,有
N
2
−
1
\frac{N}{2}-1
2N−1个数据是冗余的,所以最后得到的结果的长度是
N
2
+
1
\frac{N}{2}+1
2N+1。(这里由于
N
N
N常取512或256,不讨论奇数情况)
短时傅里叶变换
短时傅里叶变换的灵魂就是加窗(通常窗的长度十分关键。窗过窄会导致频率分辨不准,频率分辨率差;窗太宽会导致时域上不够精细,时间分辨率差),通过对整个时域的信号进行分段,这时得到的每个小段内的信号可以看做是平稳的,所以对每个分段进行傅里叶变换处理后,可以得到信号频率随时间变化的关系。
滤波器组
Mel滤波器组就像人类的听觉感知系统(耳朵),人耳只关注某些特定的频率分量(人的听觉对频率是有选择性的),它对不同频率信号的灵敏度是不同的。
该操作得到的结果是每个短时帧在根据Mel刻度得到的不同滤波器处理后得到的值(需要对该值进行取对数处理得到单位为dB的数据),每个短时帧得到的结果个数与设置的滤波器个数相同。
梅尔刻度
研究表明,人类对频率的感知并不是线性的,并且对低频信号的感知要比高频信号敏感。对1kHz以下,与频率成线性关系,对1kHz以上,与频率成对数关系。频率越高,感知能力就越差。
Mel刻度是关于Hz的非线性变换,根据已知的研究,设频率为
f
f
f,将其转换为梅尔(mel)的公式为
m
=
M
e
l
(
f
)
=
2595
log
10
(
1
+
f
700
)
,
m=Mel(f)=2595 \log _{10}\left(1+\frac{f}{700}\right),
m=Mel(f)=2595log10(1+700f),
该函数在频率较小时,mel值随Hz变化较快;当频率较大时,mel值的变阿虎缓慢,这符合人耳对声音感受的特点。对应的,从梅尔计算频率的公式为
f
=
700
(
1
0
m
2595
−
1
)
.
f=700\left(10^{\frac{m}{2595}}-1\right) .
f=700(102595m−1).
三角滤波器
三角滤波器的具体操作就是得到一个曲线为三角形的函数,然后将该函数对应位置的取值与频谱图中对应位置的点相乘并取其和,得到的结果即为三角滤波器在频谱上处理后得到的结果。
这个操作得到的结果是每个短时帧在根据Mel刻度划分的不同的三角滤波器上的结果。
滤波器组
Mel滤波器组就是根据Mel刻度对Mel频率进行区间划分,划分结束后映射到频率上得到频率的划分区间,根据所得区间来设置对应的三角滤波器,最后所有滤波器的组合称为Mel滤波器组。
DCT
如果上述所得结果可以直接使用,则不需进行这步,这步是因为滤波器组所得结果之间是有一定相关性的,这在使用某些机器学习方法时会出现问题,所以这里会使用离散余弦变换(DCT)对所得结果进行去相关处理,其计算公式为
C
(
n
)
=
∑
m
=
0
N
−
1
s
(
m
)
cos
(
π
n
(
m
−
0.5
)
M
)
,
n
=
1
,
2
,
…
,
L
,
C(n)=\sum_{m=0}^{N-1} s(m) \cos \left(\frac{\pi n(m-0.5)}{M}\right), \quad n=1,2, \ldots, L,
C(n)=m=0∑N−1s(m)cos(Mπn(m−0.5)),n=1,2,…,L,
其中
L
L
L表示MFCC系数阶数,也是输出结果的个数,
M
M
M表示三角滤波器个数。