2016-10-22 2 views
0

Je suis un peu coincé comprendre MFCCs. D'après ce que j'ai lu, les banques de filtres Mel devraient être une série de triangles qui s'élargissent et leurs pics sont au même endroit. Comme ça ...Librosa mel banque de filtres décroissant triangles

http://imgur.com/UCh5OjK

Cependant, lorsque je calcule les banques de filtre mel en utilisant librosa je reçois ...

http://imgur.com/ps3yizk

code:

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

plt.plot(mel_basis) 

Répondre

0

Je suis un peu plus informé maintenant et je me sens comme la réponse donnée n'est pas tout à fait correct, donc je pense que je devrais répondre à ma propre question. Librosa.filters.mel renvoie une matrice avec la forme (n_mels, n_fft/2 + 1). Cela signifie que chaque ligne de la matrice est un mel. Les colonnes représentent le poids de chaque fréquence pour la banque de filtres Mel. La fréquence est en termes de cycles jusqu'au nombre de n_fft, nous en rejetons la moitié en raison d'un aliasing (théorème de Nyquist).

Cela signifie que pour tracer correctement les mels, la matrice doit être transposée. Comme nous voulons effectivement N parcelles différentes où N est le nombre de mels.

plt.plot(mel.T)

Cela donne l'image suivante: enter image description here

Notez que cet ensemble de bancs de filtres mel est toujours pas ce qui est attendu. C'est parce que le Librosa utilise une version normalisée des banques de filtres mel, cela signifie que chacun des mels a une aire de 1 au lieu de la hauteur égale traditionnelle de 1. La matrice retournée par librosa peut être transformée en la même hauteur. banque de filtres par:

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

Et l'intrigue ressemble à ceci: enter image description here

0

Vous n'êtes plus a manquant le vecteur freq, chaque filtre a des échantillons nftt/2 +1 donc la base mel est une matrice de n_mels x (nfft/2 +1) dans librosa.

Afin de calculer le MFCC, vous devez obtenir le spectre de puissance du signal encadré et le multiplier plus tard par la banque de filtres.

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

Si vous préférez une autre option de traçage pourrait être avec une boucle.

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

Mfcc librosa