2016-10-22 6 views
0

Я немного застрял в понимании MFCCs.Librosa mel фильтр банк убывающие треугольники

Из того, что я прочитал, банки фильтров для мела должны быть рядом треугольников, которые расширяются, а их пики находятся на одном и том же месте. Как это ...

http://imgur.com/UCh5OjK

Однако, когда я вычисляю банки Мэл фильтр с использованием librosa я получаю ...

http://imgur.com/ps3yizk

Код:

mel_basis = librosa.filters.mel(sr=sr, n_fft=512, n_mels=10,fmin=0, fmax=sr/2) 

plt.plot(mel_basis) 

ответ

0

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

librosa.filters.mel возвращает матрицу с формой (n_mels, n_fft/2 +1). Это означает, что каждая строка в матрице является мелом. Столбцы - это вес каждой частоты для банка фильтров. Частота находится в терминах циклов до числа n_fft, мы выбрасываем половину из них из-за сглаживания (теорема Найквиста).

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

plt.plot(mel.T)

Это дает следующее изображение: enter image description here

Обратите внимание, что этот набор MEL банков фильтров до сих пор не то, что ожидается. Это связано с тем, что Librosa использует нормализованную версию банков с мелкими фильтрами, это означает, что каждый из mels имеет площадь 1 вместо традиционной равной высоты 1. Матрица, возвращаемая из librosa, может быть преобразована в равную высоту mel- фильтр банк по:

mels /= np.max(mels, axis=-1)[:, None]

А потом сюжет выглядит следующим образом: enter image description here

0

Вы отсутствующий вектор freq, каждый фильтр имеет nftt/2 +1 выборок, поэтому основа mel представляет собой матрицу n_mels x (nfft/2 +1) в librosa.

Чтобы вычислить MFCC, вам необходимо получить спектр мощности обрамленного сигнала, а затем умножить его на банк фильтров.

import numpy.matlib 

sr = 22050 
n_fft = 512 
n = 10 
mel_basis = librosa.filters.mel(sr=sr, n_fft=n_fft, n_mels=n,fmin=0, fmax=sr/2) 
f = np.linspace(0,sr/2,(n_fft/2)+1) 
f_all = np.matlib.repmat(f, n,1) 
plt.plot(f_all,mel_basis) 
plt.show() 

Librosa Mfcc Filter bank

Если вы предпочитаете другой замышляет вариант может быть с для цикла.

for i in range(n): 
    plt.plot(f,mel_basis[i]) 
    plt.show() 

Mfcc librosa

Смежные вопросы