📄 dhmm_hq.cpp
字号:
// 计算当前模型对于全体训练词条的匹配分数和
d_Old_Total_Likelihood = d_Total_Likelihood;
d_Total_Likelihood = 0.0F;
for (n_Word_Sample_Index = 0; n_Word_Sample_Index < n_Word_Sample_Num; n_Word_Sample_Index++)
{
DHMM_Recog_Forward_Backward_GL(pu_DHMM_Model, &pu_Word_Sample[n_Word_Sample_Index], &dTmp);
d_Total_Likelihood += dTmp;
}
// 如果迭代收敛,跳出
// if (fabs((d_Old_Total_Likelihood - d_Total_Likelihood) / d_Old_Total_Likelihood) < 1.0E-6) break;
// DEBUG_PRINTF("\tTotal likelihood = %10.4f, changed %15.4E.\n", d_Total_Likelihood, ((d_Old_Total_Likelihood - d_Total_Likelihood) / d_Old_Total_Likelihood));
}
PRO_LOG("\tLoop = %4d, Total likelihood = %10.4f, changed %15.4E.\n", n_Loop_Index, d_Total_Likelihood, ((d_Old_Total_Likelihood - d_Total_Likelihood) / d_Old_Total_Likelihood));
for (n_Word_Sample_Index = 0; n_Word_Sample_Index < n_Word_Sample_Num; n_Word_Sample_Index++)
{
d2dda_Free(pu_Word_Sample[n_Word_Sample_Index].d2dda_Gamma, pu_Word_Sample[n_Word_Sample_Index].n_Feature_Sequence_Len, pu_DHMM_Model->n_State_Num);
pu_Word_Sample[n_Word_Sample_Index].d2dda_Gamma = NULL;
}
d2dda_Free(d2dda_Nom, pu_DHMM_Model->n_State_Num, pu_DHMM_Model->n_Code_Book_Size);
delete[] pd_Denom;
return 0;
}
int DHMM_Recog_Viterbi_HQ(DHMM_MODEL * pu_DHMM_Model,
WORD_SAMPLE * pu_Word_Sample,
double * pd_Max_Likelihood, int * pn_Status_Sequence)
{
DYNA_2DIM_DOUBLE_ARRAY d2dda_B;
DYNA_2DIM_INT_ARRAY d2dna_LogB;
int n_Code_Word_Index, n_State_Index;
d2dda_B = d2dda_New(pu_DHMM_Model->n_State_Num, pu_DHMM_Model->n_Code_Book_Size);
d2dna_LogB = d2dna_New(pu_DHMM_Model->n_State_Num, pu_DHMM_Model->n_Code_Book_Size);
ASSERT((d2dda_B != NULL) && (d2dna_LogB != NULL));
// 对于B矩阵进行定点化处理,下截底并取对数
for (n_State_Index = 0; n_State_Index < pu_DHMM_Model->n_State_Num; n_State_Index++)
{
memcpy(d2dda_B[n_State_Index], pu_DHMM_Model->d2dda_B[n_State_Index], sizeof(double) * pu_DHMM_Model->n_Code_Book_Size);
}
for (n_State_Index = 0; n_State_Index < pu_DHMM_Model->n_State_Num; n_State_Index++)
{
for (n_Code_Word_Index = 0; n_Code_Word_Index < pu_DHMM_Model->n_Code_Book_Size; n_Code_Word_Index++)
{
if (d2dda_B[n_State_Index][n_Code_Word_Index] < EPSILON_DOUBLE_VALUE)
d2dda_B[n_State_Index][n_Code_Word_Index] = EPSILON_DOUBLE_VALUE;
d2dna_LogB[n_State_Index][n_Code_Word_Index]
= (short)(log10(d2dda_B[n_State_Index][n_Code_Word_Index]) * (65536L / LOG_SCALE) + 32768L);
ASSERT((d2dna_LogB[n_State_Index][n_Code_Word_Index] >= short(MIN_SHORT_VALUE)) && (d2dna_LogB[n_State_Index][n_Code_Word_Index] <= MAX_SHORT_VALUE));
}
}
// 调用定点的Viterbi算法计算匹配分数
*pd_Max_Likelihood = DHMM_Recog_Viterbi_HQ_FIX(d2dna_LogB, pu_DHMM_Model->n_State_Num,
pu_Word_Sample->pn_VQed_Feature_Sequence, pu_Word_Sample->n_Feature_Sequence_Len);
d2dda_Free(d2dda_B, pu_DHMM_Model->n_State_Num, pu_DHMM_Model->n_Code_Book_Size);
d2dna_Free(d2dna_LogB, pu_DHMM_Model->n_State_Num, pu_DHMM_Model->n_Code_Book_Size);
return 0;
}
// 定点viterbi算法,已经对于Pi和A作了简化假设
long DHMM_Recog_Viterbi_HQ_FIX(DYNA_2DIM_INT_ARRAY d2dna_LogB, int n_State_Num,
int * pn_VQed_Feature_Sequence, int n_Feature_Sequence_Len)
{
long * pl_Alpha;
int n_State_Index, n_Frame_Index;
long lTmp1, lTmp2;
int i=0;
int first = 1;
long sl_1 = 0;
long sl_2 = 0;
int second = 1;
pl_Alpha = new long[n_State_Num];
ASSERT(pl_Alpha != NULL);
for (n_State_Index = 0; n_State_Index < n_State_Num; n_State_Index++) pl_Alpha[n_State_Index] = long(MIN_LONG_VALUE) / 2;
pl_Alpha[0] = 0;
pl_Alpha[1] = 0;
// lTmp1: Delta[t-1][i-1], lTmp2: Delta[t-1][i]
for (n_Frame_Index = 1; n_Frame_Index < n_Feature_Sequence_Len; n_Frame_Index++)
{
lTmp1 = MIN_LONG_VALUE;
for (n_State_Index = 0; n_State_Index < n_State_Num; n_State_Index++)
{
lTmp2 = pl_Alpha[n_State_Index];
if (lTmp1 > lTmp2)
pl_Alpha[n_State_Index] = lTmp1;
pl_Alpha[n_State_Index] += d2dna_LogB[n_State_Index][pn_VQed_Feature_Sequence[n_Frame_Index]];
lTmp1 = lTmp2;
}
}
lTmp1 = MIN_LONG_VALUE;
for (n_State_Index = 0; n_State_Index < n_State_Num; n_State_Index++)
{
if (lTmp1 < pl_Alpha[n_State_Index])
lTmp1 = pl_Alpha[n_State_Index];
}
delete[] pl_Alpha;
return lTmp1;
}
int DHMM_Recog_Forward_Backward_HQ(DHMM_MODEL * pu_DHMM_Model,
WORD_SAMPLE * pu_Word_Sample,
double * pd_Max_Likelihood)
{
DYNA_2DIM_DOUBLE_ARRAY d2dda_Alpha;
int n_Frame_Index, n_State_Index;
int nTmp;
double dTmp;
d2dda_Alpha = d2dda_New(pu_Word_Sample->n_Feature_Sequence_Len, pu_DHMM_Model->n_State_Num);
ASSERT(d2dda_Alpha != NULL);
for (n_Frame_Index = 0; n_Frame_Index < pu_Word_Sample->n_Feature_Sequence_Len; n_Frame_Index++)
{
for (n_State_Index = 0; n_State_Index < pu_DHMM_Model->n_State_Num; n_State_Index++)
{
d2dda_Alpha[n_Frame_Index][n_State_Index] = 0.0F;
}
}
d2dda_Alpha[0][0] = pu_DHMM_Model->d2dda_B[0][pu_Word_Sample->pn_VQed_Feature_Sequence[0]];
for (n_Frame_Index = 1; n_Frame_Index < pu_Word_Sample->n_Feature_Sequence_Len; n_Frame_Index++)
{
for (n_State_Index = 0; n_State_Index < pu_DHMM_Model->n_State_Num; n_State_Index++)
{
dTmp = 0.0F;
for (nTmp = 0; nTmp < pu_DHMM_Model->n_State_Num; nTmp++)
{
dTmp += d2dda_Alpha[n_Frame_Index - 1][nTmp] * pu_DHMM_Model->d2dda_A[nTmp][n_State_Index];
}
d2dda_Alpha[n_Frame_Index][n_State_Index] = dTmp * pu_DHMM_Model->d2dda_B[n_State_Index][pu_Word_Sample->pn_VQed_Feature_Sequence[n_Frame_Index]];
}
}
dTmp = 0.0F;
for (n_State_Index = 0; n_State_Index < pu_DHMM_Model->n_State_Num; n_State_Index++)
{
dTmp += d2dda_Alpha[pu_Word_Sample->n_Feature_Sequence_Len - 1][n_State_Index];
}
(*pd_Max_Likelihood) = log(dTmp);
d2dda_Free(d2dda_Alpha, pu_Word_Sample->n_Feature_Sequence_Len, pu_DHMM_Model->n_State_Num);
return 0;
}
static int DHMM_Model_Calculate_Gamma(WORD_SAMPLE * pu_Word_Sample, DHMM_MODEL * pu_DHMM_Model)
{
DYNA_2DIM_DOUBLE_ARRAY d2dda_Alpha;
DYNA_2DIM_DOUBLE_ARRAY d2dda_Beta;
double * pd_C;
int n_Frame_Index, n_State_Index;
int nTmp;
double dTmp;
d2dda_Alpha = d2dda_New(pu_Word_Sample->n_Feature_Sequence_Len, pu_DHMM_Model->n_State_Num);
ASSERT(d2dda_Alpha !=NULL);
for (nTmp = 0; nTmp < pu_DHMM_Model->n_State_Num; nTmp++)
{
d2dda_Alpha[0][nTmp] = 0.0F;
}
d2dda_Alpha[0][0] = pu_DHMM_Model->d2dda_B[0][pu_Word_Sample->pn_VQed_Feature_Sequence[0]];
pd_C = new double[pu_Word_Sample->n_Feature_Sequence_Len];
pd_C[0] = 0.0F;
for (nTmp = 0; nTmp < pu_DHMM_Model->n_State_Num; nTmp++)
{
pd_C[0] += d2dda_Alpha[0][nTmp];
}
pd_C[0] = 1.0F / pd_C[0];
for (nTmp = 0; nTmp < pu_DHMM_Model->n_State_Num; nTmp++)
{
d2dda_Alpha[0][nTmp] *= pd_C[0];
}
for (n_Frame_Index = 1; n_Frame_Index < pu_Word_Sample->n_Feature_Sequence_Len; n_Frame_Index++)
{
for (n_State_Index = 0; n_State_Index < pu_DHMM_Model->n_State_Num; n_State_Index++)
{
dTmp = 0.0F;
for (nTmp = 0; nTmp < pu_DHMM_Model->n_State_Num; nTmp++)
{
dTmp += d2dda_Alpha[n_Frame_Index - 1][nTmp] * pu_DHMM_Model->d2dda_A[nTmp][n_State_Index];
}
d2dda_Alpha[n_Frame_Index][n_State_Index] = dTmp * pu_DHMM_Model->d2dda_B[n_State_Index][pu_Word_Sample->pn_VQed_Feature_Sequence[n_Frame_Index]];
}
pd_C[n_Frame_Index] = 0.0F;
for (nTmp = 0; nTmp < pu_DHMM_Model->n_State_Num; nTmp++)
{
pd_C[n_Frame_Index] += d2dda_Alpha[n_Frame_Index][nTmp];
}
pd_C[n_Frame_Index] = 1.0F / pd_C[n_Frame_Index];
for (nTmp = 0; nTmp < pu_DHMM_Model->n_State_Num; nTmp++)
{
d2dda_Alpha[n_Frame_Index][nTmp] *= pd_C[n_Frame_Index];
}
}
d2dda_Beta = d2dda_New(pu_Word_Sample->n_Feature_Sequence_Len, pu_DHMM_Model->n_State_Num);
ASSERT(d2dda_Beta != NULL);
for (nTmp = 0; nTmp < pu_DHMM_Model->n_State_Num; nTmp++)
{
d2dda_Beta[pu_Word_Sample->n_Feature_Sequence_Len - 1][nTmp] = pd_C[pu_Word_Sample->n_Feature_Sequence_Len - 1];
}
for (n_Frame_Index = pu_Word_Sample->n_Feature_Sequence_Len - 2; n_Frame_Index >= 0; n_Frame_Index--)
{
for (n_State_Index = 0; n_State_Index < pu_DHMM_Model->n_State_Num; n_State_Index++)
{
d2dda_Beta[n_Frame_Index][n_State_Index] = 0.0F;
for (nTmp = 0; nTmp < pu_DHMM_Model->n_State_Num; nTmp++)
{
d2dda_Beta[n_Frame_Index][n_State_Index] +=
d2dda_Beta[n_Frame_Index + 1][nTmp] * pu_DHMM_Model->d2dda_B[nTmp][pu_Word_Sample->pn_VQed_Feature_Sequence[n_Frame_Index + 1]] * pu_DHMM_Model->d2dda_A[n_State_Index][nTmp];
}
}
for (nTmp = 0; nTmp < pu_DHMM_Model->n_State_Num; nTmp++)
{
d2dda_Beta[n_Frame_Index][nTmp] *= pd_C[n_Frame_Index];
}
}
for (n_Frame_Index = 0; n_Frame_Index < pu_Word_Sample->n_Feature_Sequence_Len; n_Frame_Index++)
{
for (n_State_Index = 0; n_State_Index < pu_DHMM_Model->n_State_Num; n_State_Index++)
{
pu_Word_Sample->d2dda_Gamma[n_Frame_Index][n_State_Index]
= d2dda_Alpha[n_Frame_Index][n_State_Index] * d2dda_Beta[n_Frame_Index][n_State_Index];
}
dTmp = 0.0F;
for (n_State_Index = 0; n_State_Index < pu_DHMM_Model->n_State_Num; n_State_Index++)
{
dTmp += pu_Word_Sample->d2dda_Gamma[n_Frame_Index][n_State_Index];
}
for (n_State_Index = 0; n_State_Index < pu_DHMM_Model->n_State_Num; n_State_Index++)
{
pu_Word_Sample->d2dda_Gamma[n_Frame_Index][n_State_Index] /= dTmp;
}
}
d2dda_Free(d2dda_Beta, pu_Word_Sample->n_Feature_Sequence_Len, pu_DHMM_Model->n_State_Num);
delete[] pd_C;
d2dda_Free(d2dda_Alpha, pu_Word_Sample->n_Feature_Sequence_Len, pu_DHMM_Model->n_State_Num);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -