2011-04-29 26 views
10

CORTO Y SIMPLE: Hola, muy simplemente ... Solo quiero saber los pasos necesarios para obtener un MFCC de una FFT.¿CÓMO obtener MFCC de una FFT en una señal?

DETALLADA:

Hola a todos. Estoy trabajando en una aplicación de batería en la que quiero clasificar los sonidos. Es solo una aplicación que combina, devuelve el nombre de la nota que tocas en el tambor.

Es un simple gran tambor indio fuerte. Solo hay unas pocas notas allí que uno puede tocar.

Implementé el algoritmo fft y obtuve con éxito un espectro. Ahora quiero dar un paso más y devolver el mfcc de fft.

Esto es lo que entiendo hasta ahora. está basado en la transformada de coseno lineal de un espectro de potencia logarítmica en una escala de frecuencia mel no lineal.

utiliza la triangulación para filtrar las frecuencias y obtener un coeficiente deseado. http://instruct1.cit.cornell.edu/courses/ece576/FinalProjects/f2008/pae26_jsc59/pae26_jsc59/images/melfilt.png

así que si tiene alrededor de 1000 valores devueltos por el algoritmo fft - el espectro del sonido, entonces deseablemente obtendrá alrededor de 12 elementos (es decir, coeficientes). Este vector de 12 elementos se usa para clasificar el instrumento, incluido el tambor reproducido ...

esto es exactamente lo que quiero.

¿Podría alguien ayudarme en cómo hacer algo como esto? mis habilidades de programación están bien. Actualmente estoy creando una aplicación para el iphone. con openframeworks.

Cualquier ayuda sería muy apreciada. Cheers

+2

En general estoy de acuerdo con citar Wikipedia para cualquier cosa técnica, pero ¿no [esta página] (http://en.wikipedia.org/wiki/Mel-frequency_cepstral_coefficient) básicamente le da los pasos para obtener los coeficientes? – Dan

Respuesta

21

En primer lugar, debe dividir la señal en cuadros pequeños con 10 a 30ms, aplicar una función de ventana (se recomienda zumbido para aplicaciones de sonido) y calcular la transformada de fourier de la señal. Con DFT, para calcular Mel frequecy cepstrales Coeficientes tienes que seguir estos pasos:

  1. Obtener espectro de potencia: | DFT |^2
  2. calcular un banco de filtros triangulares para transformar escala hz en la escala mel
  3. Get ingrese espectro
  4. Aplicar cossine transformada discreta

un ejemplo de código 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) 

Este código se basa en MFCC Vamp example. ¡Espero que esto te ayude!

+0

Hola, ¿Quiere decir que "file.wav" es un marco (10ms a 30ms)? De lo contrario, debe dividir la señal en cuadros pequeños y luego aplicar las operaciones que hizo a cada cuadro. Para cada cuadro, debe sacar 13 coeficientes. – engineerchuan

+0

... Estaba confundido con eso también.Supuse que estaba hablando del tamaño de la ventana. Es donde tomamos los valores y luego calculamos la FFT en él. Por favor confirme – Pavan

+0

, pero ¿qué sucede una vez que tengo los coeficientes? ¿Qué hace con ellos? Supongo que obtengo los coeficientes de sonido uno y luego los coeficientes de sonido 2 ... entonces qué – Pavan

Cuestiones relacionadas