2013-03-10 15 views
1

Je suis en train de mettre en œuvre un code de hereComprendre algorithme de Viterbi

Et je me suis entraîné HMM avec mes coefficients mais ne comprennent pas comment fonctionne l'algorithme de Viterbi décodeur, par exemple:

viterbi_decode(MFCC, M, model, q); 
where MFCC = coefficents 
M = size of MFCC 
model = Model of HMM training using the MFCC coefficients 
q = unknown (believed to be the outputted path). 

Mais voici ce que je ne comprends pas: j'essaie de comparer deux signaux de parole (entraînement, échantillon) pour trouver le plus proche possible. Avec l'algorithme DTW par exemple, un seul entier est retourné où je peux alors trouver le plus proche, cependant, avec cet algorithme, il renvoie un int* array et donc la différenciation est difficile.

Voici comment fonctionne le programme actuel:

vector<DIMENSIONS_2> MFCC = mfcc.transform(rawData, sample_rate); 

int N = MFCC.size(); 
int M = 13; 

double** mfcc_setup = setupHMM(MFCC, N, M); 

model_t* model = hmm_init(mfcc_setup, N, M, 10); 

hmm_train(mfcc_setup, N, model); 

int* q = new int[N]; 

viterbi_decode(mfcc_setup, M, model, q); 

Quelqu'un pourrait-il s'il vous plaît me dire comment fonctionne le décodeur Viterbi pour le problème de l'identification qui est le meilleur chemin à prendre de la formation, à l'entrée? J'ai essayé à la fois la distance euclidienne ainsi que la distance de Hamming sur le chemin de décodage (q) mais n'a pas eu une telle chance.

Toute aide serait grandement appréciée

+0

Les signaux d'apprentissage et d'échantillonnage sont-ils de même longueur? Si c'est le cas, le tableau int * peut renvoyer les distances entre le tableau mfcc de l'entraînement et l'échantillon. Rappelons que habituellement mfcc signifie que vous coupez d'abord l'audio en segments puis extrayez ~ 13 coeffecients de chaque audio obtenez les fonctions mel, donc la sortie de mfcc est un tableau 2d, donc la différence entre deux échantillons (2 2d tableaux), est un 1d tableau où chaque entrée est la différence respective d'une rangée particulière des tableaux 2d. –

Répondre

1

Dans cet exemple, il me semble que (q) est la séquence d'état caché, donc une liste des numéros de 0-> 9. Si vous avez deux échantillons audio, dites, testez et entraînez, et vous générez deux séquences q_test et q_train, alors penser à | q_test - q_train |, où la norme est la distance par composante, n'est pas utile car il ne représente pas une notion de distance correctement, puisque les étiquettes d'état cachées dans HMM peuvent être arbitraires. Une façon plus naturelle de penser à la distance peut être la suivante, étant donné q_train, vous êtes intéressé par la probabilité que votre échantillon de test prenne le même chemin, que vous pouvez calculer une fois que vous avez la matrice de transition et les probabilités d'émission.

Veuillez me faire savoir si j'ai mal compris votre question.