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; 
	}