我一直在网上阅读一些零碎的东西,但我就是无法将它们拼凑在一起。我有一些信号/DSP 的背景知识,这应该是足够的先决条件。我有兴趣最终用 Java 编写这个算法,但我还不完全理解它,这就是我在这里的原因(它算作数学,对吧?)。
以下是我认为它与我的知识差距一起工作的方式。
从您的音频语音样本开始,比如一个 .wav 文件,您可以将其读入数组。调用此数组,其中的范围为(因此个样本)。这些值对应于我猜的音频强度 - 幅度。
将音频信号拆分为 10 毫秒左右的不同“帧”,您假设语音信号是“静止的”。这是一种量化形式。因此,如果您的采样率为 44.1KHz,则 10ms 等于 441 个样本,或的值。
进行傅立叶变换(为了计算而进行 FFT)。现在这是在整个信号上完成还是在的每个单独帧上完成?我认为这是有区别的,因为通常傅里叶变换会查看信号的所有元素,因此与与连接,其中是较小的帧。无论如何,假设我们做了一些 FFT 并在剩下的部分中
映射到梅尔比例,并记录。我知道如何将常规频率数转换为梅尔刻度。对于中的每个(如果您允许的话,“x 轴”),您可以在此处执行公式:http ://en.wikipedia.org/wiki/Mel_scale 。的“y 值”或幅度如何呢?它们是否只是保持相同的值,但转移到新梅尔 (x-) 轴上的适当位置?我在一些论文中看到了一些关于记录 X[k] 的实际值的内容,如果其中一个信号被假定为你不想要的噪声,这个方程上的对数运算将乘性噪声变成了加性噪声,希望可以被过滤掉(?)。
现在最后一步是从上面对修改后的进行 DCT (但它最终被修改了)。然后你取这个最终结果的幅度,这些就是你的 MFCC。我读了一些关于丢弃高频值的东西。
所以我正试图真正解决如何逐步计算这些人,显然有些事情是从上面躲避我的。
另外,我听说过使用“滤波器组”(基本上是一组带通滤波器),不知道这是指从原始信号制作帧,还是您在 FFT 之后制作帧?
最后,我看到了一些关于具有 13 个系数的 MFCC?