DemoHMMDlg.cpp
上传用户:goak128
上传日期:2013-07-17
资源大小:155k
文件大小:5k
- // DemoHMMDlg.cpp : 实现文件
- //
- #include "stdafx.h"
- #include "Platform.h"
- #include "DemoHMMDlg.h"
- #include ".demohmmdlg.h"
- // CDemoHMMDlg 对话框
- IMPLEMENT_DYNAMIC(CDemoHMMDlg, CDialog)
- CDemoHMMDlg::CDemoHMMDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CDemoHMMDlg::IDD, pParent)
- {
- // 设定默认参数
- this->m_pStrFiles = NULL;
- this->m_nFileCount = 0;
- this->m_nCodeNums = 4;
- this->m_pCodeBook = NULL;
- }
- CDemoHMMDlg::~CDemoHMMDlg()
- {
- if (this->m_pStrFiles != NULL)
- {
- delete[] this->m_pStrFiles;
- }
- if (this->m_pCodeBook != NULL)
- {
- delete[] this->m_pCodeBook;
- }
- }
- void CDemoHMMDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- }
- BEGIN_MESSAGE_MAP(CDemoHMMDlg, CDialog)
- ON_BN_CLICKED(IDC_BTN_OPENFILE, OnBnClickedBtnOpenfile)
- ON_BN_CLICKED(IDC_BTN_OPENFILE2, OnBnClickedBtnOpenfile2)
- ON_BN_CLICKED(IDC_BTN_VQ, OnBnClickedBtnVq)
- ON_BN_CLICKED(IDC_BTN_VITERBI, OnBnClickedBtnViterbi)
- ON_BN_CLICKED(IDC_BTN_BTW, OnBnClickedBtnBtw)
- END_MESSAGE_MAP()
- // CDemoHMMDlg 消息处理程序
- //////////////////////////////////////////////////////////////////////////
- // 打开识别文件
- void CDemoHMMDlg::OnBnClickedBtnOpenfile()
- {
- // TODO: 在此添加控件通知处理程序代码
- CFileDialog dlg(TRUE, "*.*", NULL, OFN_ALLOWMULTISELECT);
- CString* pStrFiles = NULL;
- unsigned int nFileNums = 0;
- POSITION pos;
- // 模板文件名显示在text框中
- CString strList;
- // 当前正在访问的文件名下标
- unsigned int nIndex = 0;
- if (dlg.DoModal() == IDOK)
- {
- if (this->m_pStrFiles != NULL)
- {
- delete[] this->m_pStrFiles;
- this->m_pStrFiles = NULL;
- }
- // 计算文件数量
- pos = dlg.GetStartPosition();
- this->m_nFileCount = 0;
- while(pos != NULL)
- {
- this->m_nFileCount++;
- dlg.GetNextPathName(pos);
- }
- // 保存文件路径
- this->m_pStrFiles = new CString[this->m_nFileCount];
- pos = dlg.GetStartPosition();
- nIndex = 0;
- while(pos != NULL)
- {
- this->m_pStrFiles[nIndex] = dlg.GetNextPathName(pos);
- strList += this->m_pStrFiles[nIndex] + "rn";
- nIndex++;
- }
- // 显示模板文件列表
- CWnd::SetDlgItemText(IDC_EDIT_RESULT, strList);
- }
- }
- void CDemoHMMDlg::OnBnClickedBtnOpenfile2()
- {
- // TODO: 在此添加控件通知处理程序代码]
- CFileDialog dlg(TRUE);
- WAVEHDR waveHdr;
- waveHdr.lpData = NULL;
- // 原始裸音频数据
- double* pRawData = NULL;
- // 端点检测后的数据
- double* pSection = NULL;
- // 倒谱数据
- double* pCepstrum = NULL;
- unsigned int nDataLen = 0;
- unsigned int nFrameSize = 256;
- if (dlg.DoModal() == IDOK)
- {
- // 显示WAVE文件路径
- CWnd::SetDlgItemText(IDC_STATIC_WAVEFILE, "待识别文件:" + dlg.GetPathName());
- // 计算WAVE文件码本
- // 初始化码本
- if (this->m_pCodeBook == NULL)
- {
- this->m_pCodeBook = new double[this->m_nCodeNums];
- }
- // 打开所训练文件
- if (this->m_waveOut.LoadFile(dlg.GetPathName(), (DWORD) CWnd::GetSafeHwnd()))
- {
- // 获取原始数据
- this->m_waveOut.GetSamples(&waveHdr, 0);
- if (waveHdr.lpData != NULL)
- {
- // 获取原始数据
- // 进行8位数据的转换
- if (this->m_waveOut.m_wavFile.GetWaveFormat().wBitsPerSample == 8)
- {
- // 计算数据长度
- nDataLen = waveHdr.dwBufferLength;
- pRawData = new double[nDataLen];
- CWaveConvertor::ConvertToDoubleMono(
- (byte*) waveHdr.lpData, waveHdr.dwBufferLength, pRawData);
- }
- // 进行16位数据转换
- else
- {
- // 计算数据长度
- nDataLen = waveHdr.dwBufferLength / 2;
- pRawData = new double[nDataLen];
- CWaveConvertor::ConvertToDoubleMono(
- (int*) waveHdr.lpData, waveHdr.dwBufferLength, pRawData);
- }
- // 对输入数据进行加窗处理
- CSpeech::AddWindow(nFrameSize, pRawData, nDataLen);
- // 对输入数据进行端点检测
- /*pSection = new double[nDataLen];
- nDataLen = CSpeech::SubSection(
- pRawData, nDataLen, nFrameSize, pSection);*/
- // 计算LPC倒谱
- pCepstrum = new double[nDataLen];
- CWaveConvertor::ConvertToCepStrum(
- nDataLen, nFrameSize, pRawData, pCepstrum);
-
- // 生成码本
- CVQ::KMeansCluster(
- pCepstrum, nDataLen, this->m_pCodeBook, this->m_nCodeNums);
- // 释放所占用资源
- delete[] pCepstrum;
- delete[] pRawData;
- // delete[] pSection;
- }
- }
- else
- {
- // 训练文件打开失败
- AfxMessageBox("训练文件格式错误!");
- }
- }
- }
- // 利用VQ方法实现识别
- void CDemoHMMDlg::OnBnClickedBtnVq()
- {
- // TODO: 在此添加控件通知处理程序代码
- CString strWord = CHMM::RecogonizeByVQ(this->m_pCodeBook, this->m_nCodeNums,
- this->m_pStrFiles, this->m_nFileCount);
- AfxMessageBox("识别结果为:" + strWord);
- }
- // 利用Viterbi实现识别
- void CDemoHMMDlg::OnBnClickedBtnViterbi()
- {
- // TODO: 在此添加控件通知处理程序代码
- CString strWord = CHMM::RecogonizeByViterbi(this->m_pCodeBook, this->m_nCodeNums,
- this->m_pStrFiles, this->m_nFileCount);
- AfxMessageBox("识别结果为:" + strWord);
- }
- // 利用DTW实现识别
- void CDemoHMMDlg::OnBnClickedBtnBtw()
- {
- // TODO: 在此添加控件通知处理程序代码
- CString strWord = CHMM::RecogonizeByDTW(this->m_pCodeBook, this->m_nCodeNums,
- this->m_pStrFiles, this->m_nFileCount);
- AfxMessageBox("识别结果为:" + strWord);
- }