首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从信号的FFT中获得MFCC?

如何从信号的FFT中获得MFCC?
EN

Stack Overflow用户
提问于 2011-04-29 17:57:22
回答 1查看 12.6K关注 0票数 11

短而简单: Hi都很简单.我只想知道从FFT中获得MFCC的步骤。

详细信息:

大家好。我正在做一个鼓的应用程序,我想分类声音。它只是一个匹配的应用程序,它返回您在鼓上演奏的音符的名称。

这是一个简单的印度大鼓声。那里只有几个音符可以演奏。

我实现了fft算法,并成功地获得了频谱。现在我想更进一步,从fft中返回mfcc。

到目前为止,这就是我所理解的。它基于对数功率谱在非线性mel尺度上的线性余弦变换。

它采用三角剖分法滤除频率,得到所需的系数。jsc59 59/images/melfilt.png

所以如果你有大约1000个从fft算法返回的值--声音的频谱,那么你需要得到大约12个元素(即系数)。这个12元素的矢量被用来分类仪器,包括鼓.

这正是我想要的。

有人能帮我做这样的事吗?我的编程技巧很好。我目前正在为iphone创建一个应用程序。和openframeworks一起。

任何帮助都将不胜感激。干杯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-01 04:35:19

首先,你必须把信号分割成10到30毫秒的小帧,应用加窗功能(嗡嗡声被推荐用于声音应用),并计算信号的傅里叶变换。对于DFT,要计算Mel频率倒谱系数,必须遵循以下步骤:

  1. 获得功率谱:x_DFT_x^2
  2. 计算三角形组滤波器将hz尺度转换为mel尺度
  3. 测井谱
  4. 应用离散余弦变换

python代码示例:

代码语言:javascript
复制
import numpy
from scipy.fftpack import dct
from scipy.io import wavfile

sampleRate, signal = wavfile.read("file.wav")
numCoefficients = 13 # choose the sive of mfcc array
minHz = 0
maxHz = 22.000  

complexSpectrum = numpy.fft(signal)
powerSpectrum = abs(complexSpectrum) ** 2
filteredSpectrum = numpy.dot(powerSpectrum, melFilterBank())
logSpectrum = numpy.log(filteredSpectrum)
dctSpectrum = dct(logSpectrum, type=2)  # MFCC :)

def melFilterBank(blockSize):
    numBands = int(numCoefficients)
    maxMel = int(freqToMel(maxHz))
    minMel = int(freqToMel(minHz))

    # Create a matrix for triangular filters, one row per filter
    filterMatrix = numpy.zeros((numBands, blockSize))

    melRange = numpy.array(xrange(numBands + 2))

    melCenterFilters = melRange * (maxMel - minMel) / (numBands + 1) + minMel

    # each array index represent the center of each triangular filter
    aux = numpy.log(1 + 1000.0 / 700.0) / 1000.0
    aux = (numpy.exp(melCenterFilters * aux) - 1) / 22050
    aux = 0.5 + 700 * blockSize * aux
    aux = numpy.floor(aux)  # Arredonda pra baixo
    centerIndex = numpy.array(aux, int)  # Get int values

    for i in xrange(numBands):
        start, centre, end = centerIndex[i:i + 3]
        k1 = numpy.float32(centre - start)
        k2 = numpy.float32(end - centre)
        up = (numpy.array(xrange(start, centre)) - start) / k1
        down = (end - numpy.array(xrange(centre, end))) / k2

        filterMatrix[i][start:centre] = up
        filterMatrix[i][centre:end] = down

    return filterMatrix.transpose()

def freqToMel(freq):
    return 1127.01048 * math.log(1 + freq / 700.0)

def melToFreq(mel):
    return 700 * (math.exp(mel / 1127.01048) - 1)

此代码基于MFCC真空实例。我希望这对你有帮助!

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5835568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档