Code MATLAB pour le calcul des MFCC

J'ai une question si c'est ok. J'ai récemment été à la recherche pour l'algorithme pour calculer MFCCs. J'ai trouvé un bon tutoriel plutôt que le code donc j'ai essayé de code par moi-même. Je me sens toujours comme je suis en manque une chose. Dans le code ci-dessous j'ai pris la FFT d'un signal, calculée de la puissance normalisée, filtre un signal à l'aide de formes triangulaires et, finalement, la somme des énergies correspondant à chaque banque pour obtenir des MFCCs.

function output = mfcc(x,M,fbegin,fs)
MF = @(f) 2595.*log10(1 + f./700);
invMF = @(m) 700.*(10.^(m/2595)-1);
M = M+2; % number of triangular filers
mm = linspace(MF(fbegin),MF(fs/2),M); % equal space in mel-frequency
ff = invMF(mm); % convert mel-frequencies into frequency
X = fft(x);
N = length(X); % length of a short time window
N2 = max([floor(N+1)/2 floor(N/2)+1]); %
P = abs(X(1:N2,:)).^2./N; % NoFr no. of periodograms
mfccShapes = triangularFilterShape(ff,N,fs); %
output = log(mfccShapes'*P);
end
function [out,k] = triangularFilterShape(f,N,fs)
N2 = max([floor(N+1)/2 floor(N/2)+1]);
M = length(f);
k = linspace(0,fs/2,N2);
out = zeros(N2,M-2);
for m=2:M-1
I = k >= f(m-1) & k <= f(m);
J = k >= f(m) & k <= f(m+1);
out(I,m-1) = (k(I) - f(m-1))./(f(m) - f(m-1));
out(J,m-1) = (f(m+1) - k(J))./(f(m+1) - f(m));
end
end

Quelqu'un pourrait s'il vous plaît confirmer que c'est tout droit ou direct-moi si j'ai fait une erreur> je l'ai testé sur une simple tonalité et il me donne, à mon avis, des réponses raisonnables.

Toute aide grandement appréciée 🙂

PS. Je suis en train de travailler sur la façon d'appliquer vectorisé Cosinus Transform. Il semble que j'ai besoin d'une matrice de MxM de transformer les coefficients, mais je n'ai trouvé aucune source qui pourrait expliquer comment le faire.

Si quelqu'un est intéressé par ce fil, j'ai trouvé un assez bon site Nokia DEVELOPER. Il y a des informations sur un signal de préconditionnement etc.
Également demandé à dsp.stackexchange.com/questions/12812/mfcc-calculation
Oui, c'est parce que je n'ai pas de réponse ici.

OriginalL'auteur Celdor | 2013-11-19