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

📄 dhmm_vq_mfc.cpp

📁 语音识别配套的VQ及DHMM模型训练程序(C语言)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//	DHMM_VQ_MFC.cpp:
//		Implementation of the DHMM_VQ_MFC Module.
//		That is to Train VQ Code_Book.
//
//	Created 2001/08, By DongMing, MDSR.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DHMM_VQ_MFC.h"
#include "kwspot.h"
#include "DAT_File_Access.h"

#include "DHMM_GL.h"
#include "DHMM_LHS.h"
#include "DHMM_HQ.h"
#include "DHMM_WP.h"

//////////////////////////////////////////////////////////////////////
//	Private functions

//	函数功能:将一个词的一帧特征进行VQ编码
int DHMM_VQ_Encode_A_Code_Word(DYNA_2DIM_DOUBLE_ARRAY d2dda_Code_Book, int n_Code_Book_Size, int n_Code_Word_Dim,
							   double * pd_Code_Word);
//	函数功能:将一个词的一帧特征进行VQ编码,定点程序
int DHMM_VQ_Encode_A_Code_Word_FIX(DYNA_2DIM_INT_ARRAY d2dna_Code_Book, int n_Code_Book_Size, int n_Code_Word_Dim,
								   int * pn_Code_Word);

extern PRO_CONFIG u_Pro_Config;

//////////////////////////////////////////////////////////////////////
//	API functions

//////////////////////////////////////////////////////////////////////
//	函数名称:DHMM_VQ
//	函数功能:DHMM程序进行码书训练模块的入口
//	函数性质:API
//	输入参数:
//		无
//	输出参数:
//		无
//	返回值:
//		0 表示成功
//	备注:本模块完成DHMM的码书训练,模块的应用接口实际上是基于文件的,
//		训练的码书存放在u_Pro_Config.sz_Tmp_Code_Book_File_Name
int DHMM_VQ(void)
{
	int nRetCode;
	DYNA_2DIM_DOUBLE_ARRAY d2dda_Code_Book;
	DYNA_2DIM_DOUBLE_ARRAY d2dda_Total_Feature;
	long n_Total_Feature_Num;

	d2dda_Code_Book = d2dda_New(u_Pro_Config.n_VQ_Code_Book_Size, u_Pro_Config.n_Feature_Dim);
	ASSERT(d2dda_Code_Book != NULL);

	//	Load_Only Code_Book
	if ((u_Pro_Config.l_VQ_Config & VQ_CONFIG_GENERATE_CODE_BOOK_MASK) == VQ_CONFIG_LOAD_ONLY_CODE_BOOK)
	{
		nRetCode = DHMM_VQ_Load_Code_Book_File(u_Pro_Config.sz_Toload_Code_Book_File_Name,
			d2dda_Code_Book, u_Pro_Config.n_VQ_Code_Book_Size, u_Pro_Config.n_Feature_Dim);
		ASSERT(nRetCode == 0);
	}
	//	Train_Only Code_Book
	else if ((u_Pro_Config.l_VQ_Config & VQ_CONFIG_GENERATE_CODE_BOOK_MASK) == VQ_CONFIG_TRAIN_ONLY_CODE_BOOK)
	{
		nRetCode = DHMM_VQ_Load_All_Feature(&d2dda_Total_Feature, &n_Total_Feature_Num);
		ASSERT(nRetCode == 0);

		nRetCode = DHMM_VQ_Train_Code_Book(d2dda_Total_Feature, n_Total_Feature_Num, u_Pro_Config.n_Feature_Dim,
			NULL, d2dda_Code_Book, u_Pro_Config.n_VQ_Code_Book_Size);
		ASSERT(nRetCode == 0);
		nRetCode = DHMM_VQ_Save_Code_Book_File(u_Pro_Config.sz_Toload_Code_Book_File_Name,
			d2dda_Code_Book, u_Pro_Config.n_VQ_Code_Book_Size, u_Pro_Config.n_Feature_Dim);
		ASSERT(nRetCode == 0);

		DHMM_VQ_To_519_CodeBook();

		d2dda_Free(d2dda_Total_Feature, n_Total_Feature_Num, u_Pro_Config.n_Feature_Dim);

	}
	nRetCode = DHMM_VQ_Save_Code_Book_File(u_Pro_Config.sz_Toload_Code_Book_File_Name,
	d2dda_Code_Book, u_Pro_Config.n_VQ_Code_Book_Size, u_Pro_Config.n_Feature_Dim);
	ASSERT(nRetCode == 0);

	d2dda_Free(d2dda_Code_Book, u_Pro_Config.n_VQ_Code_Book_Size, u_Pro_Config.n_Feature_Dim);
	return 0;
}

//////////////////////////////////////////////////////////////////////
//	函数名称:DHMM_VQ_Train_Code_Book
//	函数功能:训练码书
//	函数性质:API
//	输入参数:
//		d2dda_Total_Feature,存放所有的特征
//		n_Total_Feature_Num,总的特征数
//		n_Code_Word_Dim,特征维数
//		d2dda_Initial_Code_Book,存放初始码书,允许为NULL,表示程序自动初始化
//		n_Code_Book_Size,码书大小
//	输出参数:
//		d2dda_Code_Book,存放训好的码书
//	返回值:
//		0 表示成功
//	备注:
//		该函数是一个分发函数,按照u_Pro_Config.l_VQ_Config配置的信息
//		将具体调用不同的函数体
int DHMM_VQ_Train_Code_Book(DYNA_2DIM_DOUBLE_ARRAY d2dda_Total_Feature, int n_Total_Feature_Num, int n_Code_Word_Dim,
							DYNA_2DIM_DOUBLE_ARRAY d2dda_Initial_Code_Book, DYNA_2DIM_DOUBLE_ARRAY d2dda_Code_Book, int n_Code_Book_Size)
{
	switch (u_Pro_Config.l_VQ_Config & VQ_CONFIG_TRAIN_PROCEDURE_MASK)
	{
	case VQ_CONFIG_TRAIN_PROCEDURE_STD:
		ASSERT(0);
		break;
	case VQ_CONFIG_TRAIN_PROCEDURE_GL:
		return DHMM_VQ_Train_Code_Book_GL(d2dda_Total_Feature, n_Total_Feature_Num, n_Code_Word_Dim,
			d2dda_Initial_Code_Book, d2dda_Code_Book, n_Code_Book_Size);
		break;
	case VQ_CONFIG_TRAIN_PROCEDURE_LHS:
		ASSERT(0);	//LHS的训练过程,与GL的完全相同,故略去
		break;
	case VQ_CONFIG_TRAIN_PROCEDURE_HQ:
		return DHMM_VQ_Train_Code_Book_HQ(d2dda_Total_Feature, n_Total_Feature_Num, n_Code_Word_Dim,
			d2dda_Initial_Code_Book, d2dda_Code_Book, n_Code_Book_Size);
		break;
	case VQ_CONFIG_TRAIN_PROCEDURE_WP:
		return DHMM_VQ_Train_Code_Book_WP(d2dda_Total_Feature, n_Total_Feature_Num, n_Code_Word_Dim,
			d2dda_Initial_Code_Book, d2dda_Code_Book, n_Code_Book_Size);
		break;
	default:
		ASSERT(0);
		break;
	}

	return 0;
}

//////////////////////////////////////////////////////////////////////
//	函数名称:DHMM_VQ_Save_Code_Book_File
//	函数功能:向.DAT格式的码书文件中存储码书
//	函数性质:API
//	输入参数:
//		sz_Tosave_Code_Book_File_Name,存放码书的文件名
//		n_Code_Book_Size,码书的大小(VQ的结果数)
//		n_Code_Word_Dim,每个码字的维数
//	输出参数:
//		d2dda_Code_Book,存放待写入的码书
//	返回值:
//		0 表示成功
//	备注:
//		码书存储使用.DAT格式中的码书存储格式,可参见DAT_File_Access模块
int DHMM_VQ_Save_Code_Book_File(char * sz_Tosave_Code_Book_File_Name,
								DYNA_2DIM_DOUBLE_ARRAY d2dda_Code_Book, int n_Code_Book_Size, int n_Code_Word_Dim)
{
	FILE * fp_Code_Book_File;
	CODE_BOOK_FILE_HEAD u_Code_Book_File_Head;
	long l_Word_Sample_Offset;
	int n_Code_Word_Index;
	long lTmp;

	fp_Code_Book_File = fopen(sz_Tosave_Code_Book_File_Name, "wb");
	ASSERT(fp_Code_Book_File != NULL);

	memset(&u_Code_Book_File_Head, 0, sizeof(u_Code_Book_File_Head));
	u_Code_Book_File_Head.lVersion = DAT_FILE_VERSION;
	strcpy(u_Code_Book_File_Head.szName, "CodeBook");
	u_Code_Book_File_Head.sCodeBookNum = u_Code_Book_File_Head.sCodeBookNum2 = 1;
	strcpy(u_Code_Book_File_Head.szParameterType, "CodeBook");
	u_Code_Book_File_Head.sSampleType = SAMPLE_DATA_TYPE_DOUBLE;
	u_Code_Book_File_Head.sFeatureOrder = n_Code_Word_Dim;
	u_Code_Book_File_Head.sCodeBookSize = n_Code_Book_Size;

	ASSERT(sizeof(u_Code_Book_File_Head) == 200);
	fwrite(&u_Code_Book_File_Head, sizeof(u_Code_Book_File_Head), 1, fp_Code_Book_File);

	lTmp = 0;
	fwrite(&lTmp, sizeof(long), 1, fp_Code_Book_File);
	fwrite(&lTmp, sizeof(long), 1, fp_Code_Book_File);

	fseek(fp_Code_Book_File, 0, SEEK_END);
	l_Word_Sample_Offset = ftell(fp_Code_Book_File);
	fseek(fp_Code_Book_File, 200 + 4 * 2 * (0), SEEK_SET);
	fwrite(&l_Word_Sample_Offset, sizeof(long), 1, fp_Code_Book_File);
	fwrite(&n_Code_Book_Size, sizeof(long), 1, fp_Code_Book_File);
	fseek(fp_Code_Book_File, l_Word_Sample_Offset, SEEK_SET);
	for (n_Code_Word_Index = 0; n_Code_Word_Index < n_Code_Book_Size; n_Code_Word_Index++)
	{
		fwrite(d2dda_Code_Book[n_Code_Word_Index], sizeof(double), n_Code_Word_Dim, fp_Code_Book_File);
	}

	fclose(fp_Code_Book_File);
	return 0;
}

//////////////////////////////////////////////////////////////////////
//	函数名称:DHMM_VQ_Load_Code_Book_File
//	函数功能:从.DAT格式的码书文件中读取码书
//	函数性质:API
//	输入参数:
//		sz_Toload_Code_Book_File_Name,存放码书的文件名
//		n_Code_Book_Size,码书的大小(VQ的结果数)
//		n_Code_Word_Dim,每个码字的维数
//	输出参数:
//		d2dda_Code_Book,存放读出的码书
//	返回值:
//		0 表示成功
//	备注:
//		码书存储使用.DAT格式中的码书存储格式,可参见DAT_File_Access模块
int DHMM_VQ_Load_Code_Book_File(char * sz_Toload_Code_Book_File_Name,
								DYNA_2DIM_DOUBLE_ARRAY d2dda_Code_Book, int n_Code_Book_Size, int n_Code_Word_Dim)
{
	FILE * fp_Code_Book_File;
	CODE_BOOK_FILE_HEAD u_Code_Book_File_Head;
	long l_Word_Sample_Offset;
	int n_Code_Word_Index;

	fp_Code_Book_File = fopen(sz_Toload_Code_Book_File_Name, "rb");
	ASSERT(fp_Code_Book_File != NULL);

	fread(&u_Code_Book_File_Head, sizeof(u_Code_Book_File_Head), 1, fp_Code_Book_File);
	ASSERT(u_Code_Book_File_Head.lVersion >= DAT_FILE_VERSION);
	ASSERT(u_Code_Book_File_Head.sCodeBookSize == n_Code_Book_Size);
	ASSERT(u_Code_Book_File_Head.sFeatureOrder == n_Code_Word_Dim);

	fread(&l_Word_Sample_Offset, sizeof(long), 1, fp_Code_Book_File);

	fseek(fp_Code_Book_File, l_Word_Sample_Offset, SEEK_SET);
	for (n_Code_Word_Index = 0; n_Code_Word_Index < n_Code_Book_Size; n_Code_Word_Index++)
	{
		fread(d2dda_Code_Book[n_Code_Word_Index], sizeof(double), n_Code_Word_Dim, fp_Code_Book_File);
	}

	fclose(fp_Code_Book_File);

	return 0;
}

//////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -