КАК получить MFCC из БПФ по сигналу? - PullRequest
10 голосов
/ 29 апреля 2011

КРАТКО И ПРОСТО: Привет, все очень просто ... Я просто хочу знать, какие шаги необходимо предпринять, чтобы получить MFCC от БПФ.

ПОДРОБНОЕ:

Привет всем. Я работаю над приложением барабана, где я хочу классифицировать звуки. Это просто соответствующее приложение, оно возвращает название ноты, которую вы играете на барабане.

Это простой индийский громкий большой барабан. Там есть только несколько нот, которые можно сыграть.

Я реализовал алгоритм БПФ и успешно получил спектр. Теперь я хочу сделать еще один шаг и вернуть mfcc из fft.

Это то, что я понимаю до сих пор. он основан на линейном косинусном преобразовании логарифмического спектра мощности по нелинейной шкале плавления частоты.

он использует триангуляцию для фильтрации частот и получения желаемого коэффициента. http://instruct1.cit.cornell.edu/courses/ece576/FinalProjects/f2008/pae26_jsc59/pae26_jsc59/images/melfilt.png

так что если у вас есть около 1000 значений, возвращаемых из алгоритма fft - спектра звука, то желательно, чтобы вы получили около 12 элементов (то есть коэффициентов). Этот 12-элементный вектор используется для классификации инструмента, включая барабан ...

это именно то, что я хочу.

Может кто-нибудь помочь мне, как сделать что-то подобное? мои навыки программирования в порядке. Я сейчас создаю приложение для iphone. с открытым каркасом.

Любая помощь будет принята с благодарностью. Приветствия

1 Ответ

23 голосов
/ 01 мая 2011

Во-первых, вы должны разделить сигнал на маленькие кадры с 10 до 30 мс, применить функцию управления окнами (гудение рекомендуется для звуковых приложений) и вычислить преобразование Фурье сигнала.С помощью DFT, для вычисления Кепстральных коэффициентов Mel Frequecy вы должны выполнить следующие шаги:

  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 пример .Я надеюсь, что это поможет вам!

...