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

控制台编程

开发平台:

C/C++

  1. // DemoHMMDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "Platform.h"
  5. #include "DemoHMMDlg.h"
  6. #include ".demohmmdlg.h"
  7. // CDemoHMMDlg 对话框
  8. IMPLEMENT_DYNAMIC(CDemoHMMDlg, CDialog)
  9. CDemoHMMDlg::CDemoHMMDlg(CWnd* pParent /*=NULL*/)
  10. : CDialog(CDemoHMMDlg::IDD, pParent)
  11. {
  12. // 设定默认参数
  13. this->m_pStrFiles = NULL;
  14. this->m_nFileCount = 0;
  15. this->m_nCodeNums = 4;
  16. this->m_pCodeBook = NULL;
  17. }
  18. CDemoHMMDlg::~CDemoHMMDlg()
  19. {
  20. if (this->m_pStrFiles != NULL)
  21. {
  22. delete[] this->m_pStrFiles;
  23. }
  24. if (this->m_pCodeBook != NULL)
  25. {
  26. delete[] this->m_pCodeBook;
  27. }
  28. }
  29. void CDemoHMMDlg::DoDataExchange(CDataExchange* pDX)
  30. {
  31. CDialog::DoDataExchange(pDX);
  32. }
  33. BEGIN_MESSAGE_MAP(CDemoHMMDlg, CDialog)
  34. ON_BN_CLICKED(IDC_BTN_OPENFILE, OnBnClickedBtnOpenfile)
  35. ON_BN_CLICKED(IDC_BTN_OPENFILE2, OnBnClickedBtnOpenfile2)
  36. ON_BN_CLICKED(IDC_BTN_VQ, OnBnClickedBtnVq)
  37. ON_BN_CLICKED(IDC_BTN_VITERBI, OnBnClickedBtnViterbi)
  38. ON_BN_CLICKED(IDC_BTN_BTW, OnBnClickedBtnBtw)
  39. END_MESSAGE_MAP()
  40. // CDemoHMMDlg 消息处理程序
  41. //////////////////////////////////////////////////////////////////////////
  42. // 打开识别文件
  43. void CDemoHMMDlg::OnBnClickedBtnOpenfile()
  44. {
  45. // TODO: 在此添加控件通知处理程序代码
  46. CFileDialog dlg(TRUE, "*.*", NULL, OFN_ALLOWMULTISELECT);
  47. CString* pStrFiles = NULL;
  48. unsigned int nFileNums = 0;
  49. POSITION pos;
  50. // 模板文件名显示在text框中
  51. CString strList;
  52. // 当前正在访问的文件名下标
  53. unsigned int nIndex = 0;
  54. if (dlg.DoModal() == IDOK)
  55. {
  56. if (this->m_pStrFiles != NULL)
  57. {
  58. delete[] this->m_pStrFiles;
  59. this->m_pStrFiles = NULL;
  60. }
  61. // 计算文件数量
  62. pos = dlg.GetStartPosition();
  63. this->m_nFileCount = 0;
  64. while(pos != NULL)
  65. {
  66. this->m_nFileCount++;
  67. dlg.GetNextPathName(pos);
  68. }
  69. // 保存文件路径
  70. this->m_pStrFiles = new CString[this->m_nFileCount];
  71. pos = dlg.GetStartPosition();
  72. nIndex = 0;
  73. while(pos != NULL)
  74. {
  75. this->m_pStrFiles[nIndex] = dlg.GetNextPathName(pos);
  76. strList += this->m_pStrFiles[nIndex] + "rn";
  77. nIndex++;
  78. }
  79. // 显示模板文件列表
  80. CWnd::SetDlgItemText(IDC_EDIT_RESULT, strList);
  81. }
  82. }
  83. void CDemoHMMDlg::OnBnClickedBtnOpenfile2()
  84. {
  85. // TODO: 在此添加控件通知处理程序代码]
  86. CFileDialog dlg(TRUE);
  87. WAVEHDR waveHdr;
  88. waveHdr.lpData = NULL;
  89. // 原始裸音频数据
  90. double* pRawData = NULL;
  91. // 端点检测后的数据
  92. double* pSection = NULL;
  93. // 倒谱数据
  94. double* pCepstrum = NULL;
  95. unsigned int nDataLen = 0;
  96. unsigned int nFrameSize = 256;
  97. if (dlg.DoModal() == IDOK)
  98. {
  99. // 显示WAVE文件路径
  100. CWnd::SetDlgItemText(IDC_STATIC_WAVEFILE, "待识别文件:" + dlg.GetPathName());
  101. // 计算WAVE文件码本
  102. // 初始化码本
  103. if (this->m_pCodeBook == NULL)
  104. {
  105. this->m_pCodeBook = new double[this->m_nCodeNums];
  106. }
  107. // 打开所训练文件
  108. if (this->m_waveOut.LoadFile(dlg.GetPathName(), (DWORD) CWnd::GetSafeHwnd()))
  109. {
  110. // 获取原始数据
  111. this->m_waveOut.GetSamples(&waveHdr, 0);
  112. if (waveHdr.lpData != NULL)
  113. {
  114. // 获取原始数据
  115. // 进行8位数据的转换
  116. if (this->m_waveOut.m_wavFile.GetWaveFormat().wBitsPerSample == 8)
  117. {
  118. // 计算数据长度
  119. nDataLen = waveHdr.dwBufferLength;
  120. pRawData = new double[nDataLen];
  121. CWaveConvertor::ConvertToDoubleMono(
  122. (byte*) waveHdr.lpData, waveHdr.dwBufferLength, pRawData);
  123. }
  124. // 进行16位数据转换
  125. else
  126. {
  127. // 计算数据长度
  128. nDataLen = waveHdr.dwBufferLength / 2;
  129. pRawData = new double[nDataLen];
  130. CWaveConvertor::ConvertToDoubleMono(
  131. (int*) waveHdr.lpData, waveHdr.dwBufferLength, pRawData);
  132. }
  133. // 对输入数据进行加窗处理
  134. CSpeech::AddWindow(nFrameSize, pRawData, nDataLen);
  135. // 对输入数据进行端点检测
  136. /*pSection = new double[nDataLen];
  137. nDataLen = CSpeech::SubSection(
  138. pRawData, nDataLen, nFrameSize, pSection);*/
  139. // 计算LPC倒谱
  140. pCepstrum = new double[nDataLen];
  141. CWaveConvertor::ConvertToCepStrum(
  142. nDataLen, nFrameSize, pRawData, pCepstrum);
  143. // 生成码本
  144. CVQ::KMeansCluster(
  145. pCepstrum, nDataLen, this->m_pCodeBook, this->m_nCodeNums);
  146. // 释放所占用资源
  147. delete[] pCepstrum;
  148. delete[] pRawData;
  149. // delete[] pSection;
  150. }
  151. }
  152. else
  153. {
  154. // 训练文件打开失败
  155. AfxMessageBox("训练文件格式错误!");
  156. }
  157. }
  158. }
  159. // 利用VQ方法实现识别
  160. void CDemoHMMDlg::OnBnClickedBtnVq()
  161. {
  162. // TODO: 在此添加控件通知处理程序代码
  163. CString strWord = CHMM::RecogonizeByVQ(this->m_pCodeBook, this->m_nCodeNums, 
  164. this->m_pStrFiles, this->m_nFileCount);
  165. AfxMessageBox("识别结果为:" + strWord);
  166. }
  167. // 利用Viterbi实现识别
  168. void CDemoHMMDlg::OnBnClickedBtnViterbi()
  169. {
  170. // TODO: 在此添加控件通知处理程序代码
  171. CString strWord = CHMM::RecogonizeByViterbi(this->m_pCodeBook, this->m_nCodeNums, 
  172. this->m_pStrFiles, this->m_nFileCount);
  173. AfxMessageBox("识别结果为:" + strWord);
  174. }
  175. // 利用DTW实现识别
  176. void CDemoHMMDlg::OnBnClickedBtnBtw()
  177. {
  178. // TODO: 在此添加控件通知处理程序代码
  179. CString strWord = CHMM::RecogonizeByDTW(this->m_pCodeBook, this->m_nCodeNums, 
  180. this->m_pStrFiles, this->m_nFileCount);
  181. AfxMessageBox("识别结果为:" + strWord);
  182. }