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的短时点数
};