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; i CreateRectRgn(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; i LineTo(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; i LineTo(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; i LineTo(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; i LineTo(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; i LineTo(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