處理簡單的音頻輸入資料
SoundIn類見我的另一篇部落格 http://blog.csdn.net/zgl7903/article/details/5669770
#pragma once//Microphone_Measure.h#include "SoundIn.h"class CMicrophone_Measure{public: CMicrophone_Measure(); virtual ~CMicrophone_Measure();public: BOOL StartMeasure(); void StopMeansure();public: typedef struct _WAVEMEASUMERESULT_TAG { BOOL bValid; DWORD dwPtSize; //點數 double fWave_Frame_Avg; //平均值 double fWave_Frame_RMS; //有效值 double fWave_Frame_Max; //最大值 double fWave_Frame_Min; //最小值 double fWave_Frame_AbsMax; //絕對最大值 double fWave_Frame_AbsMin; //絕對最小值 }WAVEMEASUMERESULT; WAVEMEASUMERESULT m_WaveMeasureResult; BOOL IsOpened() { return bMicrophone_Opened; }protected: BOOL bMicrophone_Opened; CSoundIn m_SoundIn; static BOOL WaveInProc(LPVOID pUser, SHORT *pData, DWORD dwSize);};
#include "stdafx.h"#include "Microphone_Measure.h"CMicrophone_Measure::CMicrophone_Measure(){ bMicrophone_Opened = FALSE; //置關閉狀態 memset(&m_WaveMeasureResult, 0, sizeof(m_WaveMeasureResult)); //初始化結構體}CMicrophone_Measure::~CMicrophone_Measure(){ StopMeansure();//停止測量}BOOL CMicrophone_Measure::StartMeasure(){ if(!bMicrophone_Opened)//非開啟狀態 { if( m_SoundIn.OpenMic(this, WaveInProc) == MMSYSERR_NOERROR) bMicrophone_Opened = TRUE; } return bMicrophone_Opened;}void CMicrophone_Measure::StopMeansure(){ m_SoundIn.CloseMic(); bMicrophone_Opened = FALSE;}BOOL CMicrophone_Measure::WaveInProc(LPVOID pUser, SHORT *pData, DWORD dwSize){ CMicrophone_Measure *pThis = (CMicrophone_Measure *)pUser; WAVEMEASUMERESULT tmpResult={0}; double dbVal = pData[0]; //第一個點 tmpResult.dwPtSize = dwSize; //點數 tmpResult.fWave_Frame_Avg = dbVal; //平均值 tmpResult.fWave_Frame_RMS = pow(dbVal, 2); //有效值 tmpResult.fWave_Frame_Max = dbVal; //最大值 tmpResult.fWave_Frame_Min = dbVal; //最小值 tmpResult.fWave_Frame_AbsMax = fabs(dbVal); //絕對最大值 tmpResult.fWave_Frame_AbsMin = fabs(dbVal); //絕對最小值 for(DWORD i=1; i<dwSize; i++) { dbVal = pData[i];//單聲道 tmpResult.fWave_Frame_Avg += dbVal; //平均值 tmpResult.fWave_Frame_RMS += pow(dbVal, 2); //有效值 tmpResult.fWave_Frame_Max = max(dbVal, tmpResult.fWave_Frame_Max); //最大值 tmpResult.fWave_Frame_Min = min(dbVal, tmpResult.fWave_Frame_Min); //最小值 tmpResult.fWave_Frame_AbsMax = max(fabs(dbVal), tmpResult.fWave_Frame_AbsMax); //絕對最大值 tmpResult.fWave_Frame_AbsMin = min(fabs(dbVal), tmpResult.fWave_Frame_AbsMin); //絕對最小值 } tmpResult.fWave_Frame_Avg /= dwSize; //平均值 tmpResult.fWave_Frame_RMS = sqrt(tmpResult.fWave_Frame_RMS / dwSize);//有效值 tmpResult.bValid = TRUE; pThis->m_WaveMeasureResult = tmpResult; return TRUE;}
//簡單的應用舉例
#pragma once#include "Microphone_Measure.h"// CTestDlg 對話方塊class CTestDlg : public CDialog{public: CMicrophone_Measure m_Microphone_Measure; afx_msg void OnTimer(UINT_PTR nIDEvent); CProgressCtrl m_ProgressCtrl;
BOOL CTestDlg::OnInitDialog(){ CDialog::OnInitDialog(); // 設定此對話方塊的表徵圖。當應用程式主視窗不是對話方塊時,架構將自動 // 執行此操作 SetIcon(m_hIcon, TRUE);// 設定大表徵圖 SetIcon(m_hIcon, FALSE);// 設定小表徵圖 // TODO: 在此添加額外的初始化代碼 if(m_Microphone_Measure.StartMeasure()) SetTimer(1, 100, NULL); return TRUE; // 除非將焦點設定到控制項,否則返回 TRUE}void CTestDlg::OnTimer(UINT_PTR nIDEvent){ // TODO: 在此添加訊息處理常式代碼和/或調用預設值 if(m_Microphone_Measure.m_WaveMeasureResult.bValid) { CString itemStr; itemStr.Format( _T("點數 %ld\r\n") _T("平均值 %g\r\n") _T("有效值 %g\r\n") _T("最大值 %g\r\n") _T("最小值 %g\r\n") _T("絕對最大值 %g\r\n") _T("絕對最小值 %g\r\n"), m_Microphone_Measure.m_WaveMeasureResult.dwPtSize, //點數 m_Microphone_Measure.m_WaveMeasureResult.fWave_Frame_Avg, //平均值 m_Microphone_Measure.m_WaveMeasureResult.fWave_Frame_RMS, //有效值 m_Microphone_Measure.m_WaveMeasureResult.fWave_Frame_Max, //最大值 m_Microphone_Measure.m_WaveMeasureResult.fWave_Frame_Min, //最小值 m_Microphone_Measure.m_WaveMeasureResult.fWave_Frame_AbsMax, //絕對最大值 m_Microphone_Measure.m_WaveMeasureResult.fWave_Frame_AbsMin, //絕對最小值 0); SetDlgItemText(IDC_EDIT1, itemStr); } CDialog::OnTimer(nIDEvent);}