КАК получить MFCC от БПФ по сигналу?

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

ПОДРОБНОЕ:

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

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

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

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

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

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

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

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

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

Ответ 1

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

  • Получить спектр мощности: | DFT | ^ 2
  • Вычислить треугольный банковский фильтр для преобразования шкалы hz в шкалу масштаба
  • Получить спектр журналов
  • Применить дискретное преобразование косина

Пример кода 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)

Этот код основан на примере Vamp MFCC. Надеюсь, это поможет вам!