HMM.h
上传用户:goak128
上传日期:2013-07-17
资源大小:155k
文件大小:4k
源码类别:

控制台编程

开发平台:

C/C++

  1. #pragma once
  2. #include "VQ.h"
  3. //////////////////////////////////////////////////////////////////////////
  4. // 实现基于VQ的HMM模型
  5. // 
  6. // 创建人: 陈文凯
  7. // 创建日期: 2005-06-05
  8. // 修改人:
  9. // 修改日期:
  10. // 默认状态数
  11. #define CHMM_STATUS_NUMS 6
  12. // 识别字长度
  13. #define CHMM_WORD_LEN 10
  14. class CHMM
  15. {
  16. public:
  17. CHMM();
  18. ~CHMM(void);
  19. public:
  20. // 导入HMM模型信息
  21. BOOL LoadModel(CString strFileName);
  22. // 导出HMM模型信息
  23. BOOL SaveModel(CString strFileName);
  24. // 释放模型占用资源
  25. void Dispose();
  26. // 获取对应的词
  27. inline CString GetWord() const
  28. {
  29. return this->m_strWord;
  30. }
  31. // 实现对HMM模型的迭代训练
  32. void Train(
  33. const double* pDataIn, // 输入采样序列
  34. unsigned int nInLen // 输入采样序列长度
  35. );
  36. // 实现对HMM模型得初始化
  37. void PrepareTrain(
  38. CString strWord, // 模型对应词
  39. const double* pDataIn, // 第一个输入采样序列
  40. unsigned int nInLen, // 输入采样序列长度
  41. unsigned int nFrameSize, // 分帧宽度
  42. unsigned int nStatusNums = 6, // HMM状态数
  43. unsigned int nCodeNums = 4 // 输入码本长度
  44. );
  45. // 基于DTW的Vertibi实现对HMM模型的识别
  46. static CString RecogonizeByDTW(
  47. const double* pCodeBook, // 输入码本
  48. unsigned int nCodeNums, // 输入码本长度
  49. CString* strModelList, // 模型文件路径
  50. unsigned int nModelCount // 模型数量
  51. );
  52. // 基于Vertibi算法实现对HMM模型的识别
  53. static CString RecogonizeByViterbi(
  54. const double* pCodeBook, // 输入码本
  55. unsigned int nCodeNums, // 输入码本长度
  56. CString* strModelList, // 模型文件路径
  57. unsigned int nModelCount // 模型数量
  58. );
  59. // 基于VQ实现对HMM模型的识别
  60. static CString RecogonizeByVQ(
  61. const double* pCodeBook, // 输入码本
  62. unsigned int nCodeNums, // 输入码本长度
  63. CString* strModelList, // 模型文件路径
  64. unsigned int nModelCount // 模型数量
  65. );
  66. private:
  67. // 实现前后向算法,并输出最大概率
  68. double ForwardBackward(
  69. const unsigned int* pCodeBook, // 输入观察码本序列对应的HMM码本的下标
  70. unsigned int nCodeNums, // 输入观察序列长度
  71. const double* pPi, // HMM的pi矢量
  72. const double* pA, // HMM的A矩阵
  73. const double* pB, // HMM的B矩阵
  74. unsigned int nStatusNums, // HMM状态数
  75. double* pa, // 前后向算法中的a
  76. double* pb // 前后向算法中的b
  77. );
  78. // 实现Viterbi算法
  79. double Viterbi(
  80. const unsigned int* pCodeBook, // 输入观察码本序列对应的HMM码本的下标
  81. unsigned int nCodeNums, // 输入观察序列长度
  82. const double* pPi, // HMM的pi矢量
  83. const double* pA, // HMM的A矩阵
  84. const double* pB, // HMM的B矩阵
  85. unsigned int nStatusNums // HMM状态数
  86. );
  87. // 实现基于DTW的Viterbi算法
  88. double DTW(
  89. const unsigned int* pCodeBook, // 输入观察码本序列对应的HMM码本的下标
  90. unsigned int nCodeNums, // 输入观察序列长度
  91. double* pA, // HMM的A矩阵
  92. double* pB, // HMM的B矩阵
  93. unsigned int nStatusNums // HMM状态数
  94. );
  95. // 实现Baum-Welch算法
  96. void BaumWelch(
  97. const unsigned int* pCodeBook, // 输入观察码本序列对应的HMM码本的下标
  98. unsigned int nCodeNums, // 输入观察序列长度
  99. double* pPi, // HMM的pi矢量
  100. double* pA, // HMM的A矩阵
  101. double* pB, // HMM的B矩阵
  102. unsigned int nStatusNums, // HMM状态数
  103. double* pa, // 前后向算法计算所得的pa
  104. double* pb, // 前后向算法计算所得pb
  105. double fRate // 前后向算法计算所得最大概率
  106. );
  107. public:
  108. double* m_pPi; // 初始状态分布序列,t=1时间时q1 = Si的概率pi
  109. double* m_pA; // 状态转移概率矩阵,由q(i-1)为s(k)转移到q(i)为s(h)的概率
  110. double* m_pB; // 观察矢量处于某状态的概率
  111. double* m_pCodeBook; // 码本
  112. unsigned int m_nStatusNums; // HMM状态数量
  113. unsigned int m_nCodeNums; // 输入码本长度
  114. CString m_strWord; // 模型对应的词
  115. unsigned int m_nFrameSize; // 求倒谱时所进行的短时快速FFT的短时点数
  116. };