我一直在网上阅读点点滴滴,但我无法将它们拼凑在一起。我对信号/ DSP有一定的背景知识,应该足以满足此要求。我有兴趣最终使用Java对该算法进行编码,但是我还不完全了解它,这就是为什么我在这里(它算作数学,对吗?)。
我认为这与我的知识差距一起起作用。
从您的音频语音样本开始,比如说一个.wav文件,您可以将其读入数组。把这种阵列,其中Ñ范围为0 ,1 ,... ,ñ - 1(所以Ñ样品)。这些值对应于我猜想的音频强度-振幅。
将音频信号分成10ms左右的不同“帧”,假设语音信号是“固定的”。这是量化的一种形式。因此,如果您的采样率为44.1KHz,则10ms等于441个采样或值。
进行傅立叶变换(为计算起见,使用FFT)。现在,这是在整个信号上还是在每个单独帧上完成的?我认为这是有区别的,因为一般来说,傅立叶变换会查看信号的所有元素,因此F(x [ n ] )≠ F(x 1 [ n ] )与F(x 2 [ n ] )与... F结合(x N [ n ] )其中x是较小的帧。无论如何,假设我们进行了一些FFT,最后剩下 X [ k ]。
映射到梅尔刻度,并进行记录。我知道如何将常规频率数字转换为梅尔刻度。对于每个的X [ ķ ]:(以下简称“x轴”如果你让我),你可以在这里做公式http://en.wikipedia.org/wiki/Mel_scale。但是,“ y值”或X [ k ]的幅度如何?它们是否只是保持相同的值,而是移动到新的Mel(x-)轴上的适当位置?我在某篇论文中看到有关记录X [ k ]的实际值的某些事情,因为如果X [ k ] = A [ k,其中一个信号被假定为您不需要的噪声,此方程的对数运算将乘性噪声转换为加性噪声,希望可以对其进行滤波(?)。
现在,最后一步是从上方获取修改后的的DCT (但是最终被修改了)。然后,您将获得最终结果的振幅,这些就是您的MFCC。我读到一些有关丢弃高频值的内容。
因此,我正在尝试逐步解决如何计算这些人的问题,显然有些事情使我难以理解。
另外,我听说过使用“滤波器组”(基本上是带通滤波器的阵列),不知道这是指从原始信号制作帧,还是在FFT之后制作帧?
最后,我看到有关具有13个系数的MFCC的一些信息吗?