我有一个项目,需要计算 MFCC。我试图阅读一些教程,然后制作一个 MATLAB 函数,但我似乎有错误的答案。我想将 MFCC 提供给其中一种分类模型——我的选择可能是 NN 或 SVM。我将对属于或不属于多个类别之一的声音样本进行分类。
要计算 MFCC,当前的过程如下所示:
- 使用预加重滤波器处理信号:
x = x - 0.95*[0;x(1:N-1)];
- 取由 215 个样本重叠的 430 个样本的窗口(约 50ms 窗口的等效性)
- 将汉明窗应用于段
- 计算 FFT:
X = fft(x);
计算不包括负频率部分(后半部分)的能量,因此我只取 0-4kHz 之间的频率
N2 = max([楼层(N+1)/2 楼层(N/2)+1]); P = 1/N*abs(X(1:N2)).^2;
获得一组 40 个三角形滤波器,其中心分布在 20Hz 和 4kHz 之间的梅尔频率上
对能量向量应用滤波器,对向量求和并取自然对数:
L = log(mfccShapes'*P);
应用 DCT 并取 13 个系数:
All_MFCC = cos( (pi/N*((0:N-1) + 0.5)).'*(0:N-1) )'*L; MFCC = All_MFCC(1:13);
我在计算这个时有两个问题:
- 首先,在我读过的教程中的计算中,能量除以频率向量的长度。这是正确的步骤吗?
- 第二个问题是DCT。我知道通过采用 DCT,我们可以计算频率的倒谱。但是我在求和和过滤能量向量上采用 DCT。我已经在矢量化中应用了DCT-II,并且我认为它的计算是正确的。问题是我的第一个系数的负值总是很低。
此外,低能的形状和 MFCC 似乎非常相似。在我服用 DCT 后,我意识到它是相似的。
我的计算错误在哪里?
干杯! 雪松
编辑:
我现在明白为什么第一个 MFCC 系数非常低。如果我查看 DCT II,它的第一个组件就是一条直线:
这相当于只是将所有能量对数系数相加。由于它们都是负数,因此总和变得非常低。