www.pudn.com > hmmtrain.rar > hmm.h
/************************************************************************ ** File: hmm.h ** 功能:提供HMM的数据结构和定义 */ #include#include #include #include #include #include #include #define FNUM 40 //#define MAX(x,y) ((x) > (y) ? (x) : (y)) //#define MIN(x,y) ((x) < (y) ? (x) : (y)) #define Sque 27//每个单词对应的序列数,根据说话人多少而定 #define CODENUM 128 #define STATE 5 #define LENGTH 256 #define e 0.0001 using namespace std; class HMM{ public: int N; /* 状态的个数; Q={1,2,...,N} */ int M; /* 观察值得个数; V={1,2,...,M}*/ //int T; double pprobf;//前向概率值 //double pprobb;//后向概率值 double logprobf;//前向概率对数值 double logprobb;//后向概率对数值 double (*A)[STATE]; /* A[1..N][1..N]. a[i][j] 是从t时刻的状态i转移到t+1时刻的状态j的转移概率*/ double (*B)[CODENUM]; /* B[1..N][1..M]. b[j][k] 是在状态j观察到观察值k的概率 ,M最大值取100*/ double *pi; /* pi[1..N] pi[i] 是进入Markov链的状态分布 */ //double *pireestim; double *scale; double scalesum; double (*alpha)[STATE]; double (*beta)[STATE]; double *igammasum; //double *gamma;//用来重估初始概率值 public: void PrintHMM(string str,HMM *phmm); void InitHMM(HMM *phmm, int N, int M); //关于序列的存取,状态的计算等等 void PrintSequence(string fileName, int T, int *O); void GenSequenceArray(HMM *phmm, int seed, int T, int *O, int *q); int GenInitalState(HMM *phmm); int GenNextState(HMM *phmm, int q_t); int GenSymbol(HMM *phmm, int q_t); //前向后向算法、BaumWelch算法 void rescale_alphas(HMM *phmm, int t); void rescale_betas(HMM *phmm, int t); void ForwardWithScale(HMM *phmm, int T, int *O); void BackwardWithScale(HMM *phmm, int T, int *O); void BaumWelch(HMM *phmm, int *NUM); //平滑 void smooth(HMM *phmm); void ComputeGamma(HMM *phmm, int T, int *O); //Viterbi算法 void Viterbi(HMM *phmm, int T, int *O, double **delta, int **psi, int *q, double *pprob); void ViterbiLog(HMM *phmm, int T, int *O, double **delta, int **psi, int *q, double *pprob); //随机数相关函数 //int hmmgetseed(void); void hmmsetseed(); double hmmgetrand(void); HMM(); ~HMM(); }; HMM::HMM() { N=STATE; M=CODENUM; pprobf=0.0; logprobf=0.0; logprobb=0.0; scalesum=0.0; A=new double[STATE][STATE]; B=new double[STATE][CODENUM]; pi=new double[STATE]; scale=new double[LENGTH]; alpha=new double[LENGTH][STATE]; beta=new double[LENGTH][STATE]; //pireestim=new double[STATE]; igammasum=new double[STATE]; //gamma=new double[10]; } HMM::~HMM() { delete []A; delete []B; delete []pi; delete []scale; delete []alpha; delete []beta; //delete []pireestim; delete []igammasum; //delete []gamma; } string itostr(int i){ string temp; stringstream stream; stream<>temp; return temp; }