Как создать треугольные окна Алгоритма MFCC и как их использовать? - PullRequest
9 голосов
/ 21 мая 2011

Я реализую алгоритм MFCC в Java.

Здесь приведен пример кода: http://www.ee.columbia.edu/~dpwe/muscontent/practical/mfcc.m в Matlab.Однако у меня есть некоторые проблемы с процессом банковского обслуживания мелкого фильтра.Как генерировать треугольные окна и как использовать их?

PS1: Статья, в которой есть часть, описывающая MFCC: http://arxiv.org/pdf/1003.4083

PS2: Если есть документ о шагах алгоритмов MFCC в принципе, это будет хорошо.

PS3: Мой главный вопрос связан счто: MFCC с линейными и логарифмическими фильтрами Java некоторые реализации используют как линейный, так и логарифмический фильтры, а некоторые нет.Что это за фильтры и что такое центр частой концепции.Я следую этому коду: MFCC Java , в чем разница между этим кодом: MFCC Matlab

Ответы [ 2 ]

4 голосов
/ 04 июня 2011

Треугольные окна как фильтры частотных диапазонов несложно реализовать. В основном вы хотите интегрировать данные FFT в каждой полосе (определенной как частотное пространство между центральной частотой i-1 и центральной частотой i+1).

Вы в основном ищете что-то вроде

for(int bandIdx = 0; bandIdx < numBands; bandIdx++) {
    int startFreqIdx  = centerFreqs[bandIdx-1];
    int centerFreqIdx = centerFreqs[bandIdx];
    int stopFreqIdx   = centerFreqs[bandIdx+1];

    for(int freq = startFreqIdx; i < centerFreqIdx; i++) {
        magnitudeScale = centerFreqIdx-startFreqIdx;
        bandData[bandIdx] += fftData[freq]*(i-startFreqIdx)/magnitudeScale;
    }

    for(int freq = centerFreqIdx; i <= stopFreqIdx; i++) {
        magnitudeScale = centerFreqIdx-stopFreqIdx;
        bandData[bandIdx] += fftData[freq]*(i-stopFreqIdx)/magnitudeScale;
    }
}

Если вы не понимаете концепцию «центральной частоты», «полосы» или «фильтра», возьмите учебник по элементарным сигналам - вам не следует реализовывать этот алгоритм, не понимая, что он делает.

Что касается точных центральных частот, вам решать. Поэкспериментируйте и выберите (или найдите в публикациях) значения, которые содержат информацию, которую вы хотите изолировать от данных. Причина, по которой нет определенных значений или даже шкалы значений, заключается в том, что этот алгоритм пытается приблизиться к человеческому уху, которое является очень сложным устройством для прослушивания. В то время как одна шкала может работать лучше, скажем, для речи, другая может работать лучше для музыки и т. Д. Вам решать, что уместно.

3 голосов
/ 22 марта 2013

Ответ для второго PS: я нашел этот учебник , который действительно помог мне вычислить MFCC.

Что касается треугольных окон и наборов фильтров, то, как я понял, они делают перекрытия, они не распространяются на отрицательные частоты, и весь процесс вычисления их из спектра БПФ и применения их к нему идет примерно так:

  1. Выберите минимальную и максимальную частоту для фильтров (например, min freq = 300 Гц - минимальная частота голоса и максимальная частота = ваша частота дискретизации / 2. Возможно, именно здесь вы должны выбрать предел в 1000 Гц, о котором вы говорили)
  2. Вычислите значения плавления из минимальной и максимальной выбранных частот. Формула здесь .
  3. Вычислить N одинаково удаленных значений между этими двумя значениями плавления.(Я видел примеры различных значений для N, вы даже можете найти сравнение эффективности для различных значений в этой работе , для моих тестов я выбрал 26)
  4. Преобразовать этизначения обратно в Гц.(вы можете найти формулу на той же вики-странице) => массив из N + 2 значений фильтра
  5. Вычислить набор фильтров (треугольник фильтра) для каждых трех последовательных значений, либо так, как предложил Томас выше (осторожно синдексы) или как в рекомендованном в начале этого поста туре) => массив массивов, размером NxM, при условии, что ваше БПФ вернуло 2 * M значения, и вы используете только M.
  6. Передайте весь спектр мощности(M значений, полученных из FFT) через каждый треугольный фильтр, чтобы получить «энергию набора фильтров» для каждого фильтра (для каждого набора фильтров (N-цикл), умножить каждую величину, полученную после FFT, на каждое значение в соответствующем наборе фильтров (M-цикл) и добавитьПолученные значения M) => массив энергий N-размера.

Это энергии вашего банка фильтров, к которым вы можете дополнительно применить журнал, применить DCT и извлечь MFCCs ...

...