623实验报告.docx

上传人:b****1 文档编号:1428582 上传时间:2023-05-01 格式:DOCX 页数:43 大小:1.02MB
下载 相关 举报
623实验报告.docx_第1页
第1页 / 共43页
623实验报告.docx_第2页
第2页 / 共43页
623实验报告.docx_第3页
第3页 / 共43页
623实验报告.docx_第4页
第4页 / 共43页
623实验报告.docx_第5页
第5页 / 共43页
623实验报告.docx_第6页
第6页 / 共43页
623实验报告.docx_第7页
第7页 / 共43页
623实验报告.docx_第8页
第8页 / 共43页
623实验报告.docx_第9页
第9页 / 共43页
623实验报告.docx_第10页
第10页 / 共43页
623实验报告.docx_第11页
第11页 / 共43页
623实验报告.docx_第12页
第12页 / 共43页
623实验报告.docx_第13页
第13页 / 共43页
623实验报告.docx_第14页
第14页 / 共43页
623实验报告.docx_第15页
第15页 / 共43页
623实验报告.docx_第16页
第16页 / 共43页
623实验报告.docx_第17页
第17页 / 共43页
623实验报告.docx_第18页
第18页 / 共43页
623实验报告.docx_第19页
第19页 / 共43页
623实验报告.docx_第20页
第20页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

623实验报告.docx

《623实验报告.docx》由会员分享,可在线阅读,更多相关《623实验报告.docx(43页珍藏版)》请在冰点文库上搜索。

623实验报告.docx

623实验报告

实验报告

 

课程名称应用程序设计基础

实验项目实验一、实验二

实验仪器计算机

 

系别仪器科学与光电工程学院

专业测控技术与仪器

班级/学号623

学生姓名Vicky

成绩

指导教师潘志康

实验1

1、实验名称

应用面向对象技术完成AD数据采集

2、实验目的

掌握采用面向对象技术开发应用程序

三、实验内容

1、创建交互界面

2、AD数据采集

3、显示采集结果

四、实验要求

编写一个利用声卡采集声音波形数据的应用程序,实现类似虚拟示波器的功能。

程序应能够设置采样频率、采样位数、采样通道数;具有开始采样、中止采样控制;能够显示声音波形、波形幅值。

五、编程思路

本实验是利用声卡组建数据采集系统。

声卡的采样频率有4种选择,即8000Hz、11025Hz、22050Hz、44100Hz,采样频率不同,采到波形的质量也不同,应该根据具体情况而采用合适的频率。

对于声音的采集,需要用到操作系统底层的API函数。

微软提供的有关声卡波形的API函数有下面几个:

MMRESULTwaveInOpen(//打开一个声音波形设备用于输入,返回错误代码

LPHWAVEINphwi,//打开设备的句柄地址

UINTuDeviceID,//要打开设备的标识,设为WAVE_MAPPER自动选择

LPWAVEFORMATEXpwfx,//指向一个WAVEFORMATEX结构体的指针

DWORDdwCallback,//事件处理回调函数入口,当输入缓冲区满时,调用该函数

DWORDdwCallbackInstance,//用户进程传递给回调函数的数据

DWORDfdwOpen//打开方式标志

);

RESULTwaveInPrepareHeader(//为声音波形输入准备一个缓冲区

HWAVEINhwi,//波形输入设备句柄

LPWAVEHDRpwh,//标识缓冲区的WAVEHDR结构体入口地址

UINTcbwh//WAVEHDR结构体的大小,以字节为单位

);

MMRESULTwaveInAddBuffer(//向输入设备指定缓冲区,当缓冲区满时,通知用户程序

HWAVEINhwi,//波形输入设备句柄

LPWAVEHDRpwh,//标识缓冲区的WAVEHDR结构体入口地址

UINTcbwh//WAVEHDR结构体的大小,以字节为单位

);

MMRESULTwaveInStart(//开始指定设备采集

HWAVEINhwi,//波形输入设备句柄

);

MMRESULTwaveInReset(//停止指定设备输入,重置缓冲区

HWAVEINhwi//波形输入设备句柄

);

MMRESULTwaveInUnprepareHeader(//取消所准备的缓冲区

HWAVEINhwi,//波形输入设备句柄

LPWAVEHDRpwh,//标识缓冲区的WAVEHDR结构体入口地址

UINTcbwh//WAVEHDR结构体的大小,以字节为单位

);

MMRESULTwaveInClose(//关闭指定输入设备

HWAVEINhwi//波形输入设备句柄

);

其中WAVEHDR结构体定义了声形波形数据的格式,

ormatTag;//波形格式标签频率数=列块大小*采样频率列;

来扩充此结构体,以指定特殊格式(如压缩)

typedefstruct{

WORDwFormatTag;//波形格式标签

WORDnChannels;//声道数

DWORDnSamplesPerSec;//采样频率

DWORDnAvgBytesPerSec;//每秒字节数=列块大小*采样频率

WORDnBlockAlign;//列块大小=声道数*量化位数/8

WORDwBitsPerSample//量化位数

WORDcbSize;//附加结构字节数,用来扩充此结构体,以指定特殊格式(如缩)

}WAVEFORMATEX;

声卡采集输入的过程是:

①打开设备->②准备缓冲区->③指定缓冲区->④开始输入->⑤等待系统填充缓冲区->⑥读取数据,重复⑤⑥直到输入结束,⑦停止输入->⑧取消缓冲区->⑨关闭设备,输出的过程与之相似。

系统在缓冲区满/空时执行用户指定的回调函数,因此构造一个波形输入/输出事件,在回调函数中触发此事件,而在缓冲区读/写函数(用户工作线程)中等待此事件。

此外,用户程序必须处理各种可能的错误。

由于API函数在使用时操作繁琐、不易理解。

为方便引用,本次实验给出一个CSoundIn类,它将上述API函数进行封装,提供如下接口函数:

MMRESULTOpenMic(intchannel,intsamples,intbitSamples);//打开输入设备

voidStartMic();//开始录音

voidStopMic();//停止录音

voidCloseMic();//关闭输入设备

voidGetHwnd(HWNDhwnd);//获取主窗口句柄,用于关联示波器显示

声音数据采集的过程就是

打开输入设备

开始录音

停止录音

关闭输入设备。

本次实验除了提供CSoundIn类外,为了方便程序显示波形,还提供了一个示波器类CScope,它有以下接口函数:

voidSetTitle(CStringstrTitle);//设置示波器的标题

voidSetDimT(doublenewDimT);//设置横坐标显示间隔

voidSetDimy(doublenewDimY);//设置纵坐标显示间隔

voidUpdateCurve();//更新曲线

voidAddValue(doubledTime,doubledValue);//加载示波器要显示的输入数据

六、编程步骤

1、创建一个对话框程序,在对话框类定义中声明一个CSoundIn对象、一个CScope对象以及一个函数:

scope(intnTime,intdata)。

加入必要的控件,以使程序能设置采样条件,并能控制采样。

2、在初始化对话框时,即在OnInitDialog函数中,设置示波器的横纵坐标间隔;调用CSoundIn对象的GetHwnd函数,即m_soundIn.GetHwnd(this->m_hWnd);

3、CScope对象用来显示声音波形,实现的方法是先在对话框资源上放置一个静态文本框,将ID值改为IDC_SCOPE(可自定),在对话框类的DoDataExchange函数中将CScope对象与该静态文本资源相关联,即在//}}AFX_DATA_MAP之前加入一句话

DDX_Control(pDX,IDC_SCOPE,m_scope);

1)按钮控件:

voidCVirtualOscilloscopeDlg:

:

OnButton1()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

m_soundIn.OpenMic(m_channel,m_samples,m_bitSamples);

}

voidCVirtualOscilloscopeDlg:

:

OnButton3()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

m_soundIn.StartMic();

}

voidCVirtualOscilloscopeDlg:

:

OnButton4()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

m_soundIn.StopMic();

}

 

2)采样频率

voidCVirtualOscilloscopeDlg:

:

OnRadio1()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

m_samples=8000;

}

voidCVirtualOscilloscopeDlg:

:

OnRadio3()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

m_samples=11025;

}

voidCVirtualOscilloscopeDlg:

:

OnRadio2()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

m_samples=22050;

}

voidCVirtualOscilloscopeDlg:

:

OnRadio4()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

m_samples=44100;

}

3)采样位数

voidCVirtualOscilloscopeDlg:

:

OnRadio5()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

m_bitSamples=8;

}

voidCVirtualOscilloscopeDlg:

:

OnRadio6()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

m_bitSamples=16;

}

4)采样通道数

voidCVirtualOscilloscopeDlg:

:

OnRadio7()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

m_channel=1;

}

voidCVirtualOscilloscopeDlg:

:

OnRadio8()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

m_channel=2;

}

5)幅值

步骤:

首先在VirtualOscilloscopeDlg加入m_fz成员变量:

在对话框的CPP文件中,加入如下代码:

voidCVirtualOscilloscopeDlg:

:

scope(intnTime,intdata)

{

m_fz.Format("%d",data);

GetDlgItem(IDC_EDIT1)->SetWindowText(m_fz);

m_scope.AddValue(nTime,(-(double)data+128)/20);

//m_scope.AddValue(nTime,(data+128)/20);

num++;

if(num==2048)

{

m_scope.UpdateCurve();

num=0;

}

}

4、对话框类的scope函数实现代码,该函数在CSoundIn中被调用

voidCVirtualOscilloscopeDlg:

:

scope(intnTime,intdata)

{

m_scope.AddValue(nTime,(-(double)data+128)/20);//将128定为中线

num++;

if(num==2048)//在CSoundIn类中缓冲区定义为2048

{

m_scope.UpdateCurve();

num=0;

}

}

7、实验结果

8、实验源程序

#include"stdafx.h"

#include"virtualOscilloscope.h"

#include"virtualOscilloscopeDlg.h"

#ifdef_DEBUG

#definenewDEBUG_NEW

#undefTHIS_FILE

staticcharTHIS_FILE[]=__FILE__;

#endif

intnum=0;

/////////////////////////////////////////////////////////////////////////////

//CAboutDlgdialogusedforAppAbout

classCAboutDlg:

publicCDialog

{

public:

CAboutDlg();

//DialogData

//{{AFX_DATA(CAboutDlg)

enum{IDD=IDD_ABOUTBOX};

//}}AFX_DATA

//ClassWizardgeneratedvirtualfunctionoverrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport

//}}AFX_VIRTUAL

//Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg:

:

CAboutDlg():

CDialog(CAboutDlg:

:

IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

voidCAboutDlg:

:

DoDataExchange(CDataExchange*pDX)

{

CDialog:

:

DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

//Nomessagehandlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

//CVirtualOscilloscopeDlgdialog

CVirtualOscilloscopeDlg:

:

CVirtualOscilloscopeDlg(CWnd*pParent/*=NULL*/)

:

CDialog(CVirtualOscilloscopeDlg:

:

IDD,pParent)

{

//{{AFX_DATA_INIT(CVirtualOscilloscopeDlg)

m_bitSamples=-1;

m_samples=-1;

m_channel=-1;

m_fz=_T("");

//}}AFX_DATA_INIT

//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32

m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

voidCVirtualOscilloscopeDlg:

:

DoDataExchange(CDataExchange*pDX)

{

CDialog:

:

DoDataExchange(pDX);

//{{AFX_DATA_MAP(CVirtualOscilloscopeDlg)

DDX_Control(pDX,IDC_BUTTON4,m_BUTTON4);

DDX_Control(pDX,IDC_BUTTON3,m_BUTTON3);

DDX_Control(pDX,IDC_BUTTON2,m_BUTTON2);

DDX_Control(pDX,IDC_BUTTON1,m_BUTTON1);

DDX_Control(pDX,IDC_SCOPE,m_scope);

DDX_Radio(pDX,IDC_RADIO5,m_bitSamples);

DDX_Radio(pDX,IDC_RADIO1,m_samples);

DDX_Radio(pDX,IDC_RADIO7,m_channel);

DDX_Text(pDX,IDC_EDIT1,m_fz);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CVirtualOscilloscopeDlg,CDialog)

//{{AFX_MSG_MAP(CVirtualOscilloscopeDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_RADIO1,OnRadio1)

ON_BN_CLICKED(IDC_BUTTON1,OnButton1)

ON_BN_CLICKED(IDC_BUTTON2,OnButton2)

ON_BN_CLICKED(IDC_BUTTON3,OnButton3)

ON_BN_CLICKED(IDC_BUTTON4,OnButton4)

ON_BN_CLICKED(IDC_RADIO7,OnRadio7)

ON_BN_CLICKED(IDC_RADIO8,OnRadio8)

ON_BN_CLICKED(IDC_RADIO3,OnRadio3)

ON_BN_CLICKED(IDC_RADIO2,OnRadio2)

ON_BN_CLICKED(IDC_RADIO4,OnRadio4)

ON_BN_CLICKED(IDC_RADIO5,OnRadio5)

ON_BN_CLICKED(IDC_RADIO6,OnRadio6)

ON_EN_CHANGE(IDC_EDIT1,OnChangeEdit1)

ON_BN_CLICKED(IDC_SCOPE,OnScope)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

//CVirtualOscilloscopeDlgmessagehandlers

BOOLCVirtualOscilloscopeDlg:

:

OnInitDialog()

{

CDialog:

:

OnInitDialog();

//Add"About..."menuitemtosystemmenu.

//IDM_ABOUTBOXmustbeinthesystemcommandrange.

ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX<0xF000);

CMenu*pSysMenu=GetSystemMenu(FALSE);

if(pSysMenu!

=NULL)

{

CStringstrAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if(!

strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);

}

}

//Settheiconforthisdialog.Theframeworkdoesthisautomatically

//whentheapplication'smainwindowisnotadialog

SetIcon(m_hIcon,TRUE);//Setbigicon

SetIcon(m_hIcon,FALSE);//Setsmallicon

//TODO:

Addextrainitializationhere

//设置示波器横纵坐标单位

m_soundIn.GetHwnd(this->m_hWnd);

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol

}

voidCVirtualOscilloscopeDlg:

:

OnSysCommand(UINTnID,LPARAMlParam)

{

if((nID&0xFFF0)==IDM_ABOUTBOX)

{

CAboutDlgdlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog:

:

OnSysCommand(nID,lParam);

}

}

//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow

//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,

//thisisautomaticallydoneforyoubytheframework.

voidCVirtualOscilloscopeDlg:

:

OnPaint()

{

if(IsIconic())

{

CPaintDCdc(this);//devicecontextforpainting

SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);

//Centericoninclientrectangle

intcxIcon=GetSystemMetrics(SM_CXICON);

intcyIcon=GetSystemMetrics(SM_CYICON);

CRectrect;

GetClientRect(&rect);

intx=(rect.Width()-cxIcon+1)/2;

int

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2