2012年数字通信计算机仿真_第1页
2012年数字通信计算机仿真_第2页
2012年数字通信计算机仿真_第3页
2012年数字通信计算机仿真_第4页
2012年数字通信计算机仿真_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2012年数字通信计算机仿真图1数字通信系统框图首先,在发送端将输入的数字序列通过编码器转换为二进制,形成数字基带号,接着通过低通滤波器滤除高频干扰信号,再通过调制器进行振幅调制。其次,将信号发送即经过信道进行传输,在传输过程中有噪声的加入。最后,在接收端将收到的信号先通过带通滤波器滤除低、高频干扰信号,接着进行同步解调,再进行低通滤波,最后进行抽样判决得到发送的信号。1.低通滤波器窗函数⑴汉宁(Hanning)窗升余弦窗(n1.低通滤波器窗函数⑴汉宁(Hanning)窗升余弦窗(n)=0.51-cosG兀n/(N一1)TR(n)wH

n主瓣宽度为8n/N,第一旁瓣比主瓣低31dB。⑵哈明(Hamming)改进的升余弦窗(n)=0.54-0.46cos(1)(2nn!(N-1))]R(n)」NwHn主瓣宽度为8n/N,第一旁瓣比主瓣低40Db。(3)布莱克曼(Blackman)窗(n)=0.42-0.5cosG兀n/(N-1))+0.08cos(4兀n:(N-1))]」(n)(2)(3)主瓣宽度为12n/N,第一旁瓣比主瓣低57dB。(4)(4)(9)(9)2.调制调制信号可以看成一个双极性矩形脉冲序列与正弦载波相乘即e(t)二COSwtce(t)二COSwtcnSn其中g(t)持续时间为Ts的脉冲序列,而an的取值服从下述关系卜1其中g(t)持续时间为Ts的脉冲序列,而an的取值服从下述关系卜1;概率为pa=<n[1;概率为1-p若令则上式变为s(t)=Yag(t-nT)nSne(t)=s(t)COswt(5)(6)(7)c图2数字线性调制方框图基带信号形成器把数字序列{an}转换成所需的基带矩形脉冲序列,与载波相乘后即把其频谱搬移到土fc附近,实现了ASK/PSK。3.频率采样法设待设计的滤波器的传输函数用H(ejro)表示,对它在3=0和®=2n之间等间隔采样N点,得到Hd(k)H(k)=H(ejw),k=0,1,...,N-1(8)d宀(8)N再对N点Hd(k)进行IDFT,得到h(n)h(n)=£H(k)ejnkn,n=0,1,...,N—1k=0k=04.解调图4.解调图3ASK信号的相干解调z(t)=y(t)coswtc=s(t)cOS2wtc=sG)(1+cos2wt)/2c'=—s(t)+—s(t)cos(2wt)(—0)22c(—0)5.MFC概述MFC是用来编写Windows应用程序的C++类库,该类以层次结构组织起来,其中封装了大部分WindowsAPI函数和Windows控件,它所包含的功能涉及到整个Windows操作系统。不仅为用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件。使用MFC类库和VisualC++提供的高度可视的应用程序开发工具,可使应用程序变得更简单,开发周期极大地缩短,提高了代码的可靠性和可重用性。VisualC++6.0为了减轻程序员的工作量,特别增强了应用程序向导的功能。应用程序向导为程序员提供了一个基于MFC的应用程序框架,程序员可以在此基础上添加实现特定功能的代码。通过应用程序向导建立应用程序框架一般可以通过以下步骤来实现:在File菜单下选择New,在New对话框中选择MFCAppWizard(exe),在ProjectName文本输入框中输入新建的项目名,如Huangweitong后单击按钮。在弹出的MFCAppWizard-Step1对话框中可以设置应用程序的类型,指定应用程序的结构是否采用文档视图结构,以及资源文件所使用的语种等。应用程序的类型包括以下几种:Singledocument单文档应用程序。Multipledocument多文档应用程序。Dialogdocument基于对话框的应用程序。应用程序资源文件所使用的语种可以通过下拉列表选择,在中国一般都选择中文作为资源文件的语种。在设置好上述选项后,单击Next按钮,将弹出MFCAppWizard-Step2of6对话框。在MFCAppWizard-Step2of6对话框中可以设置应用程序所使用的数据库支持,它可以是以下值之一:None在应用程序中忽略所有的数据库支持。Headerfilesonly包括定义基本数据库类的头文件,但不创建对应订制表的数据库类或视图类。Databaseviewwithoutfilesupport创建对应指定表的一个数据库类和一个视图类,不附加标准文件支持。Databaseviewwithfilesupport创建对应指定表的一个数据库类和一个视图类,并附加标准文件支持。设置好应用程序的数据库支持后,单击Next按钮,将弹出MFCAppWizard-Step3of6对话框。在MFCAppWizard-Step3of6对话框中可以设置应用程序所支持的复合文档类型。这一步使程序员可以向应用程序中加入OLE支持。设置好应用程序对OLE的支持后,用户单击Next按钮将进入MFCAppWizard-Step4of6对话框。在MFCAppWizard-Step4of6对话框中用户可以设置应用程序的外观,其中可以配置的选项如下:Dockingtoolbar一个工具栏。Initialstatusbar一个初始状态栏。Printingandprintpreview打印和打印预览支持。Context-sensitiveHelp上下文相关帮助。3Dcontrols使用3D控件。MAPI(MessagingAPI)是否使用消息API。WindowsSockets是否使用Windows套接字。在MFCAppWizard-Step4of6对话框中还可以设置工具栏的外观,它可以是以下两个值之一:Normal普通的工具栏。InternetExplorerReBars具有风格的工具栏。同时还可以在MFCAppWizard-Step4of6对话框中设置需要显示的最近使用的文件个数。在设置好上述选项后,单击Next按钮将弹出MFCAppWizard-Step5of6对话框。在MFCAppWizard-Step5of6对话框中可以设置应该用程序的风格,它可以是下面两个值之一:MFCStandard标准的MFC应用程序。WindowsExplorer具有WindowsExplorer风格的应用程序。在MFCAppWizard-Step5of6对话框中还可以设置是否在应用程序向导生成的代码中加注释。它可以是下面两个值之一:Yes,please在向导生成的代码中加注注释。No,thankyou在向导生成的代码中不加注释。同时在MFCAppWizard-Step5of6对话框中还可以设置使用MFC库文件的方式,它可以是下面两个值之一:AsasharedDLL以共享动态链接库的方式使用MFC库文件。Asastaticallylinkedlibrary以静态链接库的方式使用MFC库文件。在设置好上述选项后,单击Next按钮将进入AppWizard-Step6of6对话框。在MFCAppWizard-Step6of6对话框中可以设置向导生成的文件名和类名。在设置好文件名和类名后,单击Finish按钮,弹出NewProjectInformation对话框,在该对话框中列出了关于新建立的应用程序项目文件的相关信息。这样应用程序向导所有的工作就全部完成了,这时向导已经为用户生成了一个可执行的应用程序框架。6.基于对话框的应用程序的创建对话框(Dialog)在Windows应用程序中无处不在,起着非常重要的作用,它是用户与应用程序的主要交互途径。它主要用来接收用户输入,对话框实际上是一个真正的窗口,不但可以接收消息,而且还可以被移动和关闭,甚至可以在它的用户区中进行绘图操作。在MFC中对话框被封装在CDialog类中,CDialog类是CWnd类的派生类。对话框分为模态对话框和非模态对话框两种。当程序建立一对话框时,就必须决定该对话框是模态的还是非模态的。从编程的观点看,意味着要在建立和撤消两个对话框之间进行选择;从用户观点来看,对话框的模式影响到在对话框可见的情况下是否可进行其他工作的问题。模式是指对话框不同状态的一个术语。模态对话框垄断了用户的输入,当一个模态对话框打开时,它建立自己的消息循环,使得用户只能与计算机进行交互,而其它的用户界面对象收不到输入信息。我们平时所遇到的大部分对话框都是模态对话框。非模态对话框不垄断用户的输入,当一个非模态对话框打开时,它不建立自己的消息循环,而是和应用程序共用同一个消息循环,这样一来用户不仅能与该对话框进行交互,而且能与其它用户界面对象进行交互。第一,建立应用程序的项目文件。用MFC的AppWizard建立一个应用程序时,首先要生成该应用程序的项目文件。其步骤如下:在VisualC++的主菜单栏中选择File菜单中的New选项。出现一个New对话框,该窗口中有4个选项卡:Files、Projects、Workspaces和OtherDocuments。选择Projects选项卡,并在该选项卡中选择MFCAppWizard(exe)项。在ProjectName编辑框中输入要创建的项目的名称。(4)Location编辑框中描述的是存放该项目文件的路径(位置),这可以根据用户需要,输入自己希望存放该文件的位置。在Platforms编辑框中选择Win32,我们使用的是在32位操作系统。确定项目文件的类型、名称和路径选项后,单击OK按钮,就可以开始制作该项目文件了。VisualC++显示MFCAppWizard-Step1的窗口。这是生成项目文件的第一步,在这一步中,用户将选择创建什么类型的应用程序以及资源文件使用什么语言。首先因为我们要生成的应用程序是基于对话框的应用程序,所以在“Whattypeofapplicationwouldyouliketocreat?”中,选择Dialogbased选项。然后在“Whatlanguagewouldyouliketoyourresourcesin?”中,选择“中文【中国】APPWZCHS.DLL”项。最后单击Next按钮,进入下一步。VisualC++显示一个MFCAppWizard-Step2of4的窗口,该窗口是生成项目文件的第二步。首先在“Whatfeatureswouldyouliketoinclude?”问题中,选择AboutBox(关于About对话框)和3DControls(使用三维图形控件)选项。然后在“Pleaseenteratitleforyourdialog”编辑框中可以给应用程序主窗口命名。最后确定以上各项后,单击Next按钮,进入下一步。VisualC++显示一个MFCAppWizard-Step3of4的窗口。首先在“Wouldyouliketogeneratesourcefilecomments?”中,询问是否在生成源代码文件中加注释,应选择Yes。因为在MFCAppWizard生成的应用程序源代码文件(.cpp文件)中加上代码的注释,有助于阅读和理解源代码的含义。然后在“HowdoyouliketousetheMFClibrary?”问题中,选择MFC使用的动态链接库(DDL),而不是静态链接库。使用动态链接库可以在应用程序程序运行的时侯链接起来,而不是在编译的时候就链接,使生成的应用程序exe文件比较小。最后单击Next按钮,进入最后一步。VisualC++显示出生成项目文件的最后一步,出现一个MFCAppWizard-Step4of4的窗口,可以看到AppWizard给出的所创建的类名和文件名,如果用户愿意,可以改变类的名称,但一般不必改变它。单击Finish按钮,显示一个NewProjectInformation的窗口,该窗口显示了前面几步所选择的全部设置,包括应用程序类型、新创建的类以及应用程序的全部特征,还显示了该应用程序将生产在哪个路径之中。通过这些用户可以最后检查一下应用程序的设置是否完全正确,如果发现不对的地方,可以单击Cancel键取消前面的操作,用AppWizard重新制作。检查后若完全正确,则单击Exit按钮。AppWizard完成应用程序的自动生成工作,在指定的目录下生成应用程序框架所必需的全部文件。第二,应用程序的可视化编程部分。因为应用程序是基于对话框的,所以AppWizard生成一个的对话框窗口作为应用程序的主窗口,现在要做的就是在这个对话框中进行界面设计。添加并编辑控件创建对话框的第一步就是添加控件到对话框中。可以添加到对话框中的控件主要有图片(Picture)、静态文本(StaticText)、编辑框(EditBox)、成组框(GroupBox)、按钮(Button)、复选框(CheckBox)、单选钮(RadioBox)、组合框(ComboBox)、列表框(ListBox)、水平滚动条(HorizontalScrollBar)、垂直滚动条(VerticalScrollBar)、微调(Spin)、进展条(Progress)、轨道条(Slider)、热键(HotKey)、列表控件(ListControl)、制表控件(TabControl)和动画(Animate)等。这些控件类型都显示在控件工具栏中。添加控件最简单的方法就是将控件从控件工具栏拖到对话编辑窗口的指定位置后释放鼠标。此外,还可以先从控件工具栏单击要添加的控件类型(如果要添加多个同一类型的控件,则应同时按住Ctrl键),然后将光标移到要添加控件的位置,单击并拖到鼠标,当控件大小满足要求时释放鼠标。添加控件后可以单击来选择要修改的控件,或者使用控件工具栏的选择工具或按住Shift键再单击来选择多个控件,选择控件后,就可以对其进行移动、复制、删除和调整。此外,还可以使用控件的属性窗口来修改控件属性。即将鼠标移到控件上,单击鼠标右键,在弹出的快捷菜单中选择属性命令,显示一个属性窗口,在此窗口中输入控件的ID标识符(这个标识符将成为识别该空间的依据)以及控件的标题。给界面对象链接变量每个控件实际上就是一个对象,对MFC类库中的函数调用都是通过对象实现的。将鼠标移到要连接变量的控件上,单击鼠标右键,在弹出的快捷菜单中选择ClassWizard命令,VisualC++显示一个MFCClassWizard的对话框窗口,在此窗口选择MemberVariables选项卡。在ControlIDs列表框中单击要连接变量的控件的ID号,使之亮度显示,单击右边的AddVariables按钮,设置其变量名、类别及变量类型。这样就把变量加到了该对话框类中。如图4所示。

图4给控件链接变量给控件链接代码要给控件映射一个消息处理函数,当事件发生时(如“单击该按钮”或编辑框里的内容发生变化时等),发送一个消息,应用程序收到消息后就执行相应的消息处理函数。首先将鼠标移到控件上,单击鼠标右键,在弹出的快捷菜单中选择ClassWizard命令,VisualC++显示一个MFCClassWizard的对话框窗口。然后在ObjectIDs列表里选择要添加消息处理函数的那一控件的ID标识符,在Message列表里选择相应的命令方式。这个命令方式决定用户与用程序之间交互的方式,即用户以何种方式发送消息给应用程序,使其执行相应的消息处理函数。接着单击右边的AddFunction按钮。在弹出的窗口AddMemberFunction中接受建议的函数名,则在ClassWizard窗口的MemberFunction列表框中增加了一个成员函数,如图5所示。最后单击ClassWizard窗口中的EditCode按钮,此时VisualC++显示源代码文件(.cpp),并将光标停在刚生成的函数处,等待用户定义函数的内容。在函数体中输入要实现的功能代码即可。IFCClassTizard|MemberVariables|Automation|ActiveXEvents|ClassInfo|MessageMapsAProject:AASK_ProD:\..-\ASK_Pro\ASK_ProDlg.h,D:\...\ASK_I4ObjectIDs:4BpfChannelDemodulateFIDBpfChannelDemodulateFIDIDCIDCIDCIDCIntensiIDCLiIDCIDCIntensiIDCLiMemberfunctions:VDoDataExchangeWOnChangeldON_IDC_ID:EN_CHANGEWOnChangelntensityON」DC_lntensity:EN_CHANGE件添加响应函数ON_IDC_Lpf:BN件添加响应函数ON_IDC_Lpf:BN」5KEDDesT3)初始化对话框中的控件^运行所建立的应用程序时,往往要求对话框窗Des口中的控件有一定的初始功能(如编辑框里有一定的初始值I),龈可以对函数OnInitDialog()进行代码编辑,此函数中的内容为程序开始运行时需要初始化的相关内容。7.ASK数字通信系统的软件实现对象IDCaption基本输入组合框IDC_STATIC基本输入“学号”编辑框IDC_ID无表1对话框中个对象的属性“噪声强度”编辑框IDC_Intensity无表2对话框的控件变量控件名称控件ID对应的控件变量控件变量类型学号IDCIDnMyIDint噪声强度IDCIntensitynIntensityint表3控件对应的响应函数控件名称控件ID响应的消息响应消息的函数学号IDCIDENCHANGEOnChangeId噪声强度IDCIntensityENCHANGEOnChangeIntensity低通滤波器IDCLpfBNCLICKEDOnLpf带通滤波器IDCBpfBNCLICKEDOnBpf基带信号IDCBaseSignalBNCLICKEDOnBaseSignal过低通IDCPassLpf1BNCLICKEDOnPassLpf1调制IDCModulateBNCLICKEDOnModulate噪声IDCNoiseBNCLICKEDOnNoise信道IDCChannelBNCLICKEDOnChannel过带通IDCPassBpfBNCLICKEDOnPassBpf解调IDCDemodulateBNCLICKEDOnDemodulate过低通IDCPassLpf2BNCLICKEDOnPassLpf2恢复判决IDCAdjustBNCLICKEDOnAdjustSigTranmit类的生成及功能在ASK_Pro的主菜单栏中选择插入菜单中的新建类选项,出现一个NewClass对话框,在该对话框的Classtype中选择GenericClass,在Name中输入类名SigTranmit,单击右边的0K按钮。此时在ASK_Pro项目中生成了一个名为SigTranmit的类,该类用于实现ASK数字通信系统的全过程,包括发送端对信号进行编码、滤波(过低通滤波器)、和调制,信号传输的过程(即过信道),和接收端对信号的滤波(过带通滤波器)、解调、滤波(过低通滤波器)、和恢复判决。在SigTranmit.h中定义SigTranmit类的两个int类型的私有数据成员mylD和mylntensity。它们分别分别为该ASK数字通信系统中将要传输的信号及信道中噪声的强度,需要用户设置,即将它们同对话框中用来接收用户输入的学号信息和噪声强度信息的控件变量nMylD和nIntensity连接起来,将nMylD的值赋給myID,将nIntensity的值赋給mylntensity。SigTranmit.h中还定义了三个int类型和十二个float类型的私有数据成员,具体如下所示:Intc:用来存放窗函数选择结果的变量。intS0[16]:用来存放在Basesignal函数中对数字信息编码后的信号。intS1[16]:用来存放在Adjust函数中对信号抽样取平均后的信号。floatMod[16*M]:用来存放生成的载波信号。floatSa[16*M]:用来存放通过系统中每一个环节后的信号。floatSal[16*M]:用来存放在Basesignal函数对信号进行采样后的信号。floatAR[16*M]:用来存放在Dft函数中对传入的数组进行DFT运算后的实部。floatAI[16*M]:用来存放在Dft函数中对传入的数组进行DFT运算后的虚部。floatA[16*M]:用来存放在Dft函数中对传入的数组进行DFT运算后的频域幅值。floatHl[16*M]:用来存放生成的低通滤波器的单位取样响应。floatH2[16*M]:用来存放在Idft数中对传入的数组进行IDFT运算后的数据。floatNo[16*M]:用来存放生成的噪声floatHb[N]:用来存放带通滤波器的频域单位取样响应。floatP[N]:用来存放在Idft数中进行IDFT运算所需要的数据。floatWn[N]:用来存放窗函数的单位取样响应。在SigTranmit.h中声明SigTranmit类的二十五个公有成员函数,并在SigTranmit.cpp中对它们进行定义。各函数原型及功能如下所示:CSigTranmit(void):系统自动生成的构造函数,我在函数体内给私有变量c赋值,使得用户没有进行创函数选择时,c有默认值。voidSetDigtal(intID,intIntensity):该函数用于设置SigTranmit类的共有数据成员myID和myIntensity的初始值。voidBasesignal():该函数用于对学号信息进行编码、采样,生成数字基带信号;接着调用voidDft(floatx[],intm)函数对采样后的信号进DFT运算,得到信号的频域特性。voidLpf():该函数体里首先用窗函数法生成低通滤波器;接着调用函数voidConv(floatarray1[],floatarray2[])对低通滤波器和数字基带信号的进行卷积运算,实现信号过低通的模拟;最后调用voidDft(floatx[],intm)函数对过低通滤波器后的信号进行DFT运算,得到信号的频域特性。voidmodulate。:该函数实现对滤波后的信号的振幅调制,并调用voidDft(floatx[],intm)函数对过调制后的信号进行DFT运算,得到信号的频域特性。voidChannel。:该函数体里首先调用voidNoise(floatinten)函数生成高斯白噪声;接着将调制后的信号与高斯白噪声相加以模拟信号过信道的过程,最后调用voidDft(floatx[],intm)函数对过信道后的信号进行DFT运算,得到信号的频域特性。voidBpf():该函数体里首先用频率采样法生成带通滤波器,并调用函数voidIdft(floath[])得到其时域的特性;接着调用函数voidConv(floatarray1[],floatarray2[])对带通滤波器和数字信号的卷积,以模拟接收到的信号过带通;最后调用voidDft(floatx[],intm)函数对过带通滤波器后的信号进行DFT运算,得到信号的频域特性。voidDemodulate。:该函数首先实现对过带通后的信号进行同步解调;其次调用voidDft(floatx[],intm)函数对解调后的信号进行DFT运算,得到信号的频域特性。voidAdjust():该函数首先实现对解调后的信号进行恢复判决,即取平均后再采样;最后调用voidDft(floatx[],intm)函数对过带通滤波器后的信号进行DFT运算,得到信号的频域特性。voidDft(floatx[],intm):该函数实现对传入的参数x[]的m点DFT运算,得到信号的频域特性。voidIdft(floath[]):该函数实现对传入的参数h[]的IDFT运算,得到信号的时域特性。voidConv(floa1arrayl[],floatray2[]该函数实现传入的两个参数arrayl和array2的卷积运算。voidNoise(floatin该函数用来生成高斯白噪声。voidSetHl(float咳函:数用来设置私有变量Hl[N]的值。voidSetHb(floatH该函数用来设置私有变量Hb[N]的值。voidSetc(intMy该函数用来设置私有变量c的值。intGetmylntensity该函数用来获取私有变量myIntensit的值。intGetc()该函数用来获取私有变量c的值。float*GetSa该函数用来获取私有变量Sa[16*M]的值。float*GetA该函数用来获取私有变量A[16*M]的值。float*GetHl该函数用来获取私有变量Hl[N]的值。float*GetH2该函数用来获取私有变量H2[N]的值。float*GetHb该函数用来获取私有变量Hb[N]的值。float*GetNo该函数用来获取私有变量No[16*M]的值。~CSigTranmit(void系统自动生成的析构函数,用于执行释放对象时的清理工作。画图函数的定义该系统在ASK_ProDlg类中定义了两个名字分别为GraphO和Graph的共有成员函数,通过调用它们实现在对话框右边的时域波形和频域波形静态文本框里画图。其中Graph。用来画低通滤波器和带通滤波器的特性图,Graph用来画信号在传输过程中的特性图,即在每个按钮控件的消息响应函数的最后都通过调用画图函数来实现画图功能。它们的代码分别如下:voidCASK_ProDlg::Graph(floatS[],floatFrep[]){CWnd*pWnd=GetDlgItem(IDC_T);CDC*pDC=pWnd->GetDC();CRectrect;pWnd->GetClientRect(rect);intW=rect.Width(画图区域宽度intH=rect.Height画图区域高度RedrawWindow();//设置背景色CBrushnewbrush;newbrush.CreateSolidBrush(RGB(255,255,255));pDC->Rectangle(rect);intStepX=int((W-l)/(l6*M));doublemaxt=findmax(S,(l6*M));doubleStepY=(H/2T0)/(fabs(maxt纵坐标步长//确定画图起始位置intox=int((W-(l6*M)*StepX)/2);intoyt=rect.bottom-int(H/2);//画坐标CPenCoordinatePen,pen;CoordinatePen.CreatePen(PS_SOLID,1,RGB(0,255,0));pen.CreatePen(PS_SOLID,1,RGB(0,0,0));pDC->SelectObject(&CoordinatePen);pDC->MoveTo(rect.left,oyt);pDC->LineTo(rect.left+W,oyt);pDC->SelectObject(&pen);pDC->MoveTo(ox,oyt);for(inti=0;i<(16*M);i++){pDC->LineTo(ox+i*StepX,int(oyt-StepY*S[i]));}//频谱图CWnd*pWnd1=GetDlgItem(IDC_F);CDC*pDC1=pWnd1->GetDC();CRectrect1;pWnd1->GetClientRect(rect1);intWl=rectl.Width();〃画图区域宽度intH1=rect1.Height();〃画图区域高度CBrushnewbrushl;newbrush1.CreateSolidBrush(RGB(255,255,255));pDC1->Rectangle(rect1);//坐标定位intStepX1=int(2*(W1-1)/(16*M));〃横坐标步长floatmaxt1=findmax(Frep,int((16*M)/2));floatStepY1=(4*H1/5-10)/(fabs(maxt1));〃纵坐标步长//确定画图起始位置intoxf=int((W1-(16*M)*StepX1/2)/2);intoyf=rect1.bottom-int(H1/5);CPenCoordinatePen1,pen1;CoordinatePen1.CreatePen(PS_SOLID,1,RGB(0,255,0,));pen1.CreatePen(PS_SOLID,1,RGB(0,0,0));pDC1->SelectObject(&CoordinatePen1);//画坐标pDC1->MoveTo(rect1.left,oyf);pDC1->LineTo(rect1.left+W1,oyf);pDC1->TextOut(oxf,oyf+5,L"0");pDC1->TextOut(oxf+StepX1*16*M/2-StepXl*3,oyf+5,L"n");pDC1->SelectObject(&pen1);pDC1->MoveTo(oxf,oyf);for(i=0;i<(16*M)/2;i++){pDC1->MoveTo(oxf+StepX1*i,oyf);pDC1->LineTo(oxf+StepX1*i,int(oyf-StepY1*Frep[i]));}}8.软件实现过程中的几个问题的说明第一,SigTranmit对象的定义。该系统中实现了ASK数字通信系统的仿真,整个过程是在系统执行控件的消息响应函数来实现的,而消息响应函数中对信号的一系列运算及处理都是通过SigTranmit对象调用自身的成员函数来实现的。这就出现了在哪里定义这个类对象的问题。方案一:SigTranmit类声明后直接定义了一个类对象mySignall。问题:系统编译不成功,显示类对象mySignal1没有定义。失败原因:对SigTranmit类对象mySignall的使用是在CASK_ProDlg类的成员函数中的,在SigTranmit类声明中定义的类对象mySignall在这里不可见。方案二:在每个需要SigTranmit类对象的控件的消息响应函数中都定义一次,即在每个函数中都有如下语句:SigTranmitmySignall;问题:编译成功,但对话框静态文本框中的图形不正确,说明信号传输过程有问题。失败原因:在每个需要SigTranmit类对象的控件的消息响应函数中都定义一次mySignall,此时mySignall只是一个临时变量,只在其所在的函数中有效,当函数执行完后它也就消失了。这样的话每次处理的数据都是一个随机值,不是系统里要求传输的用户输入的数据。解决方法:在CASK_ProDlg类的声明中定义SigTranmit类对象mySignall,即将它作为CASK_ProDlg类的公有数据成员。类的成员函数中可以访问自身类中的数据成员,故在CASK_ProDlg类的成员函数中可以访问mySignall,从而问题得到解决。第二,画图函数的定义。该系统中实现了ASK数字通信系统的仿真,但整个实现过程的可见性便是与用户交互的对话框。为了能够看到系统中信号传输的各个环节的特性,我们在对话框中添加了两个静态文本框用来显示信号的时域及频域波形,而这个功能的实现则是通过执行画图函数来完成的。方案一:在SigTranmit类中定义画图函数Graph,这样在控件的消息响应函数中由SigTranmit类对象mySignall来调用它。问题:编译不成功,显示两个错误:其一,画图函数中调用的RedrawWindow函数不是没有参数的函数。其二,画图函数中调用的GetDlgItem函数不是只有一个参数的函数。失败原因:函数GetDlgItem有两种原型:一种是只有一个参数,另一种是有两个参数。我们在画图函数Graph中通过语句GetDlgItem(IDC_F)和GetDlgItem(IDC_T)来分别获取将要画图的两个静态文本框的ID,但由于Graph是在SigTranmit类中定义的,系统并不知道要在哪个窗口中获取这两个ID,即应调用有两个参数的GetDlgItem函数,其中一个参数为要画图的静态文本框的ID,另一个为它所存在的窗口的指针。同理,RedrawWindow函数也调用错误。方案二:将画图函数Graph定义在CASK_ProDlg类中,即将它定义为CASK_ProDlg类的共有成员函数。在控件的消息响应函数中处理完消息后用this->Graph(No,A)语句调用它实现画图。问题:编译成功,但画的低通滤波器和带通滤波器的特性图均不正确,只在静态文本框的一个小区域内有图。失败原因:系统中传输的信号长度为3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论