📄 dhmm_vq_mfc.cpp
字号:
// 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 + -