www.pudn.com > hmmPlatform.rar > HMM.h


#pragma once 
#include "VQ.h" 
////////////////////////////////////////////////////////////////////////// 
// 实现基于VQ的HMM模型 
//  
// 创建人:		陈文凯 
// 创建日期:	2005-06-05 
// 修改人: 
// 修改日期: 
 
// 默认状态数 
#define CHMM_STATUS_NUMS 6 
 
// 识别字长度 
#define CHMM_WORD_LEN 10 
 
class CHMM 
{ 
public: 
	CHMM(); 
	~CHMM(void); 
 
public: 
	// 导入HMM模型信息 
	BOOL LoadModel(CString strFileName); 
	// 导出HMM模型信息 
	BOOL SaveModel(CString strFileName); 
	// 释放模型占用资源 
	void Dispose(); 
 
	// 获取对应的词 
	inline CString GetWord() const 
	{ 
		return this->m_strWord; 
	} 
 
	// 实现对HMM模型的迭代训练 
	void Train( 
		const double* pDataIn,		// 输入采样序列 
		unsigned int nInLen			// 输入采样序列长度 
		); 
 
	// 实现对HMM模型得初始化 
	void PrepareTrain( 
		CString strWord,				// 模型对应词 
		const double* pDataIn,			// 第一个输入采样序列 
		unsigned int nInLen,			// 输入采样序列长度 
		unsigned int nFrameSize,		// 分帧宽度 
		unsigned int nStatusNums = 6,	// HMM状态数 
		unsigned int nCodeNums = 4		// 输入码本长度 
		); 
 
	// 基于DTW的Vertibi实现对HMM模型的识别 
	static CString RecogonizeByDTW( 
		const double* pCodeBook,	// 输入码本 
		unsigned int nCodeNums,		// 输入码本长度 
		CString* strModelList,		// 模型文件路径 
		unsigned int nModelCount	// 模型数量 
		); 
 
	// 基于Vertibi算法实现对HMM模型的识别 
	static CString RecogonizeByViterbi( 
		const double* pCodeBook,	// 输入码本 
		unsigned int nCodeNums,		// 输入码本长度 
		CString* strModelList,		// 模型文件路径 
		unsigned int nModelCount	// 模型数量 
		); 
 
	// 基于VQ实现对HMM模型的识别 
	static CString RecogonizeByVQ( 
		const double* pCodeBook,	// 输入码本 
		unsigned int nCodeNums,		// 输入码本长度 
		CString* strModelList,		// 模型文件路径 
		unsigned int nModelCount	// 模型数量 
		); 
 
private: 
	// 实现前后向算法,并输出最大概率 
	double ForwardBackward( 
		const unsigned int* pCodeBook,	// 输入观察码本序列对应的HMM码本的下标 
		unsigned int nCodeNums,			// 输入观察序列长度 
		const double* pPi,				// HMM的pi矢量 
		const double* pA,				// HMM的A矩阵 
		const double* pB,				// HMM的B矩阵 
		unsigned int nStatusNums,		// HMM状态数 
		double* pa,						// 前后向算法中的a 
		double* pb						// 前后向算法中的b 
		); 
 
	// 实现Viterbi算法 
	double Viterbi( 
		const unsigned int* pCodeBook,	// 输入观察码本序列对应的HMM码本的下标 
		unsigned int nCodeNums,			// 输入观察序列长度 
		const double* pPi,				// HMM的pi矢量 
		const double* pA,				// HMM的A矩阵 
		const double* pB,				// HMM的B矩阵 
		unsigned int nStatusNums		// HMM状态数 
		); 
 
	// 实现基于DTW的Viterbi算法 
	double DTW( 
		const unsigned int* pCodeBook,	// 输入观察码本序列对应的HMM码本的下标 
		unsigned int nCodeNums,			// 输入观察序列长度 
		double* pA,						// HMM的A矩阵 
		double* pB,						// HMM的B矩阵 
		unsigned int nStatusNums		// HMM状态数 
		); 
 
	// 实现Baum-Welch算法 
	void BaumWelch( 
		const unsigned int* pCodeBook,	// 输入观察码本序列对应的HMM码本的下标 
		unsigned int nCodeNums,			// 输入观察序列长度 
		double* pPi,					// HMM的pi矢量 
		double* pA,						// HMM的A矩阵 
		double* pB,						// HMM的B矩阵 
		unsigned int nStatusNums,		// HMM状态数 
		double* pa,						// 前后向算法计算所得的pa 
		double* pb,						// 前后向算法计算所得pb 
		double fRate					// 前后向算法计算所得最大概率 
		); 
 
public: 
	double* m_pPi;					// 初始状态分布序列,t=1时间时q1 = Si的概率pi 
	double* m_pA;					// 状态转移概率矩阵,由q(i-1)为s(k)转移到q(i)为s(h)的概率 
	double* m_pB;					// 观察矢量处于某状态的概率 
	double* m_pCodeBook;			// 码本 
	 
	unsigned int m_nStatusNums;		// HMM状态数量 
	unsigned int m_nCodeNums;		// 输入码本长度 
	CString m_strWord;				// 模型对应的词 
	unsigned int m_nFrameSize;		// 求倒谱时所进行的短时快速FFT的短时点数 
};