C++ 理解维特比算法

C++ 理解维特比算法,c++,algorithm,hidden-markov-models,viterbi,C++,Algorithm,Hidden Markov Models,Viterbi,我正在尝试从中实现一些代码 我用我的系数训练了HMM,但不了解维特比解码器算法是如何工作的,例如: 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). 但我不明白的是:

我正在尝试从中实现一些代码

我用我的系数训练了HMM,但不了解维特比解码器算法是如何工作的,例如:

 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*数组
,因此很难区分

以下是当前程序的工作原理:

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); 
vector MFCC=MFCC.transform(原始数据、采样率);
int N=MFCC.size();
int M=13;
双**mfcc_设置=设置HMM(mfcc,N,M);
model_t*model=hmm_init(mfcc_设置,N,M,10);
hmm_训练(mfcc_设置,N,模型);
int*q=新的int[N];
维特比解码(mfcc_设置,M,模型,q);
有谁能告诉我维特比解码器是如何解决从训练到输入的最佳路径识别问题的?我在解码路径
(q)
上尝试了欧几里德距离和汉明距离,但没有这样的运气


任何帮助都将不胜感激

在本例中,在我看来,(q)是隐藏状态序列,因此是0->9的数字列表。如果你有两个音频样本,比如test和train,你生成了两个序列q|u test和q|train,那么考虑| q|u test-q|u train |,其中范数是分量距离,是没有用的,因为它不能正确地表示距离的概念,因为HMM中隐藏的状态标签可能是任意的

考虑距离的一种更自然的方式可能是,给定q_序列,您对测试样本采用相同路径的概率感兴趣,一旦您有了转移矩阵和发射概率,您就可以计算出该概率


如果我误解了你的问题,请告诉我。

在这个例子中,我觉得(q)是隐藏状态序列,所以是0->9的数字列表。如果你有两个音频样本,比如test和train,你生成了两个序列q|u test和q|train,那么考虑| q|u test-q|u train |,其中范数是分量距离,是没有用的,因为它不能正确地表示距离的概念,因为HMM中隐藏的状态标签可能是任意的

考虑距离的一种更自然的方式可能是,给定q_序列,您对测试样本采用相同路径的概率感兴趣,一旦您有了转移矩阵和发射概率,您就可以计算出该概率


如果我误解了您的问题,请告诉我。

训练信号和样本信号长度相同吗?如果是这样,int*数组可能返回训练和样本的mfcc数组之间的距离。回想一下,mfcc通常意味着您首先将音频分块,然后从每个音频中提取~13个系数以获得mel特征,因此mfcc的输出是一个2d数组,因此两个样本(2个2d数组)之间的差异,是一个一维数组,其中每个条目是二维数组中特定行的各自差异。训练信号和采样信号的长度是否相同?如果是这样,int*数组可能返回训练和样本的mfcc数组之间的距离。回想一下,通常mfcc意味着您首先将音频分块,然后从每个音频中提取~13个系数以获得mel特征,因此mfcc的输出是一个2d数组,因此两个样本(2个2d数组)之间的差异是一个1d数组,其中每个条目是2d数组中特定行的相应差异。