⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dhmm_hq.cpp

📁 语音识别配套的VQ及DHMM模型训练程序(C语言)
💻 CPP
📖 第 1 页 / 共 2 页
字号:

		//	计算当前模型对于全体训练词条的匹配分数和
		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 + -