2013-03-10 69 views
1

我试图实现从here了解Viterbi算法

一些代码,我与我的系数训练HMM,但不知道如何Viterbi解码器算法的工作,例如:

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). 

但这里是我不明白的:我试图比较两个语音信号(训练,样本)以找出最接近的可能匹配。以DTW算法为例,返回一个整数,然后我可以找到最接近的整数,但是,使用此算法,它将返回int* array,因此区分很困难。

这是目前的方案是如何工作的:

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); 

谁能告诉我Viterbi解码器是如何工作的,用于识别是从训练拿地,到输入端的最佳路径的问题?我已经尝试了解码路径(q)上的欧几里得距离以及汉明距离,但没有这样的运气。

任何帮助,将不胜感激

+0

训练和样本信号的长度是否相同?如果是这样,那么int *数组可能会返回训练和样本的mfcc数组之间的距离。回想一下,通常mfcc意味着你首先将音频块分段,然后从每个音频中提取〜13 coeffecients得到mel特征,所以mfcc的输出是一个二维数组,因此两个样本(2 2d数组)之间的差异是1d数组,其中每个条目是二维数组的特定行的相应差异。 – 2013-03-14 07:39:46

回答

1

在这个例子在我看来,(q)为隐藏状态序列,所以从0-> 9号列表。如果你有两个音频样本,测试和训练,并且你生成两个序列q_test和q_train,那么考虑| q_test-q_train |,其中范数是分量距离,因为它不代表距离的概念正确,因为HMM中的隐藏状态标签可能是任意的。

考虑到距离的一种更自然的方式可能如下,给定q_train,您对测试样本采用相同路径的概率感兴趣,一旦拥有转换矩阵和发射概率,您可以计算该路径。

请让我知道,如果我误解你的问题。