




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验13可编程放大器实验1实验目的1)初步认识现代电子系统。2)进一步学习小信号放大器的电路制作,调试。3)编制软件,初步学习 VC语言对计算机接口电路的控制。4)安装调试软件和电路。2实验仪器计算机,示波器,信号发生器,数字万用表,直流稳压电源。3实验原理现代电子系统一般由软件和硬件两部分组成,通过硬件和软件的有机结合可实现较复 杂的功能。现在所用的电器大都可分为硬件和软件两大模块,例如计算机可作如下的划分, 主机属于硬件,是计算机工作的基础;操作系统是软件,可以控制主机实现各种各样的功能。前面的小信号放大器实验,用纯硬件实现,是一个放大倍数已经固定的放大电路。可编程放大器是增益可编程控制的
2、放大器,是一种变增益小信号放大器。设计可编程放大器的主要目的,是为了使有一定动态范围的信号,在A/D转换前实现动态压缩,保证转换精度。以8位A/D转换为例,输入信号动态范围为 0.5mV 50mV,则若以50mV对应1111,1111B, 转换精度为0.1953125mV ,这对输入0.5mV,转换精度明显下降,引入了大量的量化噪声。倘若使用变增益放大器,控制输出基本恒定,就能实现高精度的A/D转换;同时根据放大器在某一时刻的增益和此时的输出电压值,可计算得该时刻的输入模拟电压值;此外,通过对放大器的增益编程控制,还可改善放大电路的频响特性。本实验依据上述思想,主要组成框图如下:输出Vo图13
3、.1原理框图放大电路由前置放大器、可控衰减器和中间放大器组成。输出信号Vo经过声卡的A/D转换生成数字信号,由软件对数字信号幅值进行判别,计算出衰减控制码并通过并口控制可控衰减器,从而对输出信号Vo幅值进行控制。图13.1中,声卡起的是 AD转换器的作用。声卡作为语音信号与计算机的接口部件, 其最基本的一项功能就是 A/D转换。当对需要采集的信号的频带在声卡的频带范围内时,使用声卡作为采集卡是一种很好的选择,有以下几点原因:(1)价格便宜。一般声卡的价格才一百多元,比起自己开发一块采集卡的成本低得多。(2)即买即用。完全省略了 A/D卡的硬件开发过程。(3)灵活性好。量化位数可编程(8位或16
4、位);采样频率可编程(一般声卡的最高采样频率可达200KHZ,并且连续可调);采样通道可编程(1通道或2通道)。在Windows操作 系统下,可以用通用的软件开发工具对其进行开发(如Visual C+等)。实验预期达到的效果为在输入信号Vi频宽为20 - 10kHz,幅度为0.5 50mV时,输出Vo基本上为恒定值1V,即要求动态压缩指标为4OdB。4实验内容1)设计与制作放大电路(1)设计放大电路由图13.1的原理框图可知,放大电路由前置放大电路和可控衰减电路及中间放大电路三部分组成。整个电路的固定放大增益(可控衰减电路没有衰减的情况)应由Vi最小输入幅度和Vo的期望输出幅度Vr( Vr=1
5、V )来确定。根据实验要求输入最小幅度为0.5mV,而一般信号源内阻较大,所以前置放大电路必须采用高输入阻抗的放大器才能有效地接收信号。但高输入阻抗的放大器,在接收信号的同时,也容易接收干扰。通常干扰可以视作是共模的。因此该级放大电路应有较高的共模抑制比, 以有效抑制共模干扰,提高输入信干比。该级放大增益应由Vi最大输入幅度和运放最大不失真输出及可控衰减电路的输入范围统一确定。其设计可参见实验11的低频小信号放大器。这里可控衰减电路由可控衰减器AD7111A芯片实现。AD7111A是一种性能优良的数控衰减器,用它组成可编程放大器系统具有动态范围宽、控制精确、环路稳定、调试方便以及可 以用输出的
6、衰减码来计算信号的强度等许多优点。图13.2是AD7111A内部结构框图。图13.3是它的典型电路连接图。图13.4是它的引脚排列图,它是一种由17位CMO乘法DAC及译码逻辑组成的具有指数传递函数表征的数摸转换电路,其中内部还带有锁存器。输入的8位二进制数码 D0- D7经过译码逻辑转换成 17位DAC控制码。作为数控衰减器应用时,模拟信号由V|N端输入,经数控衰减后在外接运放的输出端输出。输出电压可表示为0.375NVo V|n1020(1)其中,Vin为输入电压,Vo为输出电压,0.375为衰减步长,N为衰减步数(八位二进制码) 衰减量为Vo0.375NV|N109分贝值为d =0.37
7、5N图13.2 AD7111A电路结构示意图RF0ouiAC ND图13.3 AD7111A 典型电路连接图DIP/SOTCiuulAGWIMilMDDtiwD3AD7111/ ADH11ATOf VIEW iNq t* 氣占k)i图13.4 AD7111A引脚图Kfhcs由(3)式可见,衰减量以每步 0.375dB的步长随步数(衰减控制码)N的增加而指数增 加,从而使得在整个传递函数范围内呈现一个变化的电压衰减量。在接近满幅度时,衰减量最大,在接近0幅度时,衰减量最小。N的有效范围0 239,因此AD7111A能达到的最大衰 减量约为88.5dB。有关AD7111A的详细资料可参见附录的 A
8、D7111A用户手册。在原理中已说明,控制码N是由计算机经并口给出的,因此在衰减控制电路中应设计并行口与AD7111A的连接电路。目前计算机上并行口普遍采用25引脚,包含三个端口 :数据端口,状态端口,控制端口。SPP, EPP ECP是目前比较常用的并行通信方式,三者数据传输率依次增强,接口控制软件复杂程度也依次增强。在SPP方式下,数据口信号传输方向是输出,状态口信号方向是输入,控制口信号方向是输出;在EPP和 ECP方式下,数据口信号可实现双向传输。 在本实验中希望输出控制 AD7111A的八位二进制数码,因此三种工作方 式均能满足需要。从软件控制角度考虑,在该实验中我们采用最简单的SP
9、P工作方式。在SPP下,三个端口分别对应数据寄存器,状态寄存器,控制寄存器。一般来讲,并行口的基 址为378H,各寄存器地址偏移量依次为0, 1, 2。并行口的引脚位置和各端口对应的寄存器如图5所示,此外18 25引脚为接地引脚。注意图5所示带下划线的引脚表示数据位取反后才能正常逻辑分析。图13.5并行口的引脚位置中间级放大电路作用是将可控衰减电路的输出进行一定地放大后送入声卡进行AD转换,该级增益在整个放大电路固定增益和前置放大电路增益确定后即可确定。三部分放大电路设计好后,要求用Protel绘制电路原理图(Sch图)和印刷电路板(Pcb图)(2)制作所设计的放大电路按以下步骤进行:做电源线
10、,输入线和输出线。 安装电源插座,输入插座和输出插座。 安装电源去耦电路,接直流电源,检查各集成电路供电是否正常。确认集成电路供电正常后,安装集成电路的插座。 安装前置放大电路并调试,使CMRR尽可能地高。安装可控衰减级放大电路并调试。 安装中间放大电路并调试。2)编写控制软件制作好放大电路后,剩下的任务就是用软件控制可控衰减器AD7111A的衰减倍数,使得中间放大电路的输出信号V。基本为期望输出幅度 Vr=1V。实现这一功能,需要做下面几方面的内容:编写声卡 A/D转换(录音)程序,动态显示采样波形,编写幅度判定程序, 编写并口控制程序。在同学们已经学习了C语言的基础上,该实验中我们推荐采用
11、面向对象程序设计语言 Visual C+编写程序。(1)Visual C+初步使用与C语言相比,VC引进了类和消息映射的概念。类的概念的引入,增强了程序的模块 化和可移植性。消息映射概念的引入,改变了原来C语言顺序执行的流程,充分利用了系统资源,使程序可控性和用户友好度大大增强。下面以一个简单的画线程序来初步学习VC。 从开始菜单的程序栏中打开Visual C+应用程序,程序界面如图13.6所示。图 13.6点击File菜单,选择New,会出现一新建对话框,选择上方的projects ,并在下方列表中选择 MFC AppWizardexe,在对话框右侧 project name 编辑框中填写工
12、程名字,并在下方location 处选择工程存放路径,如图13.7所示,点击右下方的0K进入MFCAppWizard -Step 1 界面。图 13.7在 MFC AppWizard-step 1对话框中选中 Single document ,界面如图13.8所示,点 击下方的 Next 进入 MFC AppWizard-Step 2 of 6 界面。图 13.8 在MFC AppWizard-Step 2 of 6界面中按默认设置不做任何更改,点击Next进入下一界面,依然按默认设置,不作任何更改,点击Next进入下一界面,直到进入MFCAppWizard -Step 6 of 6 界面,在
13、Base class下拉框中选择 CFormView类为基类,如图13.9所 示。在该界面上方的组合框中可看到新建工程通常包含的四个类:Frame类,App类,View类,Doc类。Frame类负责组建整个应用程序的框架结构,如菜单,工具条等;App类负责整个应用程序的初始化;View类通常负责视图显示,打印等;Doc类则通常负责整个应用程序的文档存储。上面各个类功能的介绍只是做一般应用,并不是有严格的界定,具体如 何使用应看应用程序的需要。点击Finish完成整个工程的创建进入下一界面。在该界面中,对刚才所创建工程特性做一汇总,点击0K进入所创建的工程,界面如图13.10所示。Fie Edt
14、Iraaat ProyKt gild Took 世ndbwBn*ish ICancel1 fi. Build / Debug X Find iti FilasX Find ill Fil,IrReady胡和dll 爲 GM 55 T 3ga| BJ可當酬兀哥职.IcffiLL-fttrowfkwsu.崔E-面田4 即 10:5T+HI+1图 13.10 *图 13.9_J Afcekralcr _| Diwlog 二J Ikon=1 Menu-NTT I匕 由+TDDO :总T对话IFileV._| Striing Table _J Toolbar_| VrrEiiunAa ab Q O顷国e
15、bh叼直n囱 阪國凹半炉EIO世m1r| 代 Build. X Debug X Find m Filsz LX Find in Fil |1祥钧浮描囹匪H Sffl亡 1、,口Ready河 D,(l芒 320x200:#|惡匸旳53 吵可|uQH Macsoftwsu.也9-国田_03:d9哼廿鼠,|盟-|巨7 MicFMoft twLialC+ -Filc - IDO FTii FORM (Oialnq)Properties 查看ID号。右侧工具条是控件工具条。 在左侧的列表框中选择ClassView选项,工程中所包含的类会出现在列表框中,可见到刚才创建工程生成的四个类。点击类旁边的+号展开
16、该类,可将类中的函数和变量显示出来。例如展开 CMyllView类,双击下方任一函数,如OnlnitialUpdate(),中间区域处光标自动会跳到该函数的定义处,在屏幕最上方会显示处当前所在的文件为11View.cpp,如图13.11所示。双击CMy11View,在屏幕上方会显示出当前所在的文件为11View.h,中间区域显示的是该文件的内容,包含了 Cmy11View类的声明,以及该类函数和变量的声明等,如图13.12所示。注意到类中有 public, protected ,private字样,它们代表了所声明函数或图 13.11图 12.12变量的类型,public代表公共型,prote
17、cted代表保护型,private代表私有型。公共型的函 数和变量,可以为任何其它类及其函数所用;保护型的函数和变量只能为与该类有继承关 系的类及其函数所用;私有型函数和变量,顾名思义,只能为本身所在的类的函数所用。若函数是在protected下方声明的,表明该函数为保护型,在左侧列表相应的函数名处有一个 小钥匙的标记。 在左侧的列表框中选择FileView选项页,在列表框中可见到工程所包含的三类文件 Source Files, Header Files, Resources Files。点击旁边的 + 号可展开,Source Files 下方 是以.cpp为后缀的文件,通常用来定义函数。He
18、ader Files下方是以.h为后缀的文件,通常图 13.13二i创兰=ml h|IDO HY:Eh E* g Insat FYDjMt三|AH cl曲塑码i a|CMyl Mew?111 resiJiiirccs _J AfCEkralarDialog三 IDD_ABOUTBOX+HI+m_| Icon_J Mlenu_J Strhy Tflbk _| Toolbar_ Version禹abl2國国 圈圈園6=S B垃団Bffl L巨BuildX Debiig X in FilerLX f ind in Fil |肿I辟詢胃站I囹囹1%王 眉RREAD图 13.14用来声明类、变量和函数。
19、一般地讲,一个类通常对应一个.cpp和一个.h文件。双击任一文件,中心区域会显示出该文件的内容,屏幕上方会标明当前所显示的文件,如图13.13所示。 点击上方工具条的叹号(Execute Program),执行应用程序,会出现一提示框,点击 后,在界面最下方编辑框中会出现编译error和warning提示信息,如果是0 error,会出现图14.14所示的界面。这是工程生成后默认的执行结果,无需添加任何代码。 关闭无标题11应用程序回到 VC编程环境,编写画线所需要的代码。在左侧列表框中选择ResourceView选项,工程中包含的资源出现在列表框中,双击ID为IDD_MY11_FORM 的D
20、ialog资源,该资源会出现在中间区域。选中并删除该资源中“ TODO:在这个对话框里设置表格控制”静态文本框。从右侧控件工具条添加butt on控件到对话框中。选中该 butt on控件,右击鼠标,选中properties更改该控件ID以及Caption,如图13.15所示。GEneralF Vlgjlblc1TPutlii IJutton PropertiesID; |lDC_HUTTONl|同回丄址H:03i申叮丄型仝Laptioin:冏nbl口顷阳EBH頤fe=n囲 k屜nl國m囲巴垃日 11 - MiiziroMrfb twiiai 匚 + - 1 匸-IDO Mf 1 乱 FORE
21、 (0诂 1口口”_J 11 resources Jl _| AtcekFsilor B -_y Dialog31 IDD_ABOUTEOX+i Lj Icon 刺 Menu *i _| Strh(| Table 由 Qj ToDlbbr 圧1 _| Versk厂 DisablEdfiuildXe - 0Ready| Styles | Extended Styictr HcHp ID|hji -tcroxfi: vi. 口心| 哥可程就丈|图 13.15 为了使该button在按下时能在屏幕中画线,我们需要为其添加消息映射。选中画 线按键,右击鼠标,选中ClassWizard,进入图13.16
22、所示的界面。在 Object IDs列表框中选择画线按键的ID号,在Messages列表框中选择BN_CLICKED消息机制,Class name表 明该消息映射所属类,点击Add Function添加消息映射函数,会出现一命名映射函数的对话框,按默认设置 OnButton1()点击OK。然后点击Edit Code添加该消息映射函数的代码,界 面如图13.17所示。通过该消息映射的添加,应用程序只要检测到单击画线按键这一消息就 会执行与之对应的消息映射函数OnButton1()。点击View菜单ClassWizard选项,出现图18.18所示的界面,按图18.18所示选择各 列表框后,点击 A
23、ddFounction,然后点击 Edit Code为添加的OnDraw ( CDC* pDC )编写代 码。在程序执行时会自动执行OnDraw函数,在应用程序界面移动或刷新时程序也会调用OnDraw函数执行。其参数CDC* pDC是图形接口函数,用它可以实现画图形, 输出文本等。 在该函数中填写画线代码:pDC-MoveTo(12,40);pDC-Li neTo(200,68);执行应用程序,应用程序界面如图13.19所示。弓121计口rET 251, 24B= n 団 rnrab|ORedy圉刊! | 野 J s Sfl M |caii - NinwcftM. Gsa|型可艇頤犬ST,|吐
24、w-画田Q國金.晒4:0图 13.16-I冋也 :k 1 - MicroMiit Vnual C+ - i liew.cpp图 13.17图 13.18图 13.19从应用程序运行结果可以看出,由于程序在初始执行时会自动调用On Draw函数,所以应用程序一执行就有线显示了,并没有在点击画线按键后出现一条线,所以应对程序 做修改。关闭应用程序,回到编程环境。在左侧列表框中选择 ClassView,双击CMy11View, 进入11View.h文件,在CMy11View类中添加一公共型布尔变量bdraw,代码添加如图13.20所示。双击左侧列表的 CMy11View类的构造函数 CMy11Vie
25、w(),在该函数中对 bdraw变量 赋初值,代码如图 13.21所示。更改 OnDraw函数中的代码如下:if(bdraw)pDC-MoveTo(12,40);pDC-L in eTo(200,68);在OnButton1()函数中填写如下代码:bdraw=true;Invalidate(true);/刷新函数,促使应用程序执行OnDraw(CDC* pDC)代码添加如图13.22所示。日CMyllVicw t As&crtValid| (CMyllViewin TMynViewQ 轻 DDDBlBExchangE( Dump(CDurnpCDnl GctDocumenild 9* OwiB
26、eglnPrlninigfC $ OnButtonlO 说 OnDraw|CDC *pDC 阳 OnEikdPrfinllng|CIM 说 OnllnlilialUpdiaO T;. 0 iiPbik parEpriri1iri|CM1l 1 Uin-Lii:图 13.20 II - Micrasoll VtMJdl 匚+ - LIVnviicpp *的曰s Edt Inwrt BaRKt guJd Tod?也ndow 出4ptQ&|x吊品d 一启同科虽3曲pMyllVIrur二| |)|AII class rnembClMyl 1 View藝附* &3/ CMylillPiew c on s
27、truct icn/d ?st rue t ion晒 1 lUiewi:CM11Uieu():CF orunUiewC CIPl 1 Vieti: IDD)y/AFX DATAIHITfCHyil Df/ MOTE: the Cl-asslz-ard uill add nenber Initializatian t/ TOPO; mdldi cviisk:ruction code herebdrau-Fals9*111 ,exe - D &rror(5j s 0 warmingfs:)| f |Build.X Pebug Find in Filer L X Fa吐 m Fil| * |HRea
28、dy|Ln41,Cd14 |fC)col|ovh|read事幵珂 誓 y皿題 * |AlJ -MOCt Vis. -JKAejnjtK丈強原.|鵲細-画图| J 03丄l4;k图 13.21- II - Micrasoll ViMJdl 匚+ - 11+J图 13.22 执行应用程序,界面如图13.23所示。由于在OnDraw函数中对画线操作进行了条件控制,此时应用程序并没有执行画线操作,点击画线按键后,程序调用函数OnButton1(),该函数中通过Invalidate(true)函数调用OnDraw函数,此时由于bdraw值为真,执行画线语句, 因此在屏幕中出现了一条线,如图13.24所示
29、,达到了预期的功能。至此画线程序编写完毕,通过对上述程序的编写,可初步掌握Visual C+语言的使用。图 13.23 “ 口亍鸟显* 3-L niotiFicdtioin handller code here无輛3T II立時(日聲辂|;巳迂宕电|無旳:虫-i曰I siuoid Clljfl 1 Uiw: lDnDraitCDC pDE)IdDffHUMT IME_DLASS(CriSJl1iP-DC );上J : Cln&” 应 Ruwtt.习 口记號,.IE!(ip - U error(s) R W UFarning(s)I * h Buildi:X Find in Fil| * | |
30、Rariy胡空丨总$ W 55 w s 11 - Hfcwig J :H百LI n l?o7c*l 1IFJf)| 時握欣犬也凸-西田 5|超a.訂图 13.24(2)编写声卡 A/D转换(录音)程序从声卡获得数据过程实际上就是模数转换采样过程,可根据需要调整采样位数和采样 频率。一般声卡都支持 8位和16位采样位数,支持22.05KHZ ,44.1KHz采样频率。Windows 操作系统提供了三种类型的音频服务:波形音频,MIDI音频和CD音频,根据需要我们选择波形音频服务。波形音频服务中又分为高层波形音频函数和低层波形音频函数,其中低 层波形音频函数可对波形录制和播放进行详细的控制,允许采
31、样过程中访问内存中的采样 数据,能解决实时性问题。因此该实验中我们采用低层波形音频函数对声卡进行A/D采样。它主要包括如下几个函数:wave In GetNumDevs:返回声音输入设备数量;waveInGetDevCaps :获取声音输入设备性能;wavelnOpen :打开声音输入设备;waveInPrepareHeader :预备声音输入缓冲区wave InUn prepareHeader :清除预备的声音waveln AddBuffer :向声音输入设备发送缓冲区;wave In Start :开始声音输入设备工作waveI nStop :停止声音输入;waveI nReset(hWa
32、vel n) 重置声音输入设备waveI nClose :关闭声音输入设备;使用低层波形音频函数来控制声卡,必须要经过以下的步骤:打开声音输入设备为采样数据分配缓冲空间在Windows环境,由于Windows操作系统采用了虚拟存储管理机制,内存空间随时有可能会被置换到硬盘上,读写硬盘所耗费的时间会造成采样的不连续。因此,在将缓冲区送往波形输入设备之前,必须调用WaveInPrepareHeader函数以保证缓冲区不会被置换到硬盘上。启动声音输入设备当上述一切都准备好后,用 WaveInStart 启动波形输入设备,即可开始进行数据采集, 在采集的过程中,一旦有缓冲区被采样数据填满,系统就回调
33、WaveInOpen 中指定的 dwCallback 函数(或向指定的窗口发送消息) 。关闭声音输入设备waveInStop(hWaveIn) 停止语音输入waveInClose(hWaveIn) 关闭语音输入设备。 其中 hWaveIn 是 WaveInOpen 得到的设备句 柄。下面给出声卡 A/D 采样的一段参考程序代码:(所采数据存放在 InputBuffer 数组中,创建了一线程 WaveInThreadProc 以保证采样 的连续性)SoundIn.h 文件代码#include mmsystem.h#include #define MAX_SAMPLES 8192 / must a
34、lso be defined in CFft#define MAX_VOIE 2#define MAX_SIZE_SAMPLES 1 / WORD#define MAX_SIZE_INPUT_BUFFER MAX_SAMPLES*MAX_VOIE*MAX_SIZE_SAMPLES#define DEFAULT_CAL_OFFSET -395 / depends of you sound card#define DEFAULT_CAL_GAIN 1.0class CSoundIn : public CObjectpublic:SHORT InputBufferMAX_SIZE_INPUT_BUF
35、FER;WAVEINCAPS m_WaveInDevCaps;HWAVEIN m_WaveIn;WAVEHDRm_WaveHeader;WAVEFORMATEXm_WaveFormat;HANDLE m_WaveInEvent;CWinThread * m_WaveInThread;BOOL m_TerminateThread;UINT m_WaveInSampleRate;int m_NbMaxSamples;UINT m_SizeRecord;BOOL begin;public:void CloseMic();void AddBuffer();MMRESULT OpenMic();void
36、 WaveInitFormat( WORD nCh, / number of channels (mono, stereo)DWORD nSampleRate, / sample rateWORD BitsPerSample);CSoundIn();virtual CSoundIn();SoundIn.cpp 文件代码:#include stdafx.h#include SoundIn.hUINT WaveInThreadProc(void * pParam);bool samp=true;/ Construction/Destruction/MMRESULT CSoundIn:OpenMic
37、()MMRESULT result; result=waveInGetNumDevs();if (result = 0)AfxMessageBox(No Sound Device); return result;/ test for Mic available result=waveInGetDevCaps (0, &m_WaveInDevCaps, sizeof(WAVEINCAPS);if ( result!= MMSYSERR_NOERROR)AfxMessageBox(_T(Cannot determine sound card capabilities !);/ The Sound
38、Devive is OK now we can create an Event and start the Thread m_WaveInEvent=:CreateEvent(NULL,FALSE,FALSE,WaveInThreadEvent); m_TerminateThread = FALSE;m_WaveInThread= AfxBeginThread(WaveInThreadProc,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED, NULL);m_WaveInThread-m_bAutoDelete = TRUE; m_WaveInTh
39、read-ResumeThread();/ init formatWaveInitFormat(1/* mono*/,m_WaveInSampleRate /* khz */,16 /* bits */);/ Open Inputresult = waveInOpen( &m_WaveIn,WAVE_MAPPER , &m_WaveFormat,(DWORD)m_WaveInEvent ,NULL ,CALLBACK_EVENT);if ( result!= MMSYSERR_NOERROR)AfxMessageBox(_T(Cannot Open Sound Input Device!);
40、return result;m_SizeRecord = m_NbMaxSamples; m_WaveHeader.lpData = (CHAR *)&InputBuffer0; m_WaveHeader.dwBufferLength = m_SizeRecord*2; m_WaveHeader.dwFlags = 0; result = waveInPrepareHeader( m_WaveIn, &m_WaveHeader,sizeof(WAVEHDR) );if ( (result!= MMSYSERR_NOERROR|) ( m_WaveHeader.dwFlags != WHDR_P
41、REPARED) ) AfxMessageBox(_T(Cannot Prepare Header !);return result;result = waveInAddBuffer( m_WaveIn, &m_WaveHeader, sizeof(WAVEHDR) );if (result!= MMSYSERR_NOERROR)AfxMessageBox(_T(Cannot Add Buffer !); return result;/ all is correct now we can start the process result = waveInStart( m_WaveIn );if
42、 (result!= MMSYSERR_NOERROR)AfxMessageBox(_T(Cannot Start Wave In !); return result; begin=true; return result;void CSoundIn:WaveInitFormat( WORD nCh, / number of channels (mono, stereo)DWORD nSampleRate, / sample rate WORD BitsPerSample) m_WaveFormat.wFormatTag = WAVE_FORMAT_PCM;m_WaveFormat.nChann
43、els = nCh; m_WaveFormat.nSamplesPerSec = nSampleRate; m_WaveFormat.nAvgBytesPerSec = nSampleRate * nCh * BitsPerSample/8; m_WaveFormat.nBlockAlign = m_WaveFormat.nChannels * BitsPerSample/8; m_WaveFormat.wBitsPerSample = BitsPerSample;m_WaveFormat.cbSize = 0;void CSoundIn:AddBuffer()MMRESULT result;
44、result = waveInUnprepareHeader( m_WaveIn, &m_WaveHeader, sizeof(WAVEHDR) );if (result!= MMSYSERR_NOERROR)AfxMessageBox(_T(Cannot UnPrepareHeader !); return; m_SizeRecord = m_NbMaxSamples;m_WaveHeader.lpData = (CHAR *)&InputBuffer0; m_WaveHeader.dwBufferLength = m_SizeRecord *2;m_WaveHeader.dwFlags =
45、 0;result = waveInPrepareHeader( m_WaveIn, &m_WaveHeader,sizeof(WAVEHDR) );if ( (result!= MMSYSERR_NOERROR|) ( m_WaveHeader.dwFlags != WHDR_PREPARED) )AfxMessageBox(_T(Cannot Prepare Header !);result = waveInAddBuffer( m_WaveIn, &m_WaveHeader, sizeof(WAVEHDR) );if (result!= MMSYSERR_NOERROR)AfxMessa
46、geBox(_T(Cannot Add Buffer !);result = waveInStart( m_WaveIn );if (result!= MMSYSERR_NOERROR)AfxMessageBox(_T(Cannot Start Wave In !);void CSoundIn:CloseMic()m_TerminateThread = TRUE;if (m_WaveInEvent )SetEvent(m_WaveInEvent);Sleep(50); / wait for the thread to terminateif (m_WaveIn)waveInStop(m_Wav
47、eIn);waveInReset(m_WaveIn); waveInClose(m_WaveIn);begin=false;CSoundIn:CSoundIn()m_NbMaxSamples = 2048*2;m_WaveInSampleRate = 44100; begin=false;CSoundIn:CSoundIn()CloseMic();/#define PT_S (CSoundIn*)pParam)UINT WaveInThreadProc(void * pParam)UINT result;UINT FirstPass = TRUE;if ( FirstPass)result W
48、aitForSingleObject(CSoundIn*)pParam)-m_WaveInEvent,INFINITE);FirstPass = FALSE;while (!(CSoundIn*)pParam)-m_TerminateThread) result= WaitForSingleObject(CSoundIn*)pParam)-m_WaveInEvent,INFINITE);if(samp&(result= WAIT_OBJECT_0)&(!(CSoundIn*)pParam)-m_TerminateThread )PT_S-AddBuffer(); / Toggle as cha
49、nged state here !Toggle point to the/just received bufferelsereturn 0;return 0;( 3) 动态显示采样波形 实验中要求在屏幕中动态显示出声卡采样波形,在增加程序的直观性的同时也可对声卡 A/D 转换模块进行功能验证。前已提及,由于在声卡采样中创建了一线程进行声卡的连 续采样,因此只需调用一次 OpenMic 函数即可实现声卡的连续采样。采用对声卡采样数据 逐点画线法,可实现声卡采样波形显示,只要满足采样点数足够多,就能保证波形的重现。 为了实现动态显示采样波形,应不断地刷新显示,可考虑采用循环语句,定时器或线程实 现
50、。该模块编写完后,可用信号源向声卡 LineIn 或 Mic 口(具体端口依据声卡录音控制 选择)输入信号,改变输入信号的幅度和频率,观测显示波形对声卡 A/D 转换模块进行功 能验证。(4) 编写幅度判定程序 在该模块中,应首先对声卡采集数据幅度进行标定,由信号源向声卡录音端口输入信 号,寻找经过声卡 A/D 转换的数字信号的最大值, 观测信号源所加信号与 A/D 转换后的数字 信号对应关系,如 1V 幅度对应转换后的数字信号最大值为10000,以估算采集信号的幅度Vo。将Vo与期望值Vr进行比较,利用可控衰减器 AD7111A的输入与输出关系式计算出控制 码N。为了能够实现对声卡采集信号幅
51、度的监测,应同动态显示采样波形一样,可采用循环 语句,定时器或线程实现。( 5) 并口控制程序计算出控制衰减码 N后,通过计算机的并口将N传送给AD7111A的数据端口从而实现对放大电路增益的控制。对并行端口的操作可通过 Win32 API 函数 DeviceIoControl 同并口 驱 动程序通信实现的,该函数主要功能是实现对指定设备的控制,如读、写等。在编写并口控制程序前首先应安装并口驱动程序 genport 。安装步骤如下 : 打开控制面 板- 添加或删除新硬件 -添加新设备 -否,我想从列表中选择硬件 -其它设备 -从磁盘安 装 - 添加 genport.ini, 安装好后可以在设备管理器中看到并口控制这个设备 , 注意该驱动 安装环境为 2000 操作系统 , 不适合 98操作系统 .对并口进行编程,应根据并口工作方式进行编程,我们此处采用的是 SPP工作方式编程。下面给出并口控制的一段参考程序代码 :.h 文件变量和函数声明#include GPIOCTL.h#includ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公共读书活动方案
- 2025至2030年中国体视彩色电视显微镜行业投资前景及策略咨询报告
- 2025至2030年中国中压电缆附件行业投资前景及策略咨询报告
- 2025至2030年中国丁基膦酸二戊异酯行业投资前景及策略咨询报告
- 公司五一表彰活动方案
- 公司企业五四活动方案
- 公司健身跑活动方案
- 公司党费使用策划方案
- 公司内部义诊活动方案
- 公司内部约稿活动方案
- 2025山东济南先行投资集团有限责任公司及权属公司社会招聘169人笔试参考题库附带答案详解
- GA 1812.2-2024银行系统反恐怖防范要求第2部分:数据中心
- 合同签订培训课件
- 2024《整治形式主义为基层减负若干规定》全文课件
- GA/T 2130-2024嫌疑机动车调查工作规程
- 第10章-氢发动机
- GB/T 3620.1-2016钛及钛合金牌号和化学成分
- 水工钢筋混凝土课程设计doc
- 市政工程预算(道路工程).PPT
- 电梯维保人员奖惩规章制度
- 浙教版科学(全6册)知识点汇总
评论
0/150
提交评论