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

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上2012年数字通信计算机仿真图1 数字通信系统框图首先,在发送端将输入的数字序列通过编码器转换为二进制,形成数字基带号,接着通过低通滤波器滤除高频干扰信号,再通过调制器进行振幅调制。其次,将信号发送即经过信道进行传输,在传输过程中有噪声的加入。最后,在接收端将收到的信号先通过带通滤波器滤除低、高频干扰信号,接着进行同步解调,再进行低通滤波,最后进行抽样判决得到发送的信号。1低通滤波器窗函数(1)汉宁(Hanning)窗升余弦窗 (1)主瓣宽度为8/N,第一旁瓣比主瓣低31dB。(2)哈明(Hamming)改进的升余弦窗 (2)主瓣宽度为8/N,第一旁瓣比主瓣低40 D

2、b。(3)布莱克曼(Blackman)窗 (3) 主瓣宽度为12/N,第一旁瓣比主瓣低57dB。2. 调制调制信号可以看成一个双极性矩形脉冲序列与正弦载波相乘即 (4)其中g(t)持续时间为Ts的脉冲序列,而an的取值服从下述关系 (5)若令 (6)则上式变为 (7) 图2数字线性调制方框图基带信号形成器把数字序列an转换成所需的基带矩形脉冲序列,与载波相乘后即把其频谱搬移到fc附近,实现了ASK/PSK。3. 频率采样法设待设计的滤波器的传输函数用H(ej)表示,对它在=0和=2之间等间隔采样N点,得到Hd(k) (8)再对N点Hd(k)进行IDFT,得到h(n) (9)4. 解调图3 AS

3、K信号的相干解调 (10)5MFC概述MFC是用来编写Windows应用程序的C+类库,该类以层次结构组织起来,其中封装了大部分Windows API函数和Windows控件,它所包含的功能涉及到整个Windows操作系统。不仅为用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件。使用MFC类库和Visual C+提供的高度可视的应用程序开发工具,可使应用程序变得更简单,开发周期极大地缩短,提高了代码的可靠性和可重用性。Visual C+6.0为了减轻程序员的工作量,特别增强了应用程序向导的功能。应用程序向导为程序员提供了一个基于MFC的应用程序框架,程序员可以在

4、此基础上添加实现特定功能的代码。通过应用程序向导建立应用程序框架一般可以通过以下步骤来实现:(1)在File菜单下选择New,在New对话框中选择MFC AppWizard(exe),在Project Name文本输入框中输入新建的项目名,如Huangweitong后单击按钮。(2)在弹出的MFC AppWizard-Step 1对话框中可以设置应用程序的类型,指定应用程序的结构是否采用文档视图结构,以及资源文件所使用的语种等。应用程序的类型包括以下几种:Single document 单文档应用程序。Multiple document 多文档应用程序。Dialog document 基于对话

5、框的应用程序。应用程序资源文件所使用的语种可以通过下拉列表选择,在中国一般都选择中文作为资源文件的语种。(3)在设置好上述选项后,单击Next按钮,将弹出MFC AppWizard-Step 2 of 6对话框。在MFC AppWizard-Step 2 of 6对话框中可以设置应用程序所使用的数据库支持,它可以是以下值之一:None 在应用程序中忽略所有的数据库支持。Header files only 包括定义基本数据库类的头文件,但不创建对应订制表的数据库类或视图类。Database view without file support 创建对应指定表的一个数据库类和一个视图类,不附加标准文

6、件支持。Database view with file support 创建对应指定表的一个数据库类和一个视图类,并附加标准文件支持。(4)设置好应用程序的数据库支持后,单击Next按钮,将弹出MFC AppWizard-Step 3 of 6对话框。在MFC AppWizard-Step 3 of 6对话框中可以设置应用程序所支持的复合文档类型。这一步使程序员可以向应用程序中加入OLE支持。设置好应用程序对OLE的支持后,用户单击Next按钮将进入MFC AppWizard-Step 4 of 6对话框。(5)在MFC AppWizard-Step 4 of 6对话框中用户可以设置应用程序的

7、外观,其中可以配置的选项如下:Docking toolbar 一个工具栏。Initial status bar 一个初始状态栏。Printing and print preview 打印和打印预览支持。Context-sensitive Help 上下文相关帮助。3D controls 使用3D控件。MAPI(Messaging API) 是否使用消息API。Windows Sockets 是否使用Windows套接字。在MFC AppWizard-Step 4 of 6对话框中还可以设置工具栏的外观,它可以是以下两个值之一:Normal 普通的工具栏。Internet Explorer Re

8、Bars 具有风格的工具栏。同时还可以在MFC AppWizard-Step 4 of 6对话框中设置需要显示的最近使用的文件个数。在设置好上述选项后,单击Next按钮将弹出MFC AppWizard-Step 5 of 6对话框。(6)在MFC AppWizard-Step 5 of 6对话框中可以设置应该用程序的风格,它可以是下面两个值之一:MFC Standard 标准的MFC应用程序。Windows Explorer 具有Windows Explorer风格的应用程序。在MFC AppWizard-Step 5 of 6对话框中还可以设置是否在应用程序向导生成的代码中加注释。它可以是下

9、面两个值之一:Yes,please 在向导生成的代码中加注注释。No,thank you 在向导生成的代码中不加注释。同时在MFC AppWizard-Step 5 of 6对话框中还可以设置使用MFC库文件的方式,它可以是下面两个值之一:As a shared DLL 以共享动态链接库的方式使用MFC库文件。As a statically linked library 以静态链接库的方式使用MFC库文件。(7)在设置好上述选项后,单击Next按钮将进入AppWizard-Step 6 of 6对话框。在MFC AppWizard-Step 6 of 6对话框中可以设置向导生成的文件名和类名。

10、(8)在设置好文件名和类名后,单击Finish按钮,弹出New Project Information对话框,在该对话框中列出了关于新建立的应用程序项目文件的相关信息。这样应用程序向导所有的工作就全部完成了,这时向导已经为用户生成了一个可执行的应用程序框架。6基于对话框的应用程序的创建对话框(Dialog)在Windows应用程序中无处不在,起着非常重要的作用,它是用户与应用程序的主要交互途径。它主要用来接收用户输入,对话框实际上是一个真正的窗口,不但可以接收消息,而且还可以被移动和关闭,甚至可以在它的用户区中进行绘图操作。在MFC中对话框被封装在CDialog类中,CDialog类是CWnd

11、类的派生类。对话框分为模态对话框和非模态对话框两种。当程序建立一对话框时,就必须决定该对话框是模态的还是非模态的。从编程的观点看,意味着要在建立和撤消两个对话框之间进行选择;从用户观点来看,对话框的模式影响到在对话框可见的情况下是否可进行其他工作的问题。模式是指对话框不同状态的一个术语。模态对话框垄断了用户的输入,当一个模态对话框打开时,它建立自己的消息循环,使得用户只能与计算机进行交互,而其它的用户界面对象收不到输入信息。我们平时所遇到的大部分对话框都是模态对话框。非模态对话框不垄断用户的输入,当一个非模态对话框打开时,它不建立自己的消息循环,而是和应用程序共用同一个消息循环,这样一来用户不

12、仅能与该对话框进行交互,而且能与其它用户界面对象进行交互。第一,建立应用程序的项目文件。用MFC的AppWizard建立一个应用程序时,首先要生成该应用程序的项目文件。其步骤如下:(1)在Visual C+的主菜单栏中选择File菜单中的New选项。出现一个New对话框,该窗口中有4个选项卡:Files、Projects、Workspaces和Other Documents。(2)选择Projects选项卡,并在该选项卡中选择MFC AppWizard(exe)项。(3)在Project Name编辑框中输入要创建的项目的名称。(4)Location编辑框中描述的是存放该项目文件的路径(位置)

13、,这可以根据用户需要,输入自己希望存放该文件的位置。(5)在Platforms编辑框中选择Win32,我们使用的是在32位操作系统。(6)确定项目文件的类型、名称和路径选项后,单击OK按钮,就可以开始制作该项目文件了。(7)Visual C+显示MFC AppWizard-Step 1的窗口。这是生成项目文件的第一步,在这一步中,用户将选择创建什么类型的应用程序以及资源文件使用什么语言。首先因为我们要生成的应用程序是基于对话框的应用程序,所以在“What type of application would you like to creat?”中,选择Dialog based选项。然后在“Wh

14、at language would you like to your resources in?”中,选择“中文【中国】APPWZCHS.DLL”项。最后单击Next按钮,进入下一步。(8)Visual C+显示一个MFC AppWizard-Step 2 of 4的窗口,该窗口是生成项目文件的第二步。首先在“What features would you like to include?”问题中,选择About Box(关于About对话框)和3D Controls(使用三维图形控件)选项。然后在“Please enter a title for your dialog ”编辑框中可以给应用

15、程序主窗口命名。最后确定以上各项后,单击Next按钮,进入下一步。(9)Visual C+显示一个MFC AppWizard-Step 3 of 4 的窗口。首先在“Would you like to generate source file comments?”中,询问是否在生成源代码文件中加注释,应选择Yes。因为在MFC AppWizard 生成的应用程序源代码文件(.cpp文件)中加上代码的注释,有助于阅读和理解源代码的含义。然后在“How do you like to use the MFC library?”问题中,选择MFC使用的动态链接库(DDL),而不是静态链接库。使用动态链

16、接库可以在应用程序程序运行的时侯链接起来,而不是在编译的时候就链接,使生成的应用程序exe文件比较小。最后单击Next按钮,进入最后一步。(10)Visual C+ 显示出生成项目文件的最后一步,出现一个MFC AppWizard-Step 4 of 4 的窗口,可以看到AppWizard 给出的所创建的类名和文件名,如果用户愿意,可以改变类的名称,但一般不必改变它。(11)单击Finish 按钮,显示一个New Project Information 的窗口,该窗口显示了前面几步所选择的全部设置,包括应用程序类型、新创建的类以及应用程序的全部特征,还显示了该应用程序将生产在哪个路径之中。通过

17、这些用户可以最后检查一下应用程序的设置是否完全正确,如果发现不对的地方,可以单击Cancel 键取消前面的操作,用AppWizard 重新制作。检查后若完全正确,则单击Exit按钮。AppWizard完成应用程序的自动生成工作,在指定的目录下生成应用程序框架所必需的全部文件。第二,应用程序的可视化编程部分。因为应用程序是基于对话框的,所以AppWizard生成一个的对话框窗口作为应用程序的主窗口,现在要做的就是在这个对话框中进行界面设计。(1)添加并编辑控件 创建对话框的第一步就是添加控件到对话框中。可以添加到对话框中的控件主要有图片(Picture)、静态文本(Static Text)、编辑

18、框(Edit Box)、成组框(Group Box)、按钮(Button)、复选框(Check Box)、单选钮(Radio Box)、组合框(Combo Box)、列表框(List Box)、水平滚动条(Horizontal Scroll Bar)、垂直滚动条(Vertical Scroll Bar)、微调(Spin)、进展条(Progress)、轨道条(Slider)、热键(Hot Key)、列表控件(List Control)、制表控件(Tab Control)和动画(Animate)等。这些控件类型都显示在控件工具栏中。添加控件最简单的方法就是将控件从控件工具栏拖到对话编辑窗口的指定位

19、置后释放鼠标。此外,还可以先从控件工具栏单击要添加的控件类型(如果要添加多个同一类型的控件,则应同时按住Ctrl键),然后将光标移到要添加控件的位置,单击并拖到鼠标,当控件大小满足要求时释放鼠标。添加控件后可以单击来选择要修改的控件,或者使用控件工具栏的选择工具或按住Shift键再单击来选择多个控件,选择控件后,就可以对其进行移动、复制、删除和调整。此外,还可以使用控件的属性窗口来修改控件属性。即将鼠标移到控件上,单击鼠标右键,在弹出的快捷菜单中选择属性命令,显示一个属性窗口,在此窗口中输入控件的ID标识符(这个标识符将成为识别该空间的依据)以及控件的标题。(2)给界面对象链接变量 每个控件实

20、际上就是一个对象,对MFC类库中的函数调用都是通过对象实现的。将鼠标移到要连接变量的控件上,单击鼠标右键,在弹出的快捷菜单中选择Class Wizard命令,Visual C+显示一个MFC Class Wizard的对话框窗口,在此窗口选择Member Variables选项卡。在Control IDs列表框中单击要连接变量的控件的ID号,使之亮度显示,单击右边的Add Variables按钮,设置其变量名、类别及变量类型。这样就把变量加到了该对话框类中。如图4所示。图4 给控件链接变量(3)给控件链接代码 要给控件映射一个消息处理函数,当事件发生时(如“单击该按钮”或编辑框里的内容发生变化

21、时等),发送一个消息,应用程序收到消息后就执行相应的消息处理函数。首先将鼠标移到控件上,单击鼠标右键,在弹出的快捷菜单中选择Class Wizard命令,Visual C+显示一个MFC Class Wizard的对话框窗口。然后在Object IDs列表里选择要添加消息处理函数的那一控件的ID标识符,在Message列表里选择相应的命令方式。这个命令方式决定用户与用程序之间交互的方式,即用户以何种方式发送消息给应用程序,使其执行相应的消息处理函数。接着单击右边的Add Function按钮。在弹出的窗口Add Member Function中接受建议的函数名,则在Class Wizard窗口

22、的Member Function列表框中增加了一个成员函数,如图5所示。最后单击Class Wizard窗口中的Edit Code按钮,此时Visual C+显示源代码文件(.cpp),并将光标停在刚生成的函数处,等待用户定义函数的内容。在函数体中输入要实现的功能代码即可。图5 给控件添加响应函数(3)初始化对话框中的控件 运行所建立的应用程序时,往往要求对话框窗口中的控件有一定的初始功能(如编辑框里有一定的初始值),故可以对函数OnInitDialog()进行代码编辑,此函数中的内容为程序开始运行时需要初始化的相关内容。7ASK数字通信系统的软件实现表1 对话框中个对象的属性对象IDCapt

23、ion基本输入组合框IDC_STATIC基本输入“学号”编辑框IDC_ID无“噪声强度”编辑框IDC_ Intensity无表2 对话框的控件变量控件名称控件ID对应的控件变量控件变量类型学号IDC_IDnMyIDint噪声强度IDC_IntensitynIntensityint表3 控件对应的响应函数控件名称控件ID响应的消息响应消息的函数学号IDC_IDEN_CHANGEOnChangeId噪声强度IDC_IntensityEN_CHANGEOnChangeIntensity低通滤波器IDC_LpfBN_CLICKEDOnLpf带通滤波器IDC_BpfBN_CLICKEDOnBpf基带信号

24、IDC_BaseSignalBN_CLICKEDOnBaseSignal过低通IDC_PassLpf1BN_CLICKEDOnPassLpf1调制IDC_ModulateBN_CLICKEDOnModulate噪声IDC_NoiseBN_CLICKEDOnNoise信道IDC_ChannelBN_CLICKEDOnChannel过带通IDC_PassBpfBN_CLICKEDOnPassBpf解调IDC_DemodulateBN_CLICKEDOnDemodulate过低通IDC_PassLpf2BN_CLICKEDOnPassLpf2恢复判决IDC_AdjustBN_CLICKEDOnAdj

25、ustSigTranmit类的生成及功能在ASK_Pro的主菜单栏中选择插入菜单中的新建类选项,出现一个New Class对话框,在该对话框的Class type中选择Generic Class,在Name中输入类名SigTranmit,单击右边的OK按钮。此时在ASK_Pro项目中生成了一个名为SigTranmit的类,该类用于实现ASK数字通信系统的全过程,包括发送端对信号进行编码、滤波(过低通滤波器)、和调制,信号传输的过程(即过信道),和接收端对信号的滤波(过带通滤波器)、解调、滤波(过低通滤波器)、和恢复判决。在SigTranmit.h中定义SigTranmit类的两个int类型的私

26、有数据成员myID和myIntensity。它们分别分别为该ASK数字通信系统中将要传输的信号及信道中噪声的强度,需要用户设置,即将它们同对话框中用来接收用户输入的学号信息和噪声强度信息的控件变量nMyID和nIntensity连接起来,将nMyID的值赋給myID,将nIntensity的值赋給myIntensity。SigTranmit.h中还定义了三个int 类型和十二个float类型的私有数据成员,具体如下所示:Int c:用来存放窗函数选择结果的变量。int S016:用来存放在Basesignal函数中对数字信息编码后的信号。int S116: 用来存放在Adjust函数中对信号抽

27、样取平均后的信号。float Mod16*M:用来存放生成的载波信号。float Sa16*M:用来存放通过系统中每一个环节后的信号。float Sal16*M: 用来存放在 Basesignal函数对信号进行采样后的信号。float AR16*M:用来存放在Dft函数中对传入的数组进行DFT运算后的实部。float AI16*M:用来存放在Dft函数中对传入的数组进行DFT运算后的虚部。float A16*M:用来存放在Dft函数中对传入的数组进行DFT运算后的频域幅值。float Hl16*M:用来存放生成的低通滤波器的单位取样响应。float H216*M:用来存放在Idft数中对传入的

28、数组进行IDFT运算后的数据。float No16*M:用来存放生成的噪声float HbN:用来存放带通滤波器的频域单位取样响应。float PN: 用来存放在Idft数中进行IDFT运算所需要的数据。float WnN:用来存放窗函数的单位取样响应。在SigTranmit.h中声明SigTranmit类的二十五个公有成员函数,并在SigTranmit.cpp中对它们进行定义。各函数原型及功能如下所示:CSigTranmit(void):系统自动生成的构造函数,我在函数体内给私有变量c赋值,使得用户没有进行创函数选择时,c有默认值。void SetDigtal(int ID, int Int

29、ensity):该函数用于设置SigTranmit类的共有数据成员myID和myIntensity的初始值。void Basesignal():该函数用于对学号信息进行编码、采样,生成数字基带信号;接着调用void Dft(float x,int m)函数对采样后的信号进DFT运算,得到信号的频域特性。 void Lpf():该函数体里首先用窗函数法生成低通滤波器;接着调用函数void Conv(float array1,float array2)对低通滤波器和数字基带信号的进行卷积运算,实现信号过低通的模拟;最后调用void Dft(float x,int m)函数对过低通滤波器后的信号进行

30、DFT运算,得到信号的频域特性。void modulate():该函数实现对滤波后的信号的振幅调制,并调用void Dft(float x,int m)函数对过调制后的信号进行DFT运算,得到信号的频域特性。void Channel():该函数体里首先调用void Noise(float inten)函数生成高斯白噪声;接着将调制后的信号与高斯白噪声相加以模拟信号过信道的过程,最后调用void Dft(float x,int m)函数对过信道后的信号进行DFT运算,得到信号的频域特性。void Bpf():该函数体里首先用频率采样法生成带通滤波器,并调用函数void Idft(float h)

31、得到其时域的特性;接着调用函数void Conv(float array1,float array2)对带通滤波器和数字信号的卷积,以模拟接收到的信号过带通;最后调用void Dft(float x,int m)函数对过带通滤波器后的信号进行DFT运算,得到信号的频域特性。void Demodulate():该函数首先实现对过带通后的信号进行同步解调;其次调用void Dft(float x,int m)函数对解调后的信号进行DFT运算,得到信号的频域特性。void Adjust():该函数首先实现对解调后的信号进行恢复判决,即取平均后再采样;最后调用void Dft(float x,int

32、m)函数对过带通滤波器后的信号进行DFT运算,得到信号的频域特性。void Dft(float x,int m):该函数实现对传入的参数x的m点DFT运算,得到信号的频域特性。void Idft(float h):该函数实现对传入的参数h的IDFT运算,得到信号的时域特性。void Conv(float array1,float array2):该函数实现传入的两个参数array1和array2的卷积运算。void Noise(float inten):该函数用来生成高斯白噪声。void SetHl(float H):该函数用来设置私有变量HlN的值。void SetHb(float H):该

33、函数用来设置私有变量HbN的值。void Setc(int Myc):该函数用来设置私有变量c的值。int GetmyIntensity():该函数用来获取私有变量myIntensity的值。int Getc():该函数用来获取私有变量c的值。float* GetSa():该函数用来获取私有变量Sa16*M的值。float* GetA():该函数用来获取私有变量A16*M的值。float* GetHl():该函数用来获取私有变量HlN的值。float* GetH2():该函数用来获取私有变量H2N的值。float* GetHb():该函数用来获取私有变量HbN的值。float* GetNo()

34、:该函数用来获取私有变量No16*M的值。CSigTranmit(void):系统自动生成的析构函数,用于执行释放对象时的清理工作。画图函数的定义该系统在ASK_ProDlg类中定义了两个名字分别为Graph0和Graph的共有成员函数,通过调用它们实现在对话框右边的时域波形和频域波形静态文本框里画图。其中Graph0用来画低通滤波器和带通滤波器的特性图,Graph用来画信号在传输过程中的特性图,即在每个按钮控件的消息响应函数的最后都通过调用画图函数来实现画图功能。它们的代码分别如下:void CASK_ProDlg:Graph(float S, float Frep)CWnd *pWnd=G

35、etDlgItem (IDC_T);CDC *pDC=pWnd-GetDC (); CRect rect;pWnd-GetClientRect (rect);int W=rect.Width();/画图区域宽度int H=rect.Height();/画图区域高度RedrawWindow ();/设置背景色CBrush newbrush;newbrush.CreateSolidBrush (RGB (255,255,255);pDC-Rectangle (rect);int StepX=int(W-1)/(16*M);double maxt=findmax(S,(16*M);double St

36、epY=(H/2-10)/(fabs(maxt);/纵坐标步长/确定画图起始位置int ox=int(W-(16*M)*StepX)/2);int oyt=rect.bottom-int(H/2);/画坐标CPen CoordinatePen,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

37、-SelectObject(&pen);pDC-MoveTo(ox,oyt);for (int i=0;iLineTo(ox+i*StepX,int(oyt-StepY*Si);/频谱图CWnd *pWnd1=GetDlgItem(IDC_F);CDC *pDC1=pWnd1-GetDC();CRect rect1;pWnd1-GetClientRect(rect1);int W1=rect1.Width();/画图区域宽度int H1=rect1.Height();/画图区域高度CBrush newbrush1;newbrush1.CreateSolidBrush(RGB(255,255,2

38、55);pDC1-Rectangle(rect1);/坐标定位int StepX1=int(2*(W1-1)/(16*M);/横坐标步长float maxt1=findmax(Frep,int(16*M)/2);float StepY1=(4*H1/5-10)/(fabs(maxt1);/纵坐标步长/确定画图起始位置int oxf=int(W1-(16*M)*StepX1/2)/2);int oyf=rect1.bottom-int(H1/5);CPen CoordinatePen1,pen1;CoordinatePen1.CreatePen(PS_SOLID,1,RGB(0,255,0,);

39、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,L0);pDC1-TextOut(oxf+StepX1*16*M/2-StepX1*3,oyf+5, L);pDC1-SelectObject(&pen1);pDC1-MoveTo(oxf,oyf);for (i=0;iMoveTo(oxf+StepX1*i,oyf);

40、pDC1-LineTo(oxf+StepX1*i,int(oyf-StepY1*Frepi); 8软件实现过程中的几个问题的说明第一,SigTranmit对象的定义。该系统中实现了ASK数字通信系统的仿真,整个过程是在系统执行控件的消息响应函数来实现的,而消息响应函数中对信号的一系列运算及处理都是通过SigTranmit对象调用自身的成员函数来实现的。这就出现了在哪里定义这个类对象的问题。方案一: SigTranmit类声明后直接定义了一个类对象mySignal1。问题:系统编译不成功,显示类对象mySignal1没有定义。失败原因:对SigTranmit类对象mySignal1的使用是在CA

41、SK_ProDlg类的成员函数中的,在SigTranmit类声明中定义的类对象mySignal1在这里不可见。方案二:在每个需要SigTranmit类对象的控件的消息响应函数中都定义一次,即在每个函数中都有如下语句:SigTranmit mySignal1;问题:编译成功,但对话框静态文本框中的图形不正确,说明信号传输过程有问题。失败原因:在每个需要SigTranmit类对象的控件的消息响应函数中都定义一次mySignal1,此时mySignal1只是一个临时变量,只在其所在的函数中有效,当函数执行完后它也就消失了。这样的话每次处理的数据都是一个随机值,不是系统里要求传输的用户输入的数据。解决

42、方法:在CASK_ProDlg类的声明中定义SigTranmit类对象mySignal1,即将它作为CASK_ProDlg类的公有数据成员。类的成员函数中可以访问自身类中的数据成员,故在CASK_ProDlg类的成员函数中可以访问mySignal1,从而问题得到解决。第二,画图函数的定义。该系统中实现了ASK数字通信系统的仿真,但整个实现过程的可见性便是与用户交互的对话框。为了能够看到系统中信号传输的各个环节的特性,我们在对话框中添加了两个静态文本框用来显示信号的时域及频域波形,而这个功能的实现则是通过执行画图函数来完成的。方案一:在SigTranmit类中定义画图函数Graph,这样在控件的

43、消息响应函数中由SigTranmit类对象mySignal1来调用它。问题:编译不成功,显示两个错误:其一,画图函数中调用的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)语句调用它实现画图。问题:编译成功,但画的低通滤波器和带通滤波器的特性图均不正确,只在静态文本框的一个小区域内有图。失败原因:系统中传输的信号长度为320点,而滤波器的长度为63点,在画图函数Graph中计算画图时静态文本框的横向步长时是以320点来计算的,

温馨提示

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

评论

0/150

提交评论