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

Posted

技术标签:

【中文标题】如何生成MFCC算法的三角窗以及如何使用它们?【英文标题】:How to generate MFCC Algorithm's triangular windows and how to use them? 【发布时间】:2011-08-29 23:13:57 【问题描述】:

我正在用 Java 实现 MFCC 算法。

这里有一个示例代码:http://www.ee.columbia.edu/~dpwe/muscontent/practical/mfcc.m at Matlab。但是,我在 mel 过滤器存储过程中遇到了一些问题。如何生成三角窗以及如何使用

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

PS2:如果基本有MFCC算法步骤的文档就好了。

PS3: 我的主要问题与此相关:MFCC with Java Linear and Logarithmic Filters 一些实现同时使用线性和对数滤波器,而其中一些不使用。什么是过滤器和什么是中心频繁的概念。我遵循该代码:MFCC Java,该代码之间有什么区别:MFCC Matlab

【问题讨论】:

如果您完全使用 Matlab,VoiceBox 工具箱有 Matlab 代码可以做到这一点。也许你可以移植它。 【参考方案1】:

第二个 PS 的答案:我发现 this tutorial 确实帮助我计算了 MFCC。

至于三角窗和滤波器组,据我了解,它们确实重叠,它们延伸到负频率以及计算它们的整个过程FFT 频谱并将它们应用回它是这样的:

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

这些是您的滤波器组能量,您可以进一步应用对数、应用 DCT 并提取 MFCC……

【讨论】:

【参考方案2】:

三角窗作为频带滤波器并不难实现。您基本上希望在每个频段内集成 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;
    

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

至于确切的中心频率是多少,由您决定。试验并挑选(或在出版物中查找)捕获您希望从数据中分离出来的信息的值。之所以没有确定的值,甚至是值的尺度,是因为该算法试图逼近人耳,这是一种非常复杂的听音设备。一种音阶可能更适合演讲,而另一种音阶可能更适合音乐等。您可以自行选择合适的音阶。

【讨论】:

MFCC Java 说:mel[0] = freqToMel(lowerFilterFreq);梅尔[1] = freqToMel(samplingRate / 2);这是什么意思它意味着它将过滤器从 lowerFilterFreq 运行到 samplingRate / 2 ?如果我想扫描到 1000 Hz,我应该写 1000 而不是 samplingRate / 2 吗? @kamaci:在不了解 freqToMel 的上下文或细节的情况下,这是不可能的。我假设 samplingRate 是指采样率。也就是说,如果您以 44.1kHz 采样音频,则 samplingRate/2 为 22.05kHz。如果您以 1000 Hz 采样,则 samplingRate/2 为 500 Hz。如果您不清楚“采样率”的概念,您应该像我之前所说的那样拿起一本信号书。 不是 samplingRate/2 是最大频率吗? samplingRate/2 是Nyquist frequency。任何高于 samplingRate/2 的频率都将被折叠到 0 和 samplingRate/2 之间 还有一个问题,这对我来说非常重要。我的讲师想要:线性滤波器应该是直到 1000 Hz。 (我认为它是 MFCC Java 使用的线性过滤器)我如何将它实现到代码中。我在代码中写了 1000 Hz 而不是 samplingRate / 2?

以上是关于如何生成MFCC算法的三角窗以及如何使用它们?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Weka 中使用 MFCC 进行音频分类?

在 Network Simulator ns2 中实现用于 Delaunay 三角剖分的 Boyer Watson 算法

如何在OpenGL中创建一个带三角形的偶数球?

三角函数计算,Cordic 算法入门

如何使用EasyUI生成弹窗界面

MFC C++ 应用程序:如何在任务管理器中清除命令行参数?