大院PSK讲稿wjj.docx
《大院PSK讲稿wjj.docx》由会员分享,可在线阅读,更多相关《大院PSK讲稿wjj.docx(22页珍藏版)》请在冰豆网上搜索。
大院PSK讲稿wjj
2012年数字通信计算机仿真
图1数字通信系统框图
首先,在发送端将输入的数字序列通过编码器转换为二进制,形成数字基带号,接着通过低通滤波器滤除高频干扰信号,再通过调制器进行振幅调制。
其次,将信号发送即经过信道进行传输,在传输过程中有噪声的加入。
最后,在接收端将收到的信号先通过带通滤波器滤除低、高频干扰信号,接着进行同步解调,再进行低通滤波,最后进行抽样判决得到发送的信号。
1.低通滤波器窗函数
(1)汉宁(Hanning)窗——升余弦窗
(1)
主瓣宽度为8π/N,第一旁瓣比主瓣低31dB。
(2)哈明(Hamming)——改进的升余弦窗
(2)
主瓣宽度为8π/N,第一旁瓣比主瓣低40Db。
(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.解调
图3ASK信号的相干解调
(10)
5.MFC概述
MFC是用来编写Windows应用程序的C++类库,该类以层次结构组织起来,其中封装了大部分WindowsAPI函数和Windows控件,它所包含的功能涉及到整个Windows操作系统。
不仅为用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件。
使用MFC类库和VisualC++提供的高度可视的应用程序开发工具,可使应用程序变得更简单,开发周期极大地缩短,提高了代码的可靠性和可重用性。
VisualC++6.0为了减轻程序员的工作量,特别增强了应用程序向导的功能。
应用程序向导为程序员提供了一个基于MFC的应用程序框架,程序员可以在此基础上添加实现特定功能的代码。
通过应用程序向导建立应用程序框架一般可以通过以下步骤来实现:
(1)在File菜单下选择New,在New对话框中选择MFCAppWizard(exe),在ProjectName文本输入框中输入新建的项目名,如Huangweitong后单击按钮。
(2)在弹出的MFCAppWizard-Step1对话框中可以设置应用程序的类型,指定应用程序的结构是否采用文档视图结构,以及资源文件所使用的语种等。
应用程序的类型包括以下几种:
Singledocument单文档应用程序。
Multipledocument多文档应用程序。
Dialogdocument基于对话框的应用程序。
应用程序资源文件所使用的语种可以通过下拉列表选择,在中国一般都选择中文作为资源文件的语种。
(3)在设置好上述选项后,单击Next按钮,将弹出MFCAppWizard-Step2of6对话框。
在MFCAppWizard-Step2of6对话框中可以设置应用程序所使用的数据库支持,它可以是以下值之一:
None在应用程序中忽略所有的数据库支持。
Headerfilesonly包括定义基本数据库类的头文件,但不创建对应订制表的数据库类或视图类。
Databaseviewwithoutfilesupport创建对应指定表的一个数据库类和一个视图类,不附加标准文件支持。
Databaseviewwithfilesupport创建对应指定表的一个数据库类和一个视图类,并附加标准文件支持。
(4)设置好应用程序的数据库支持后,单击Next按钮,将弹出MFCAppWizard-Step3of6对话框。
在MFCAppWizard-Step3of6对话框中可以设置应用程序所支持的复合文档类型。
这一步使程序员可以向应用程序中加入OLE支持。
设置好应用程序对OLE的支持后,用户单击Next按钮将进入MFCAppWizard-Step4of6对话框。
(5)在MFCAppWizard-Step4of6对话框中用户可以设置应用程序的外观,其中可以配置的选项如下:
Dockingtoolbar一个工具栏。
Initialstatusbar一个初始状态栏。
Printingandprintpreview打印和打印预览支持。
Context-sensitiveHelp上下文相关帮助。
3Dcontrols使用3D控件。
MAPI(MessagingAPI)是否使用消息API。
WindowsSockets是否使用Windows套接字。
在MFCAppWizard-Step4of6对话框中还可以设置工具栏的外观,它可以是以下两个值之一:
Normal普通的工具栏。
InternetExplorerReBars具有风格的工具栏。
同时还可以在MFCAppWizard-Step4of6对话框中设置需要显示的最近使用的文件个数。
在设置好上述选项后,单击Next按钮将弹出MFCAppWizard-Step5of6对话框。
(6)在MFCAppWizard-Step5of6对话框中可以设置应该用程序的风格,它可以是下面两个值之一:
MFCStandard标准的MFC应用程序。
WindowsExplorer具有WindowsExplorer风格的应用程序。
在MFCAppWizard-Step5of6对话框中还可以设置是否在应用程序向导生成的代码中加注释。
它可以是下面两个值之一:
Yes,please在向导生成的代码中加注注释。
No,thankyou在向导生成的代码中不加注释。
同时在MFCAppWizard-Step5of6对话框中还可以设置使用MFC库文件的方式,它可以是下面两个值之一:
AsasharedDLL以共享动态链接库的方式使用MFC库文件。
Asastaticallylinkedlibrary以静态链接库的方式使用MFC库文件。
(7)在设置好上述选项后,单击Next按钮将进入AppWizard-Step6of6对话框。
在MFCAppWizard-Step6of6对话框中可以设置向导生成的文件名和类名。
(8)在设置好文件名和类名后,单击Finish按钮,弹出NewProjectInformation对话框,在该对话框中列出了关于新建立的应用程序项目文件的相关信息。
这样应用程序向导所有的工作就全部完成了,这时向导已经为用户生成了一个可执行的应用程序框架。
6.基于对话框的应用程序的创建
对话框(Dialog)在Windows应用程序中无处不在,起着非常重要的作用,它是用户与应用程序的主要交互途径。
它主要用来接收用户输入,对话框实际上是一个真正的窗口,不但可以接收消息,而且还可以被移动和关闭,甚至可以在它的用户区中进行绘图操作。
在MFC中对话框被封装在CDialog类中,CDialog类是CWnd类的派生类。
对话框分为模态对话框和非模态对话框两种。
当程序建立一对话框时,就必须决定该对话框是模态的还是非模态的。
从编程的观点看,意味着要在建立和撤消两个对话框之间进行选择;从用户观点来看,对话框的模式影响到在对话框可见的情况下是否可进行其他工作的问题。
模式是指对话框不同状态的一个术语。
模态对话框垄断了用户的输入,当一个模态对话框打开时,它建立自己的消息循环,使得用户只能与计算机进行交互,而其它的用户界面对象收不到输入信息。
我们平时所遇到的大部分对话框都是模态对话框。
非模态对话框不垄断用户的输入,当一个非模态对话框打开时,它不建立自己的消息循环,而是和应用程序共用同一个消息循环,这样一来用户不仅能与该对话框进行交互,而且能与其它用户界面对象进行交互。
第一,建立应用程序的项目文件。
用MFC的AppWizard建立一个应用程序时,首先要生成该应用程序的项目文件。
其步骤如下:
(1)在VisualC++的主菜单栏中选择File菜单中的New选项。
出现一个New对话框,该窗口中有4个选项卡:
Files、Projects、Workspaces和OtherDocuments。
(2)选择Projects选项卡,并在该选项卡中选择MFCAppWizard(exe)项。
(3)在ProjectName编辑框中输入要创建的项目的名称。
(4)Location编辑框中描述的是存放该项目文件的路径(位置),这可以根据用户需要,输入自己希望存放该文件的位置。
(5)在Platforms编辑框中选择Win32,我们使用的是在32位操作系统。
(6)确定项目文件的类型、名称和路径选项后,单击OK按钮,就可以开始制作该项目文件了。
(7)VisualC++显示MFCAppWizard-Step1的窗口。
这是生成项目文件的第一步,在这一步中,用户将选择创建什么类型的应用程序以及资源文件使用什么语言。
首先因为我们要生成的应用程序是基于对话框的应用程序,所以在“Whattypeofapplicationwouldyouliketocreat?
”中,选择Dialogbased选项。
然后在“Whatlanguagewouldyouliketoyourresourcesin?
”中,选择“中文【中国】APPWZCHS.DLL”项。
最后单击Next按钮,进入下一步。
(8)VisualC++显示一个MFCAppWizard-Step2of4的窗口,该窗口是生成项目文件的第二步。
首先在“Whatfeatureswouldyouliketoinclude?
”问题中,选择AboutBox(关于About对话框)和3DControls(使用三维图形控件)选项。
然后在“Pleaseenteratitleforyourdialog”编辑框中可以给应用程序主窗口命名。
最后确定以上各项后,单击Next按钮,进入下一步。
(9)VisualC++显示一个MFCAppWizard-Step3of4的窗口。
首先在“Wouldyouliketogeneratesourcefilecomments?
”中,询问是否在生成源代码文件中加注释,应选择Yes。
因为在MFCAppWizard生成的应用程序源代码文件(.cpp文件)中加上代码的注释,有助于阅读和理解源代码的含义。
然后在“HowdoyouliketousetheMFClibrary?
”问题中,选择MFC使用的动态链接库(DDL),而不是静态链接库。
使用动态链接库可以在应用程序程序运行的时侯链接起来,而不是在编译的时候就链接,使生成的应用程序exe文件比较小。
最后单击Next按钮,进入最后一步。
(10)VisualC++显示出生成项目文件的最后一步,出现一个MFC
AppWizard-Step4of4的窗口,可以看到AppWizard给出的所创建的类名和文件名,如果用户愿意,可以改变类的名称,但一般不必改变它。
(11)单击Finish按钮,显示一个NewProjectInformation的窗口,该窗口显示了前面几步所选择的全部设置,包括应用程序类型、新创建的类以及应用程序的全部特征,还显示了该应用程序将生产在哪个路径之中。
通过这些用户可以最后检查一下应用程序的设置是否完全正确,如果发现不对的地方,可以单击Cancel键取消前面的操作,用AppWizard重新制作。
检查后若完全正确,则单击Exit按钮。
AppWizard完成应用程序的自动生成工作,在指定的目录下生成应用程序框架所必需的全部文件。
第二,应用程序的可视化编程部分。
因为应用程序是基于对话框的,所以AppWizard生成一个的对话框窗口作为应用程序的主窗口,现在要做的就是在这个对话框中进行界面设计。
(1)添加并编辑控件创建对话框的第一步就是添加控件到对话框中。
可以添加到对话框中的控件主要有图片(Picture)、静态文本(StaticText)、编辑框(EditBox)、成组框(GroupBox)、按钮(Button)、复选框(CheckBox)、单选钮(RadioBox)、组合框(ComboBox)、列表框(ListBox)、水平滚动条(HorizontalScrollBar)、垂直滚动条(VerticalScrollBar)、微调(Spin)、进展条(Progress)、轨道条(Slider)、热键(HotKey)、列表控件(ListControl)、制表控件(TabControl)和动画(Animate)等。
这些控件类型都显示在控件工具栏中。
添加控件最简单的方法就是将控件从控件工具栏拖到对话编辑窗口的指定位置后释放鼠标。
此外,还可以先从控件工具栏单击要添加的控件类型(如果要添加多个同一类型的控件,则应同时按住Ctrl键),然后将光标移到要添加控件的位置,单击并拖到鼠标,当控件大小满足要求时释放鼠标。
添加控件后可以单击来选择要修改的控件,或者使用控件工具栏的选择工具或按住Shift键再单击来选择多个控件,选择控件后,就可以对其进行移动、复制、删除和调整。
此外,还可以使用控件的属性窗口来修改控件属性。
即将鼠标移到控件上,单击鼠标右键,在弹出的快捷菜单中选择属性命令,显示一个属性窗口,在此窗口中输入控件的ID标识符(这个标识符将成为识别该空间的依据)以及控件的标题。
(2)给界面对象链接变量每个控件实际上就是一个对象,对MFC类库中的函数调用都是通过对象实现的。
将鼠标移到要连接变量的控件上,单击鼠标右键,在弹出的快捷菜单中选择ClassWizard命令,VisualC++显示一个MFCClassWizard的对话框窗口,在此窗口选择MemberVariables选项卡。
在ControlIDs列表框中单击要连接变量的控件的ID号,使之亮度显示,单击右边的AddVariables按钮,设置其变量名、类别及变量类型。
这样就把变量加到了该对话框类中。
如图4所示。
图4给控件链接变量
(3)给控件链接代码要给控件映射一个消息处理函数,当事件发生时(如“单击该按钮”或编辑框里的内容发生变化时等),发送一个消息,应用程序收到消息后就执行相应的消息处理函数。
首先将鼠标移到控件上,单击鼠标右键,在弹出的快捷菜单中选择ClassWizard命令,VisualC++显示一个MFCClassWizard的对话框窗口。
然后在ObjectIDs列表里选择要添加消息处理函数的那一控件的ID标识符,在Message列表里选择相应的命令方式。
这个命令方式决定用户与用程序之间交互的方式,即用户以何种方式发送消息给应用程序,使其执行相应的消息处理函数。
接着单击右边的AddFunction按钮。
在弹出的窗口AddMemberFunction中接受建议的函数名,则在ClassWizard窗口的MemberFunction列表框中增加了一个成员函数,如图5所示。
最后单击ClassWizard窗口中的EditCode按钮,此时VisualC++显示源代码文件(.cpp),并将光标停在刚生成的函数处,等待用户定义函数的内容。
在函数体中输入要实现的功能代码即可。
图5给控件添加响应函数
(3)初始化对话框中的控件运行所建立的应用程序时,往往要求对话框窗口中的控件有一定的初始功能(如编辑框里有一定的初始值),故可以对函数OnInitDialog()进行代码编辑,此函数中的内容为程序开始运行时需要初始化的相关内容。
7.ASK数字通信系统的软件实现
表1对话框中个对象的属性
对象
ID
Caption
基本输入组合框
IDC_STATIC
基本输入
“学号”编辑框
IDC_ID
无
“噪声强度”编辑框
IDC_Intensity
无
表2对话框的控件变量
控件名称
控件ID
对应的控件变量
控件变量类型
学号
IDC_ID
nMyID
int
噪声强度
IDC_Intensity
nIntensity
int
表3控件对应的响应函数
控件名称
控件ID
响应的消息
响应消息的函数
学号
IDC_ID
EN_CHANGE
OnChangeId
噪声强度
IDC_Intensity
EN_CHANGE
OnChangeIntensity
低通滤波器
IDC_Lpf
BN_CLICKED
OnLpf
带通滤波器
IDC_Bpf
BN_CLICKED
OnBpf
基带信号
IDC_BaseSignal
BN_CLICKED
OnBaseSignal
过低通
IDC_PassLpf1
BN_CLICKED
OnPassLpf1
调制
IDC_Modulate
BN_CLICKED
OnModulate
噪声
IDC_Noise
BN_CLICKED
OnNoise
信道
IDC_Channel
BN_CLICKED
OnChannel
过带通
IDC_PassBpf
BN_CLICKED
OnPassBpf
解调
IDC_Demodulate
BN_CLICKED
OnDemodulate
过低通
IDC_PassLpf2
BN_CLICKED
OnPassLpf2
恢复判决
IDC_Adjust
BN_CLICKED
OnAdjust
SigTranmit类的生成及功能
在ASK_Pro的主菜单栏中选择插入菜单中的新建类选项,出现一个NewClass对话框,在该对话框的Classtype中选择GenericClass,在Name中输入类名SigTranmit,单击右边的OK按钮。
此时在ASK_Pro项目中生成了一个名为SigTranmit的类,该类用于实现ASK数字通信系统的全过程,包括发送端对信号进行编码、滤波(过低通滤波器)、和调制,信号传输的过程(即过信道),和接收端对信号的滤波(过带通滤波器)、解调、滤波(过低通滤波器)、和恢复判决。
在SigTranmit.h中定义SigTranmit类的两个int类型的私有数据成员myID和myIntensity。
它们分别分别为该ASK数字通信系统中将要传输的信号及信道中噪声的强度,需要用户设置,即将它们同对话框中用来接收用户输入的学号信息和噪声强度信息的控件变量nMyID和nIntensity连接起来,将nMyID的值赋給myID,将nIntensity的值赋給myIntensity。
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运算,得到