梅尔倒频谱系数(MFCC,Mel Frequency Cepstral Coefficents)在人声领域(语音识别,说话人辨认)等领域应用广泛。
这个文章留下学习倒谱与梅尔频率的痕迹。
频谱
声音是一维时域信号。为了分析声音的频域规律,就要用到傅里叶变换,将信号从时域转换到频域。但频域信号失去了时域信息,无法看出频率分布随时间的变化。
对此,有短时傅里叶变换(STFT),即在短时间内对长信号进行傅里叶变换。将 STFT 获得的一系列频域信息按时间顺序叠放,就获得了频谱。
梅尔频谱(mel spectrogram)
人耳对音高的感知不是线性的。人耳对高频频率的变化很迟钝,对低频敏感。
梅尔频谱通过一个变换公式,将普通频率映射到更适合人类直觉的标准。
$$
mel(f)=2595\times \log_{10}(1+\frac{f}{700})
$$
其逆变换如下,
$$
f=700(10^{mel(f)/2595}-1)
$$
梅尔滤波器组
根据人耳的音高感知特点设计的滤波器组。低频处滤波器密集,高频则相反。梅尔滤波器组通常由 40 个三角滤波器组成。
第 $m$ 号滤波器的中心频率 $f(m)$ 满足:
$$
M(f(m))=M(f_{low})+m\frac{M(f_{high})-M(f_{low})}{N+1}
$$
- $M(\cdot)$ 是频率映射到梅尔频率的运算
- $f_{high}$、$f_{low}$ 是滤波器组的频率上下限
- $N$ 是滤波器组的滤波器总数量
获得各个滤波器的中心频率 $f(m)$ 后,第 $m$ 个梅尔滤波器的增益公式如下:
$$
H_m(k)=
\begin{cases}
0& k<f(m-1)\
\frac{k-f(m-1)}{f(m)-f(m-1)}& f(m-1)\le k< f(m)\
1& k=f(m)\
\frac{f(m+1)-k}{f(m+1)-f(m)}& f(m)<k\le f(m+1)\
0& k>f(m+1)
\end{cases}
$$
这是获得等高梅尔滤波器(Mel-filter bank with same bank height)的方法。对应的还有等面积梅尔滤波器(Mel-filter bank with same bank area),后者更适合人声领域。
倒谱分析(Cepstrum Analysis)
频谱经过对数处理获得对数频谱,然后将对数频谱进行傅里叶逆变换,就获得了 倒谱 Cepstrum。
获得倒谱并不难。信号 x
获得频谱 X = np.fft.fft(x)
,进行对数处理 X_log = np.log(X_magnitude)
,最后进行傅里叶逆变换 cepstrum = np.fft.ifft(X_log).real
。
倒谱的意义:通过取对数,那些难以察觉的频率分量变得容易观察。
梅尔频率倒谱
计算 MFCC 包括以下步骤:
- 对信号进行傅立叶变换,得到频谱
- 将频谱的频率从赫兹转换为梅尔频谱
- 在梅尔频率上应用梅尔滤波器组
- 对滤波器能量取对数
- 进行离散余弦变换(DCT,类似于离散傅里叶变换但只使用实数),得到 MFCC
参考来源
- 理解梅尔倒频谱系数MFCC https://zhuanlan.zhihu.com/p/350846654
- 音频(六)Mel滤波器组_原理简介 https://blog.csdn.net/chumingqian/article/details/124950613
- Speech Processing for Machine Learning: Filter banks, Mel-Frequency Cepstral Coefficients (MFCCs) and What's In-Between https://haythamfayek.com/2016/04/21/speech-processing-for-machine-learning.html
- https://zh.wikipedia.org/wiki/离散余弦变换