Набор фильтров Librosa MEL с убывающими треугольниками

Я немного застрял в понимании MFCC.

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

введите описание изображения здесь

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

введите описание изображения здесь

Код:

import librosa
import matplotlib.pyplot as plt

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

person Jack Deadman    schedule 22.10.2016    source источник


Ответы (4)


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

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

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

plt.plot(mel.T)

Это дает следующее изображение:  введите описание изображения здесь

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

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

И тогда сюжет выглядит так:  введите описание изображения здесь

person Jack Deadman    schedule 17.05.2017

Вам не хватает вектора 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

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

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

Mfcc librosa

person Jose Giraldo    schedule 10.04.2017

Что ж, уже немного поздно, но я надеюсь, что этот ответ будет полезен для всех, кто борется с различными реализациями mel-filterbank:

Есть несколько различных реализаций mel-filterbanks; В частности, librosa имеет 2 разных варианта: один из Кембриджского набора скрытых марковских моделей (HTK), и по умолчанию он написан Слэни и реализован в Matlab Auditory Toolbox:

HTK генерирует набор фильтров со всеми фильтрами, установленными с усилением 1 в его центре. Реализация Slaney генерирует нормализованный набор фильтров, в котором нормализация может выполняться по площади или по полосе пропускания.

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

Проверьте дополнительную информацию об этой сравнительной работе, чтобы получить информацию о сравнительной производительности. различных реализаций mel-filterbak

person Fernando Garcia    schedule 29.10.2018

Вы ищете банк мел-фильтров с такой же высотой банка. Я тоже ищу это. Сначала нужно транспонировать mels, просто используйте параметр norm и измените его на None.

mels = librosa.filters.mel(20000, 2048, n_mels=4, fmin=0.0, fmax=None, htk=False, norm=None)
plt.plot(mels.T)
plt.show()

мелкое изображение

person 赵丰年    schedule 28.10.2020