Java 如何生成MFCC算法';s三角窗以及如何使用它们?

Java 如何生成MFCC算法';s三角窗以及如何使用它们?,java,algorithm,signal-processing,mfcc,Java,Algorithm,Signal Processing,Mfcc,我正在用Java实现MFCC算法 这里有一个示例代码:at Matlab。然而,我有一些问题与梅尔滤波器银行的过程。如何生成三角形窗口以及如何使用它们 PS1:一篇文章中有一部分描述了MFCC: PS2:如果有一个基本上关于MFCC算法步骤的文档,它会很好 PS3:我的主要问题是与此相关的:有些实现同时使用线性和对数滤波器,有些则不使用。什么是过滤器,什么是中心频率概念。我遵循代码:,代码之间的区别是什么:三角形窗口作为频带滤波器并不难实现。您基本上希望在每个频带内集成FFT数据(定义为中心频率

我正在用Java实现MFCC算法

这里有一个示例代码:at Matlab。然而,我有一些问题与梅尔滤波器银行的过程。如何生成三角形窗口以及如何使用它们

PS1:一篇文章中有一部分描述了MFCC:

PS2:如果有一个基本上关于MFCC算法步骤的文档,它会很好


PS3:我的主要问题是与此相关的:有些实现同时使用线性和对数滤波器,有些则不使用。什么是过滤器,什么是中心频率概念。我遵循代码:,代码之间的区别是什么:

三角形窗口作为频带滤波器并不难实现。您基本上希望在每个频带内集成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;
    }
}
for(int-bandIdx=0;bandIdx对于(intfreq=centerFreqIdx;我回答第二个问题:我发现这确实帮助了我计算MFCC

至于三角形窗口和滤波器组,据我所知,它们是重叠的,它们不会延伸到负频率,从FFT频谱计算它们并将其应用到它的整个过程如下:

  • 为过滤器选择最小和最大频率(例如,最小频率=300Hz-最小语音频率和最大频率=您的采样率/2。也许这就是您应该选择您所说的1000Hz限制的地方)
  • 根据选择的最小和最大频率计算mel值
  • 计算这两个mel值之间的N个相等距离的值。(我已经看到了N的不同值的示例,您甚至可以在中找到不同值的效率比较,对于我的测试,我选择了26)
  • 将这些值转换回Hz。(您可以在同一wiki页面上找到公式)=>N+2过滤器值数组
  • 为每三个连续的值计算一个滤波器组(滤波器三角形),可以是Thomas建议的(注意索引)或类似于本文开头推荐的教程)=>一个数组,大小为NxM,计算FFT返回的2*M值,您只使用M
  • 将整个功率谱(通过FFT获得的M个值)通过每个三角形滤波器,以获得每个滤波器的“滤波器组能量”(对于每个滤波器组(N个回路),将FFT后获得的每个幅值乘以相应滤波器组(M个回路)中的每个值,并将获得的M个值相加)=>N个大小的能量数组

  • 这些是您的过滤器库能量,您可以进一步应用日志,应用DCT并提取MFCC…

    如果您使用Matlab,VoiceBox工具箱有Matlab代码来实现这一点。也许您可以移植它。MFCC Java说:mel[0]=frektomel(lowerFilterFreq);mel[1]=frektomel(sampligrate/2);这意味着什么?我的意思是它从lowerFilterFreq运行过滤器到samplingRate/2?如果我想扫描到1000 Hz,我应该写1000而不是samplingRate/2吗?@kamaci:不知道Frektomel的上下文或详细信息,很难说。我假设samplingRate意味着采样率。也就是说,如果你对一个udio为44.1kHz,则采样率/2为22.05kHz。如果采样率为1000 Hz,则采样率/2为500 Hz。如果您不清楚“采样率”的概念,你应该像我之前说的那样拿起一本信号书。samplingRate/2不是最大频率吗?samplingRate/2是最大频率。高于samplingRate/2的任何频率都将被折叠为介于0和samplingRate/2之间。还有一个问题,这对我来说非常重要。我的讲师希望:线性滤波器应该在1000 Hz之前。(我认为这是MFCC Java使用的线性过滤器)我如何在代码中实现它。我编写了1000 Hz而不是samplingRate/2 at代码?