如何生成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算法的三角窗以及如何使用它们?的主要内容,如果未能解决你的问题,请参考以下文章
在 Network Simulator ns2 中实现用于 Delaunay 三角剖分的 Boyer Watson 算法