www.pudn.com > AudioWave.rar > AudioDlg.cpp


// AudioDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "Audio.h" 
#include "AudioDlg.h" 
#include "DialogFFTPara.h" 
#include  
 
#define PI 3.1415926 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#define LINESIZE 1 
#define SCROLLLEN 10000 
 
 
//#define COLORAXIS      RGB(255,0,0) 
#define COLORAXIS      RGB(0,0,0)              // axis 
#define COLORSILENCE   RGB(0,0,255) 
#define COLORCONSONANT RGB(80,143,86) 
#define COLORVOWEL     RGB(255,255,0) 
#define COLORVOWEL1    RGB(160,155,0) 
#define COLORC_V       RGB(0,255,255) 
#define COLORNOTTEST   RGB(255,0,255) 
 
#define VIEW_WAVE_8  1 
#define VIEW_WAVE_16 2 
#define VIEW_FFT     3 
#define VIEW_DCT     4 
#define VIEW_SOUNDIN 5 
 
// timer and it's flag 
#define MY_TIMER_LENGTH 30 //ms 
#define MY_TIMER_ARRIVE 11 
#define MY_TIMER_SOUND  12 
 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CAudioDlg dialog 
 
CAudioDlg::CAudioDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CAudioDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CAudioDlg) 
	m_bCheckColor = FALSE; 
	m_bCheckCycle = FALSE; 
	m_strEditAllTime = _T(""); 
	m_nEditChannel = 0; 
	m_nEditPointPerSec = 0; 
	m_nEditPosition = 0; 
	m_nEditWholeLength = 0; 
	m_nEditZoomX = 1; 
	m_fEditZoomY = 4.0f; 
	m_nEditBit = 0; 
	m_dwEditOffSet = 0; 
	m_bCheckResult = FALSE; 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_dwOffSet = m_dwEditOffSet; 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CAudioDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAudioDlg) 
	DDX_Control(pDX, IDC_LIST_INFO, m_ListBox_Info); 
	DDX_Control(pDX, IDC_CHECK_RESULT, m_cCheckResult); 
	DDX_Control(pDX, IDC_STATIC_VIEW, m_cView); 
	DDX_Control(pDX, IDC_SCROLLBAR, m_cScrollBar); 
	DDX_Check(pDX, IDC_CHECK_COLOR, m_bCheckColor); 
	DDX_Check(pDX, IDC_CHECK_CYCLE, m_bCheckCycle); 
	DDX_Text(pDX, IDC_EDIT_ALL_TIME, m_strEditAllTime); 
	DDX_Text(pDX, IDC_EDIT_CHANNEL, m_nEditChannel); 
	DDX_Text(pDX, IDC_EDIT_POINT_PER_SEC, m_nEditPointPerSec); 
	DDX_Text(pDX, IDC_EDIT_POSITION, m_nEditPosition); 
	DDX_Text(pDX, IDC_EDIT_WHOLE_LENGTH, m_nEditWholeLength); 
	DDX_Text(pDX, IDC_EDIT_ZOOMX, m_nEditZoomX); 
	DDX_Text(pDX, IDC_EDIT_ZOOMY, m_fEditZoomY); 
	DDX_Control(pDX, IDC_MMCONTROL_AUDIO, m_cMci); 
	DDX_Text(pDX, IDC_EDIT_BIT, m_nEditBit); 
	DDX_Text(pDX, IDC_EDIT_OFFSET, m_dwEditOffSet); 
	DDX_Check(pDX, IDC_CHECK_RESULT, m_bCheckResult); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAudioDlg, CDialog) 
	//{{AFX_MSG_MAP(CAudioDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_COMMAND(ID_FILE_OPEN_AUDIO_WAVE, OnFileOpenAudioWave) 
	ON_BN_CLICKED(IDC_CHECK_CYCLE, OnCheckCycle) 
	ON_EN_CHANGE(IDC_EDIT_ZOOMX, OnChangeEditZoomx) 
	ON_EN_CHANGE(IDC_EDIT_ZOOMY, OnChangeEditZoomy) 
	ON_WM_HSCROLL() 
	ON_EN_CHANGE(IDC_EDIT_OFFSET, OnChangeEditOffset) 
	ON_WM_TIMER() 
	ON_COMMAND(ID_FILE_SAVE_AUDIO_WAVE, OnFileSaveAudioWave) 
	ON_COMMAND(ID_PROCESS_FFT, OnProcessFft) 
	ON_COMMAND(ID_PROCESS_FFT_I, OnProcessFftI) 
	ON_COMMAND(ID_OPTION_CHANGE_FFT_POWER, OnOptionChangeFftPower) 
	ON_BN_CLICKED(IDC_CHECK_RESULT, OnCheckResult) 
	ON_COMMAND(ID_PROCESS_LOWPASS, OnProcessLowpass) 
	ON_COMMAND(ID_PROCESS_DCTIV, OnProcessDctiv) 
	ON_COMMAND(ID_PROCESS_IDCTIV, OnProcessIdctiv) 
	ON_COMMAND(ID_SOUND_IN, OnSoundIn) 
	ON_COMMAND(ID_SOUND_IN_STOP, OnSoundInStop) 
	ON_COMMAND(ID_PITCH_DETECTOR, OnPitchDetector) 
	ON_COMMAND(ID_PITCH_DETECTOR_VOICE, OnPitchDetectorVoice) 
	ON_COMMAND(ID_PROCESS_HighPASS, OnPROCESSHighPASS) 
	ON_COMMAND(ID_SOUND_EMENDATION, OnSoundEmendation) 
	ON_COMMAND(ID_SOUND_IN_SQUARE, OnSoundInSquare) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CAudioDlg message handlers 
 
BOOL CAudioDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	m_cView.GetClientRect(&m_ClientRect); 
 
	m_pcSoundData  = NULL; 
	m_pfSoundData  = NULL; 
	m_pfRecData    = NULL; 
 
	m_pdReFFT      = NULL; 
	m_pdImFFT      = NULL; 
	m_pfDCT        = NULL; 
	m_nPower       = 10; 
	m_bPlaying     = FALSE; 
	InitDraw(); 
	m_bTest        = FALSE; 
	m_bSoundStart  = FALSE; 
	m_shEmendation = 0;							//初始校正值为0 
	m_nTestCount   = 0; 
	m_cScrollBar.SetScrollRange(0,SCROLLLEN+1); 
	m_cScrollBar.EnableWindow(TRUE); 
	m_cScrollBar.SetScrollPos(0); 
    m_cCheckResult.EnableWindow(false); 
 
	return TRUE;   
} 
 
BOOL CAudioDlg::DestroyWindow()  
{ 
	if(m_pcSoundData  != NULL)	delete[] m_pcSoundData; 
	if(m_pfSoundData  != NULL)	delete[] m_pfSoundData; 
	if(m_pfRecData    != NULL)	delete[] m_pfRecData; 
	if(m_pdReFFT      != NULL)	delete[] m_pdReFFT; 
	if(m_pdImFFT      != NULL)	delete[] m_pdImFFT; 
	if(m_pfDCT        != NULL)	delete[] m_pfDCT; 
	return CDialog::DestroyWindow(); 
} 
 
void CAudioDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CAudioDlg::OnPaint()  
{ 
	 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		 
		CDialog::OnPaint(); 
		 
//		CRect tempRect; 
//		m_cView.GetClientRect(&tempRect); 
//		CDC *pDC = GetDC();		 
//		pDC->FillSolidRect(&tempRect, RGB(255,255,255)); 
 
		switch(m_nViewType) { 
		case VIEW_WAVE_8: 
			if(m_pfSoundData!=NULL) 
			{ 
				DrawWave8bit(&m_PenWave[0]); 
			}		   
			break; 
		case VIEW_WAVE_16: 
			if(m_pfSoundData!=NULL) 
			{ 
				DrawWave(&m_PenWave[0]); 
			}	 
			break; 
		case VIEW_FFT: 
			DrawWaveFFT_Energy(); 
			break; 
		case VIEW_DCT: 
			DrawWaveDCT(); 
			break; 
		case VIEW_SOUNDIN: 
			DrawSoundIn(&m_PenWave[0]); 
			break; 
		default: 
			break; 
		} 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CAudioDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
char CAudioDlg::ChangeFormat(char t) 
{/*波形数据形式  -1 to -128 and 127 to 0  
	char -128 to   -1 and  0  to 127 */	 
	if(t>=0)//总体上是关于128互补 
	{ 
		return 127-t; 
	}else//if(t<0) 
	{ 
		return -129-t; 
	} 
} 
 
char CAudioDlg::RestrictToChar(float t) 
{//限定数据范围(char:-128 to 127) 
	if(t<-128) 
	{ 
		return -128; 
	}else 
	{ 
		if(t>127) 
		{ 
			return 127; 
		}else 
		{ 
			return(char(t)); 
		} 
	} 
} 
 
short CAudioDlg::RestrictToShort(float t) 
{//限定数据范围(short:-32768 to 32767) 
	if(t<-32768) 
	{ 
		return -32768; 
	}else 
	{ 
		if(t>32767) 
		{ 
			return 32767; 
		}else 
		{ 
			return(short(t)); 
		} 
	} 
} 
 
void CAudioDlg::InitDraw() 
{ 
	CRect ViewRect; 
 
	m_cView.GetWindowRect(&ViewRect); 
	 
	m_nViewWidth = ViewRect.Width(); 
	m_nViewHeight = ViewRect.Height(); 
	 
	m_PenAxis.CreatePen(PS_SOLID,1,COLORAXIS); 
	m_PenWave[0].CreatePen(PS_SOLID,1,COLORSILENCE); 
	m_PenWave[1].CreatePen(PS_SOLID,1,COLORCONSONANT); 
	m_PenWave[2].CreatePen(PS_SOLID,1,COLORVOWEL); 
	m_PenWave[3].CreatePen(PS_SOLID,1,COLORVOWEL1); 
	m_PenWave[4].CreatePen(PS_SOLID,1,COLORC_V); 
	m_PenWave[5].CreatePen(PS_SOLID,1,COLORNOTTEST); 
} 
 
void CAudioDlg::OnFileOpenAudioWave()  
{ 
/*	typedef struct {  
	WORD  wFormatTag;  
	WORD  nChannels;  
	DWORD nSamplesPerSec;  
	DWORD nAvgBytesPerSec;  
	WORD  nBlockAlign;  
	WORD  wBitsPerSample;  
	WORD  cbSize;  
	} WAVEFORMATEX; 
	 
	m_WaveBase打开后可以给出 WAVEFORMATEX类型的m_WaveBase.m_WaveFormat结构, 
	他涉及数据采样类型的有用的信息; 
	m_WaveBase的成员DWORD m_dFileSize和DWORD m_dwDataSize给出数据的总长度; 
*/ 
	KillTimer(MY_TIMER_ARRIVE); 
	CFileDialog dlgOpenWave(TRUE);  
	dlgOpenWave.m_ofn.lpstrFilter = "声音文件(*.wav)\0*.wav\0\0"; 
 
	int nAmplitude = (1<<14); 
	float fAllTime; 
	DWORD i; 
	 
	if (dlgOpenWave.DoModal()==IDOK) 
    { 
		m_WaveBase.m_WaveFileName = dlgOpenWave.GetPathName(); 
		m_strOriAudioFile         = dlgOpenWave.GetPathName(); 
		m_WaveBase.m_bFileExist = 1; 
		if(m_WaveBase.Wave_OpenFile()) 
		{ 
//			if(m_WaveBase.m_WaveFormat.nChannels!=1) 
//			{   //单通道波形输入 
//				AfxMessageBox("目前只处理 ''单声道''波形信号 !"); 
//				m_WaveBase.Wave_CloseReadFile(); 
//				return; 
//			} 
//			if(m_WaveBase.m_WaveFormat.wBitsPerSample!=16) 
//			{   //16bit采样 
//				AfxMessageBox("目前只处理 16bit/sample 的波形信号 !"); 
//				m_WaveBase.Wave_CloseReadFile(); 
//				return; 
//			}				 
 
		}else 
		{ 
			AfxMessageBox("文件打开错误"); 
			m_WaveBase.Wave_CloseReadFile(); 
			return; 
		} 
		 
		m_dwSizeSound    = m_WaveBase.m_dwDataSize; 
		m_nSamplesPerSec = m_WaveBase.m_WaveFormat.nSamplesPerSec; 
		m_wBitsPerSample = m_WaveBase.m_WaveFormat.wBitsPerSample; 
		 
		if(m_pcSoundData!=NULL) 
		{ 
			delete[] m_pcSoundData; 
		} 
		m_pcSoundData = new char[m_dwSizeSound]; 
		 
		m_WaveBase.Wave_ReadWaveData(m_pcSoundData, m_dwSizeSound); 
		m_WaveBase.Wave_CloseReadFile(); 
		 
		m_nEditChannel = m_WaveBase.m_WaveFormat.nChannels; 
		m_nEditBit = m_WaveBase.m_WaveFormat.wBitsPerSample; 
		m_nEditPointPerSec = m_nSamplesPerSec; 
		m_nEditWholeLength = (int)m_dwSizeSound/(m_nEditBit/8); 
 
		fAllTime = (float)m_nEditWholeLength/(float)m_nEditPointPerSec; 
		m_strEditAllTime.Format("%8.4f", fAllTime); 
		UpdateData(false); 
		 
		if(m_pfSoundData!=NULL) 
		{ 
			delete[] m_pfSoundData; 
		} 
		if(m_pfRecData!=NULL) 
		{ 
			delete[] m_pfRecData; 
		} 
		m_pfSoundData = new float[m_dwSizeSound/(m_nEditBit/8)]; 
		m_pfRecData   = new float[m_dwSizeSound/(m_nEditBit/8)]; 
		if(m_nEditBit==16) 
		{ 
			m_nViewType = VIEW_WAVE_16; 
			short *pshSoundData = new short[m_dwSizeSound/(m_nEditBit/8)]; 
			memcpy(pshSoundData, m_pcSoundData, m_dwSizeSound); 
			for(i=0; iCreateRectRgn(0,0,m_nViewWidth,m_nViewHeight); 
	pDC->SelectClipRgn(pRect); 
	 
	pDC->SetMapMode(MM_ANISOTROPIC); 
	pDC->SetWindowExt(m_nViewWidth,32767); 
	pDC->SetViewportExt(m_ClientRect.right,-m_ClientRect.bottom); 
	pDC->SetViewportOrg(0,m_nViewHeight/2); 
	nEndPoint = min(m_nViewWidth,int((m_dwSizeSound/(m_nEditBit/8)-m_dwEditOffSet)/m_nEditZoomX)); 
	 
	pOldPen=pDC->SelectObject(&m_PenAxis); 
	 
	pDC->MoveTo(0,0); 
	pDC->LineTo(m_nViewWidth,0); 
	 
	pDC->SelectObject(m_PenWave[1]); 
	pDC->MoveTo(0,int(m_pfSoundData[0]/m_fEditZoomY)); 
	for(i=0; iLineTo(i, int(m_pfSoundData[i*m_nEditZoomX+m_dwEditOffSet]/m_fEditZoomY)); 
	} 
	 
	pDC->SelectObject(pPenWaveColor); 
	pDC->MoveTo(0,int(m_pfRecData[0]/m_fEditZoomY)); 
	for(i=0; iLineTo(i, int(m_pfRecData[i*m_nEditZoomX+m_dwEditOffSet]/m_fEditZoomY)); 
	} 
	 
	pDC->SelectObject(pOldPen); 
	ReleaseDC(pDC); 
	delete pRect; 
 
} 
 
void CAudioDlg::OnChangeEditZoomx()  
{ 
	UpdateData(TRUE); 
	BrushRect();	 
} 
 
void CAudioDlg::OnChangeEditZoomy()  
{ 
	UpdateData(TRUE); 
	BrushRect(); 
} 
 
void CAudioDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)  
{ 
	if(m_bPlaying)return; 
	if(m_pfSoundData==NULL) return; 
	BOOL bChang = FALSE; 
	if(&m_cScrollBar == pScrollBar) 
	{ 
		switch(nSBCode) 
		{ 
		case SB_LEFT: 
			m_dwOffSet = 0; 
			bChang = TRUE; 
			break; 
		case SB_RIGHT: 
			bChang = TRUE; 
			m_dwOffSet = m_dwSizeSound/(m_nEditBit/8)-1; 
			break; 
		case SB_LINELEFT: 
			if(m_dwOffSet) 
			{ 
				m_dwOffSet -= LINESIZE; 
				bChang = TRUE; 
			} 
			break; 
		case SB_LINERIGHT: 
			if(m_dwOffSet<(m_dwSizeSound/(m_nEditBit/8))) 
			{ 
				m_dwOffSet +=LINESIZE; 
				bChang = TRUE; 
			} 
			break; 
		case SB_PAGELEFT: 
			bChang=TRUE; 
			if(m_dwOffSet>DWORD(m_nViewWidth)) m_dwOffSet -= m_nViewWidth; 
			else m_dwOffSet = 0; 
			break; 
		case SB_PAGERIGHT: 
			bChang=TRUE; 
			if(m_dwOffSet+m_nViewWidth>=(m_dwSizeSound/(m_nEditBit/8)))  
				m_dwOffSet = m_dwSizeSound/(m_nEditBit/8); 
			else m_dwOffSet += m_nViewWidth; 
			break; 
		case SB_THUMBPOSITION: 
		case SB_THUMBTRACK: 
			bChang=TRUE; 
			m_dwOffSet = int(nPos*1.0*m_dwSizeSound/(m_nEditBit/8)/SCROLLLEN); 
			break; 
		} 
		if(bChang) 
		{ 
			m_cScrollBar.SetScrollPos(int(m_dwOffSet*1.0*SCROLLLEN*(m_nEditBit/8)/m_dwSizeSound),TRUE); 
			m_dwEditOffSet = m_dwOffSet; 
			UpdateData(FALSE); 
			BrushRect(); 
		} 
	} 
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar); 
} 
 
void CAudioDlg::OnChangeEditOffset()  
{ 
	UpdateData(TRUE); 
	if(m_dwEditOffSet>(m_dwSizeSound/(m_nEditBit/8))) 
	{ 
		AfxMessageBox("数值超过了音频数据上限"); 
		return; 
	} 
	m_dwOffSet = m_dwEditOffSet; 
	CRect *pRect = new CRect; 
	m_cScrollBar.SetScrollPos(int(m_dwOffSet*1.0*SCROLLLEN*(m_nEditBit/8)/m_dwSizeSound),TRUE); 
	m_dwEditOffSet = m_dwOffSet; 
	UpdateData(FALSE); 
	m_cView.GetWindowRect(pRect); 
	ScreenToClient(pRect); 
	InvalidateRect(pRect); 
	OnPaint(); 
	delete pRect; 
}	 
 
void CAudioDlg::BrushRect() 
{ 
	CRect *pRect = new CRect; 
	m_cView.GetWindowRect(pRect); 
	ScreenToClient(pRect); 
	InvalidateRect(pRect); 
	OnPaint(); 
	delete pRect; 
} 
 
void CAudioDlg::OnTimer(UINT nIDEvent)  
{ 
	CRect *pRect = new CRect; 
	switch(nIDEvent) 
	{ 
	case MY_TIMER_ARRIVE:		 
		m_dwOffSet=ConvertTimeToOffset(m_cMci.GetPosition()); 
		m_cScrollBar.SetScrollPos(int(m_dwOffSet*1.0*SCROLLLEN*(m_nEditBit/8)/m_dwSizeSound),TRUE); 
		m_dwEditOffSet = m_dwOffSet; 
		UpdateData(FALSE); 
		m_cView.GetWindowRect(pRect); 
		ScreenToClient(pRect); 
		InvalidateRect(pRect); 
		 
		OnPaint(); 
		delete pRect; 
		break; 
	case MY_TIMER_SOUND: 
		m_cView.GetWindowRect(pRect); 
		ScreenToClient(pRect); 
		InvalidateRect(pRect); 
		OnPaint(); 
		delete pRect; 
		break; 
	} 
	CDialog::OnTimer(nIDEvent); 
} 
 
DWORD CAudioDlg::ConvertTimeToOffset(long time) 
{ 
	DWORD dwM; 
	dwM = DWORD(time/1000.0*m_nSamplesPerSec); 
	return dwM;	 
} 
 
void CAudioDlg::DrawWave8bit(CPen *pPenWaveColor) 
{ 
	CDC* pDC=GetDC(); 
    CRgn rect; 
	rect.CreateRectRgn(0,0,m_nViewWidth,m_nViewHeight); 
	pDC->SelectClipRgn(&rect); 
	 
	pDC->SetMapMode(MM_ANISOTROPIC); 
	pDC->SetViewportOrg(0,m_nViewHeight/2); 
	 
	CPen* pOldPen=pDC->SelectObject(&m_PenAxis); 
	 
	pDC->MoveTo(0,0); 
	pDC->LineTo(m_nViewWidth,0); 
	 
	pDC->SelectObject(pPenWaveColor); 
	pDC->MoveTo(0,int(m_pfSoundData[0]/m_fEditZoomY)); 
	int x = 0; 
	int i; 
	int nEndPoint = min(m_nViewWidth,int((m_dwSizeSound/(m_nEditBit/8)-m_dwEditOffSet)/m_nEditZoomX)); 
	for(i=0; iLineTo(i, int(m_pfSoundData[i*m_nEditZoomX+m_dwEditOffSet]/m_fEditZoomY)); 
	} 
	pDC->SelectObject(pOldPen); 
	ReleaseDC(pDC); 
} 
 
void CAudioDlg::OnProcessFft()  
{ 
	if(m_pfSoundData==NULL) 
	{ 
		AfxMessageBox("没有音频数据"); 
		return; 
	} 
 
	int nSamples = 1<WaveSignalFFT(m_pfSoundData, dwLenSignal, m_nPower, m_pdReFFT, m_pdImFFT); 
	m_nViewType = VIEW_FFT; 
	BrushRect(); 
	delete pWaveProcess; 
} 
 
void CAudioDlg::DrawWaveFFT_Energy() 
{ 
	if(m_pdReFFT==NULL) return; 
	if(m_pdImFFT==NULL) return; 
	 
	CDC* pDC=GetDC(); 
    CRgn rect; 
	rect.CreateRectRgn(0,0,m_nViewWidth,m_nViewHeight); 
	pDC->SelectClipRgn(&rect); 
	 
	pDC->SetMapMode(MM_ANISOTROPIC); 
	pDC->SetWindowExt(m_nViewWidth,32767); 
	pDC->SetViewportExt(m_ClientRect.right,-m_ClientRect.bottom); 
	pDC->SetViewportOrg(0,m_nViewHeight-10); 
	 
	CPen* pOldPen=pDC->SelectObject(&m_PenAxis); 
	 
	pDC->MoveTo(0,0); 
	pDC->LineTo(m_nViewWidth,0); 
	 
	pDC->MoveTo(0,int(m_pfSoundData[0]/m_fEditZoomY)); 
	int x = 0; 
	 
	int i; 
	int nEndPoint = min(m_nViewWidth,int((m_dwSizeSound/(m_nEditBit/8)-m_dwEditOffSet)/m_nEditZoomX)); 
	int nSamples = 1<SelectObject(&m_PenWave[((i+m_dwEditOffSet)/nSamples)%6]); 
		pDC->LineTo(i, int(sqrt(m_pdReFFT[i+m_dwEditOffSet]*m_pdReFFT[i+m_dwEditOffSet]+m_pdImFFT[i+m_dwEditOffSet]*m_pdImFFT[i+m_dwEditOffSet])/m_fEditZoomY)); 
	} 
	pDC->SelectObject(pOldPen); 
	ReleaseDC(pDC); 
} 
 
void CAudioDlg::DrawWaveDCT() 
{ 
	if(m_pfDCT==NULL) return; 
	 
	CDC* pDC=GetDC(); 
    CRgn rect; 
	rect.CreateRectRgn(0,0,m_nViewWidth,m_nViewHeight); 
	pDC->SelectClipRgn(&rect); 
	 
	pDC->SetMapMode(MM_ANISOTROPIC); 
	pDC->SetWindowExt(m_nViewWidth,32767); 
	pDC->SetViewportExt(m_ClientRect.right,-m_ClientRect.bottom); 
	pDC->SetViewportOrg(0,m_nViewHeight-10); 
	 
	CPen* pOldPen=pDC->SelectObject(&m_PenAxis); 
	 
	pDC->MoveTo(0,0); 
	pDC->LineTo(m_nViewWidth,0); 
	 
	pDC->MoveTo(0,int(m_pfSoundData[0]/m_fEditZoomY)); 
	int x = 0; 
	 
	int i; 
	int nEndPoint = min(m_nViewWidth,int((m_dwSizeSound/(m_nEditBit/8)-m_dwEditOffSet)/m_nEditZoomX)); 
	int nSamples = 1<SelectObject(&m_PenWave[((i+m_dwEditOffSet)/nSamples)%6]); 
		pDC->LineTo(i, abs(int(m_pfDCT[i+m_dwEditOffSet]/m_fEditZoomY+0.5))); 
	} 
	pDC->SelectObject(pOldPen); 
	ReleaseDC(pDC); 
} 
 
void CAudioDlg::OnProcessFftI()  
{ 
	if(m_pdReFFT==NULL) 
	{ 
		AfxMessageBox("没有进行FFT"); 
		return; 
	} 
	if(m_pdImFFT==NULL) 
	{ 
		AfxMessageBox("没有进行FFT"); 
		return; 
	} 
	 
	int nSamples = 1<WaveSignalFFT_I(m_pfSoundData, dwLenSignal, m_nPower, m_pdReFFT, m_pdImFFT); 
	m_nViewType = VIEW_WAVE_16; 
	m_strResAudioFile = "d:/DCTIV.wav"; 
	SaveAudioWaveFile(); 
	m_cCheckResult.EnableWindow(TRUE);	 
	BrushRect(); 
	InitMci(); 
	delete pWaveProcess; 
} 
 
void CAudioDlg::OnOptionChangeFftPower()  
{ 
	CDialogFFTPara DialogFFTPara; 
	DialogFFTPara.m_nEditPower = m_nPower; 
	if(DialogFFTPara.DoModal()==IDOK) 
	{ 
		m_nPower = DialogFFTPara.m_nEditPower; 
	} 
} 
 
void CAudioDlg::OnCheckResult()  
{ 
	UpdateData(TRUE); 
	InitMci(); 
} 
 
 
void CAudioDlg::OnProcessLowpass()  
{ 
	int nStep = 10;	 
	CWaveProcess *pWaveProcess = new CWaveProcess; 
	memcpy(m_pfSoundData, m_pfRecData, m_dwSizeSound/(m_nEditBit/8)*sizeof(float)); 
	pWaveProcess->LowPass(m_pfSoundData, m_dwSizeSound/(m_nEditBit/8), nStep); 
	m_strResAudioFile = "d:/LowPass.wav"; 
	SaveAudioWaveFile(); 
	m_cCheckResult.EnableWindow(TRUE);	 
	BrushRect(); 
	InitMci(); 
	delete pWaveProcess; 
} 
 
void CAudioDlg::OnPROCESSHighPASS()  
{ 
	int nStep = 2;	 
	int nTh = 5; 
	float fRate = 2.0f; 
	CWaveProcess *pWaveProcess = new CWaveProcess; 
	memcpy(m_pfSoundData, m_pfRecData, m_dwSizeSound/(m_nEditBit/8)*sizeof(float)); 
	pWaveProcess->HighPass(m_pfSoundData, m_dwSizeSound/(m_nEditBit/8), nStep, nTh, fRate); 
	m_strResAudioFile = "d:/HighPass.wav"; 
	SaveAudioWaveFile(); 
	m_cCheckResult.EnableWindow(TRUE);	 
	BrushRect(); 
	InitMci(); 
	delete pWaveProcess; 
} 
 
void CAudioDlg::OnProcessDctiv()  
{ 
	if(m_pfSoundData==NULL) 
	{ 
		AfxMessageBox("没有音频数据"); 
		return; 
	} 
	 
	int nSamples = 1<WaveSignalDCTIV(m_pfSoundData, m_pfDCT, dwLenSignal, m_nPower); 
	m_nViewType = VIEW_DCT; 
	BrushRect(); 
	delete pWaveProcess; 
} 
 
void CAudioDlg::OnProcessIdctiv()  
{ 
	if(m_pfDCT==NULL) 
	{ 
		AfxMessageBox("没有频率数据"); 
		return; 
	} 
	 
	int nSamples = 1<WaveSignalIDCTIV(m_pfSoundData, m_pfDCT, dwLenSignal, m_nPower); 
	m_nViewType = VIEW_WAVE_16; 
	m_strResAudioFile = "d:/DCTIV.wav"; 
	SaveAudioWaveFile(); 
	m_cCheckResult.EnableWindow(TRUE);	 
	BrushRect(); 
	InitMci(); 
	delete pWaveProcess; 
} 
 
 
void CAudioDlg::DrawSoundIn(CPen *pPenWaveColor) 
{ 
	CDC* pDC=GetDC(); 
    CRgn rect; 
	int x = 0; 
	int i; 
	rect.CreateRectRgn(0,0,m_nViewWidth,m_nViewHeight); 
	pDC->SelectClipRgn(&rect); 
	 
	pDC->SetMapMode(MM_ANISOTROPIC); 
	pDC->SetWindowExt(m_nViewWidth,32767); 
	pDC->SetViewportExt(m_ClientRect.right,-m_ClientRect.bottom); 
	pDC->SetViewportOrg(0,m_nViewHeight/2); 
	 
	CPen* pOldPen=pDC->SelectObject(&m_PenAxis); 
	 
	pDC->MoveTo(0,0); 
	pDC->LineTo(m_nViewWidth,0); 
	 
	pDC->SelectObject(pPenWaveColor); 
	pDC->MoveTo(0,int(Sound.InputBuffer[0]-m_shEmendation)); 
 
	for(i=0; iLineTo(i, int(Sound.InputBuffer[i]-m_shEmendation)); 
	} 
 
	pDC->SelectObject(pOldPen); 
	ReleaseDC(pDC); 
} 
 
void CAudioDlg::OnSoundIn()  
{ 
	if(m_bSoundStart) 
	{ 
		OnSoundInStop(); 
	} 
	int nSum = 0; 
	int nMaxSamples = 1024*3;  
	m_nEditChannel = 1; 
	m_nEditPointPerSec = 44000; 
	m_nEditBit = 16; 
	m_nSamplesPerSec = m_nEditPointPerSec; 
 
	Sound.OpenMic(m_nEditChannel, m_nSamplesPerSec, m_nEditBit, nMaxSamples); 
	SetTimer(MY_TIMER_ARRIVE,MY_TIMER_LENGTH,NULL); 
	m_nViewType = VIEW_SOUNDIN;	 
	UpdateData(FALSE); 
	m_bSoundStart = TRUE; 
} 
 
void CAudioDlg::OnSoundInSquare()  
{ 
	if(m_bSoundStart) 
	{ 
		OnSoundInStop(); 
	} 
	int nSum = 0; 
	int nMaxSamples = 1024*2; 
	m_nEditChannel = 1; 
	m_nEditPointPerSec = 22000; 
	m_nEditBit = 16; 
	m_nSamplesPerSec = m_nEditPointPerSec; 
 
	Sound.OpenMic(m_nEditChannel, m_nSamplesPerSec, m_nEditBit, nMaxSamples); 
	SetTimer(MY_TIMER_ARRIVE,MY_TIMER_LENGTH,NULL); 
	m_nViewType = VIEW_SOUNDIN;	 
	UpdateData(FALSE); 
	m_bSoundStart = TRUE; 
} 
 
void CAudioDlg::OnSoundInStop()  
{ 
	Sound.CloseMic(); 
	Sound.CloseOutput(); 
	KillTimer(MY_TIMER_ARRIVE); 
	m_nViewType = NULL; 
} 
 
void CAudioDlg::OnPitchDetector()  
{ 
 
} 
 
 
void CAudioDlg::OnPitchDetectorVoice()  
{ 
 
} 
 
void CAudioDlg::DrawSimulate(float *pfSimulate, CPen *pPenWaveColor) 
{ 
	CDC* pDC=GetDC(); 
    CRgn rect; 
	int x = 0; 
	int i; 
	rect.CreateRectRgn(0,0,m_nViewWidth,m_nViewHeight); 
	pDC->SelectClipRgn(&rect); 
	 
	pDC->SetMapMode(MM_ANISOTROPIC); 
	pDC->SetWindowExt(m_nViewWidth,32767); 
	pDC->SetViewportExt(m_ClientRect.right,-m_ClientRect.bottom); 
	pDC->SetViewportOrg(0,m_nViewHeight/2); 
	int nEndPoint = min(m_nViewWidth,int((m_dwSizeSound/(m_nEditBit/8)-m_dwEditOffSet)/m_nEditZoomX)); 
	 
	CPen* pOldPen=pDC->SelectObject(&m_PenAxis); 
	 
	pDC->MoveTo(0,0); 
	pDC->LineTo(m_nViewWidth,0); 
	 
	pDC->SelectObject(m_PenWave[1]); 
	pDC->MoveTo(0,int(pfSimulate[0]/m_fEditZoomY)); 
	for(i=0; iLineTo(i, int(pfSimulate[i]/m_fEditZoomY)); 
	} 
	 
	pDC->SelectObject(pPenWaveColor); 
	ReleaseDC(pDC); 
} 
 
 
 
void CAudioDlg::OnSoundEmendation()  
{ 
	int i; 
	int nSum = 0; 
	short *pshSoundata = new short[Sound.m_NbMaxSamples];	 
	memcpy(pshSoundata, Sound.InputBuffer, Sound.m_NbMaxSamples*sizeof(short)); 
	for(i=0; i