如何生成MFCC算法的三角形窗口以及如何使用它们?

kam*_*aci 9 java algorithm signal-processing mfcc

我正在用Java实现MFCC算法.

这里有一个示例代码:http://www.ee.columbia.edu/~dpwe/muscontent/practical/mfcc.m at Matlab.但是我对梅尔过滤器银行业务有一些问题.如何生成三角形窗口以及如何使用它们?

PS1:一篇描述MFCC的文章:http://arxiv.org/pdf/1003.4083

PS2:如果基本上有关于MFCC算法步骤的文档,那将是好的.

PS3: 我的主要问题是:MFCC与Java线性和对数滤波器一些实现使用线性和对数滤波器,其中一些不使用.什么是过滤器,什么是中心频繁的概念.我遵循那个代码:MFCC Java,它与代码之间的区别是什么:MFCC Matlab

Tho*_*nor 4

作为频带滤波器的三角形窗口并不难实现。您基本上想要在每个频带内集成 FFT 数据(定义为中心频率i-1和 中心频率之间的频率空间i+1)。

你基本上是在寻找类似的东西,

for(int bandIdx = 0; bandIdx < numBands; bandIdx++) {
    int startFreqIdx  = centerFreqs[bandIdx-1];
    int centerFreqIdx = centerFreqs[bandIdx];
    int stopFreqIdx   = centerFreqs[bandIdx+1];

    for(int freq = startFreqIdx; i < centerFreqIdx; i++) {
        magnitudeScale = centerFreqIdx-startFreqIdx;
        bandData[bandIdx] += fftData[freq]*(i-startFreqIdx)/magnitudeScale;
    }

    for(int freq = centerFreqIdx; i <= stopFreqIdx; i++) {
        magnitudeScale = centerFreqIdx-stopFreqIdx;
        bandData[bandIdx] += fftData[freq]*(i-stopFreqIdx)/magnitudeScale;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您不理解“中心频率”或“频带”或“滤波器”的概念,请拿起一本基本信号教科书 - 您不应该在不了解其作用的情况下实现该算法。

至于确切的中心频率是多少,这取决于你。实验并选择(或在出版物中查找)捕获您想要从数据中分离的信息的值。之所以没有明确的值,甚至没有值的比例,是因为该算法试图近似人耳,而人耳是一种非常复杂的听力设备。一种音阶可能更适合语音,而另一种音阶可能更适合音乐等。您可以选择合适的音阶。