gpt4 book ai didi

logging - 如何从信号的 FFT 中获取 MFCC?

转载 作者:行者123 更新时间:2023-12-02 09:20:31 27 4
gpt4 key购买 nike

简短:从 FFT 获取 MFCC 涉及哪些步骤。

详细:

我正在开发一个鼓应用程序来对声音进行分类。它是 iPhone 的一个匹配应用程序,具有用于声音处理的 openframeworks 库,其想法是返回您在响亮的印度鼓(称为 Dhol)上演奏的音符的名称 - 只有几个音符可以演奏。

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

这是我目前所理解的。它基于非线性梅尔频率频率上对数功率谱的线性余弦变换。

它使用三角测量来滤除频率并获得所需的系数。 http://instruct1.cit.cornell.edu/courses/ece576/FinalProjects/f2008/pae26_jsc59/pae26_jsc59/images/melfilt.png

因此,如果您有从 fft 算法返回的大约 1000 个值(声音频谱),那么您最好会获得大约 12 个元素(即系数)。这个 12 元素向量用于对乐器进行分类,包括演奏的鼓...

这就是我想要实现的目标。

有人可以帮助我如何做这样的事情吗?任何帮助将不胜感激。干杯

最佳答案

首先,您必须将信号分割为 10 到 30 毫秒的小帧,应用窗口函数(建议在声音应用中使用嗡嗡声),并计算信号的傅里叶变换。使用 DFT,要计算梅尔频率倒谱系数,您必须遵循以下步骤:

  1. 获取功率谱:|DFT|^2
  2. 计算三角组滤波器,将赫兹标度转换为梅尔标度
  3. 获取对数频谱
  4. 应用离散余弦变换

Python 代码示例:

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 Vamp example 。我希望这对您有帮助!

关于logging - 如何从信号的 FFT 中获取 MFCC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5835568/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com