MFCC(Mel频率倒谱系数)是一种广泛应用于语音信号处理和识别的特征提取方法,其核心思想是模拟人耳对声音频率的非线性感知特性。以下是其原理与流程的详细说明:
1. 基本原理
- Mel刻度:人耳对低频信号敏感,对高频信号不敏感。Mel刻度将实际频率(Hz)转换为更接近人耳感知的非线性频率尺度:
[
\text{Mel}(f) = 2595 \cdot \log_{10}\left(1 + \frac{f}{700}\right)
] - 倒谱分析:通过傅里叶变换和对数运算,分离声道的激励信号(基频)与共振峰(频谱包络)。
2. 提取流程
(1) 预处理
- 分帧:将语音信号切分为短时帧(通常20-40ms/帧,帧移10ms),以近似平稳信号。
- 加窗:每帧乘以汉明窗(Hamming Window),减少频谱泄漏:
[
w(n) = 0.54 - 0.46 \cos\left(\frac{2\pi n}{N-1}\right)
]
(2) 傅里叶变换(FFT)
- 对每帧信号进行FFT,得到幅度谱(功率谱):
[
X(k) = \sum_{n=0}^{N-1} x(n) e^{-j 2\pi kn/N}
]
(3) Mel滤波器组
- 设计三角滤波器组:在Mel刻度上均匀分布一组带通滤波器(通常20-40个),覆盖0Hz到Nyquist频率。
- 滤波:将功率谱通过每个Mel滤波器,输出滤波器能量:
[
S(m) = \sum_{k=0}^{N-1} |X(k)|^2 \cdot H_m(k), \quad m=1,2,\dots,M
]
((H_m(k))为第(m)个滤波器的频率响应)
(4) 对数运算
- 对滤波器能量取对数,压缩动态范围,凸显频谱细节:
[
\log S(m)
]
(5) 离散余弦变换(DCT)
- 对对数Mel谱做DCT,得到倒谱系数(保留前12-20个系数作为MFCC):
[
c(n) = \sum_{m=1}^{M} \log S(m) \cdot \cos\left(\frac{\pi n (m-0.5)}{M}\right)
]- 第1个系数((c(0)))为能量,通常替换为帧能量或直接丢弃。
(6) 动态特征提取(可选)
- 一阶差分(Delta):表征MFCC随时间的变化率。
- 二阶差分(Delta-Delta):表征加速度。
3. 关键特点
- 降维:通过DCT将高维Mel谱压缩为低维特征。
- 去相关:DCT使各维度系数近似独立,适合高斯模型(如GMM-HMM)。
- 鲁棒性:对数运算减弱环境噪声影响。
4. 应用场景
- 语音识别(ASR)
- 说话人识别
- 语音情感分析
5. 代码实现示例(Python)
import numpy as np
import librosa
def extract_mfcc(signal, sr, n_mfcc=13):
# 预加重、分帧、加窗
signal = librosa.effects.preemphasis(signal)
frames = librosa.util.frame(signal, frame_length=1024, hop_length=512)
frames *= np.hamming(1024)
# FFT → Mel滤波器组 → 对数 → DCT
spectrogram = np.abs(np.fft.rfft(frames, n=1024))**2
mel_basis = librosa.filters.mel(sr, n_fft=1024, n_mels=40)
mel_energy = np.dot(mel_basis, spectrogram)
log_mel = np.log(mel_energy + 1e-6)
mfcc = librosa.feature.mfcc(S=log_mel, n_mfcc=n_mfcc)
return mfcc
通过MFCC提取的特征能有效表征语音的短时频谱特性,同时兼顾计算效率,成为语音处理领域的经典方法。
(www.nzw6.com)