通信原理仿真实验系统设计与实现 The design and realization of Correspondence princeple simulation experimental systemAbstract: Correspondence principle curriculum is one of the most important basic courses for the undergraduate of electrical or communication major, but the principle and concept in this curriculum is so abstract and difficult that students hard to understand, it must prepare certain experiment for them. But traditional experimental box which used for experiment project is costly, even have the disadvantages of component crackly and hard to update. For resolving above problems, exploiting a kind of virtual experimental platform is one of the effective ways[12].This paper combined friendly exploiting interface of VB software with powerful calculating function of MATLAB software, designed and exploited man- robot interaction software simulation system which have the characteristic of friendly interface, easy to operate. Especially introduce ActiveX technology that program by VB and MATLAB software. Further more introduced the design process of the simulation system.Key words: Correspondence Simulation, VB, MATLAB, ActiveX 目 录1 前言 12 国内外研究现状 13 VB和MATLAB的特点和在软件开发中的优势 24 关键技术问题的提出和解决 44.1 如何在VB中调用MATLAB程序 44.2 什么是ActiveX技术 44.3 ActiveX部件的创建 54.4 ActiveX部件的使用 55 仿真系统的VB界面设计及代码编写 75.1 编程机理 75.2 系统界面设计 75.3 代码的编写 86 实现仿真功能的MATLAB代码段的编写 136.1 通信系统模型与仿真模型 136.2 仿真原理 156.3 仿真实现过程 156.4 仿真结果 177 系统的初步完成、调试改进和不足 188 总结 20参考文献 21指导教师简介 22致 谢 23附 录 24论文摘要:通信原理课程是本科电子类,通信类专业的重要基础课程之一,但是通信原理课程中的原理、概念抽象,理论性强,学生单凭老师上课的讲解难以掌握,这就要求配备一定的实验操作。然而传统的以实验箱作为实验平台的实验教学需耗费大量的实验经费,且具有元件易损,系统升级难和实验效果不理想等缺点。开发一种虚拟的仿真实验平台是解决上述问题的有效途径之一。本文利用VB的友好开发界面和MATLAB强大的运算仿真功能,将二者相结合,设计和开发出了界面友好、操作简单的人机交互软件仿真系统。并且重点介绍了利用VB和MATLAB进行混合编程的ActiveX技术和该仿真系统的设计与实现过程。关键词:通信原理,仿真,VB,MATLAB,ActiveX 449
通信原理仿真实验系统设计与实现1 前言在当今信息时代,通信技术的发展日新月异,计算机技术的发展突飞猛进,而现代通信系统是一个十分复杂的工程系统,由于技术的复杂性,在进行实际硬件系统试验之前,软件仿真以成为必不可少的一部分。随着电子信息技术的发展,软仿真已经从仿真研究和设计辅助工具,发展成为今天的软件无线电技术,这就使得在现代通技术中,越来越重视采用计算机仿真技术来进行系统分析和设计。作为通信专业的学生和科技人员不但要掌握现代通信技术和理论,更需要了解和掌握基于计算机技术的通信系统仿真技术。计算机仿真技术的基础,是建立工程问题的数学模型,只有建立了工程问题的数学模型,才能通过计算机进行仿真,达到对系统的分析和检验目的。但由于现代通信系经的复杂性,在许多时候直接建立数学模型是相当复杂的,也不利于工程使用。因此,在通信系统的分析和设计中,人们一直希望有一种既能按物理概念直接建立分析和仿真模型,又能提供直观数学模型分析和仿真的工具。MATLAB就是一种比较适合这两种方法的现代通信系统设计、分析和仿真的实验工具。随着通信系统的复杂性不断增加,传统的设计方法已经不能适应发展的需要,因而通信系统的模拟仿真技术越来越受到工程技术人员的重视。传统的通信系统设计方法主要是手工分析与电路板试验,这些方法的最大缺点是比较繁杂,而且需要花费很多时间。通信系统模拟环境可以称之为软件试验板,它可以使用户在很短的时间内建立整个通信系统模型,并对它进行模拟仿真,计算机通信系统模拟仿真环境是介于手工分析与电路板试验之间的一种通信系统设计方法。本文充分利用了Matlab和VB将通信原理课本上的一些相关原理进行了图像仿真,在此基础上集成了一个仿真的可视化开发软件。
2 国内外研究现状MATLAB于70年代在美国被开发调用,在以后的数年里,MATLAB在多所大学里被作为教学软件使用。在国外,尤其是在美国,各著名大学在80年代末就已把MATLAB列为电气工程类专业的必修课,它是理论分析和实验研究中必须掌握的技术工具.MATLAB 之所以如此广为流传使用,因为MATLAB已逐渐发展成为适合多学科,多种工作平台的功能强大的大型软件。在欧美等高校,MATLAB已经成为线性代数,自动控制理论,数理统计,数字信号处理,时间序列分析,动态系统仿真等高级课程的基本教学工具;在设计研究单位和工业部门,MATLAB被广泛用于科学研究和解决各种具体问题。在我国,MATLAB也已被广泛应用于各种工程领域和教学领域.书市上已有越来越多关于MATLAB与各门学科相结合的参考书,如MATLAB与数学相结合,MATLAB应用于化学实验数据处理,MATLAB电子仿真与应用等等.各个学科都在充分运用这个强大的软件实现各领域问题的仿真实验。由于MATLAB提供了FORTRAN与C语言的接口,很多学者通过研究实现了MATLAB与各种软硬件的通信。尤其是与VB,VC,DSP,EDA等软硬件的使用,光是与VB的结合就有以下6种方式:[6] Matlab引擎采用C/S方式,通过Windows的ActiveX通道和Matlab相结合。 Mideva是Mathtools公司推出的一种Matlab集成编译开发平台,提供对.m文件的解释执行和开发环境支持。经过简单设置,可以把.m文件转换成C/C++代码,添加到MSVC,C++ Builder等的工程中。 利用Mideva直接生成EXE文件,在VB中通过Shell调用。 借用C++编译器把.m文件转换成DLL,CB可以直接调用。 在Matlab6.0以后,可通过Add-in实现混合编程。 MatrixVB是一个包含Matlab函数功能的COM库,可以在VB中直接调用。但是各个学者只是研究了它与软件实现通信的各种方式,没有将其运用于具体的实验系统中去.而本文的正是基于这些通信方式,将VB与MATLAB有机结合,设计和开发了通信原理课程仿真实验系统。
3 VB和MATLAB的特点和在软件开发中的优势Microsoft Visual Basic是微软公司推出的一个可视化的面向对象的应用程序开发工具,他具备当代编程语言所必须的“可视化”,“面向对象”,“事件驱动”三个特征。“可视化”使得操作界面的设计变的如同搭积木般的简单,省去了编写大量代码来完成界面的实现;“面向对象”则是把数据和处理数据的代码封装到一个类中,不仅易于程序的阅读和修改,也使得对象可以重复使用;“事件驱动”使得程序员只需对用户可能进行的操作进程序块的编写,至于其他的误操作都可置之不理。Visual Basic是基于窗体的可视化程序开发环境,简单、易用,而且可以像C/C++一样开发高级的应用程序,它避开了C++编程过分繁琐和抽象的缺点,同时又能实现大多数Windows编程目的,自微软推出以来,成为广大程序开发人员的首选语言。VB相对其他高级语言有很高的编程效率,尤其是图形界面与数据库应用方面,编程速度比其他编程语言快几倍甚至几十倍。因此,用VB开发数值计算比较复杂的应用程序时,如将MATLAB代码嵌入程序中,就可以充分利用MATLAB大量的源代码,简化运算并高效地完成编程任务。另外,由于MATLAB所提供的数学函数都针对运算过程和结果进行了专门的优化,这将提高应用系统的精确度。MATLAB是由美国的Math Works公司推出的一个为科学和工程计算而专门设计的高级交互式软件。它是一种高性能的用于工程计算的编程软件,它把科学计算、编程和结果的可视化都集中在一个使用非常方便的环境中。与其他软件相比,MATLAB的强项在于矩阵计算和图形处理。其程序组要由主程序和各种工具包组成,其中主程序包含数百个内部核心函数,工具包则包含复杂系统仿真、信号处理工具包、系统识别工具包等,本文主要通过的在MATLAB软件平台下,通过运行.m文件实现对相关通信原理的仿真。MATLAB具备强大的数值计算能力,许多复杂的计算问题只需短短几行代码就可以在MATLAB中实现。MATLAB提供的许多函数如果用C语言来实现,均需几十甚至几百条语句以上,而且MATLAB语句简单,易学易用。因此,用MATLAB进行数值分析、图象处理等工作,可以大大节省编写底层算法的时间,避免重复劳动,提供工作效率。基于VB开发界面友好简单和MATLAB强大的系统仿真功能,故决定采用利用VB编写用户操作界和MATLAB实现后台运算即图形处理的两者混合编程的方法来完成对软件仿真系统的开发。
通信原理仿真实验系统设计与实现4 关键技术问题的提出和解决4.1 如何在VB中调用MATLAB程序虽然初步的设想简单,但MATLAB下只有供FORTRAN和c语言使用的编程接口,在VB中无法对其直接进行调用,因此,如何在VB中调用MATLAB程序就是我们所面对的问题。为实现混合编程,Matlab5.0以后版本自带C语言编译器,可以把.m文件转换成.dll程序,方便VB调用。根据是否需要MATLAB环境可以将混合编程分成两大类:MATLAB在后台运行和脱离MATLAB单独运行。一般有以下几种方法[5]:(1) MATLAB引擎采用C/S方式,通过Windows的ActiveX通道和MATLAB相结合。(2) MIDEVA是MATHTOOLS公司推出的一种MATLAB集成编译开发平台,提供对.m文件的解释执行和开发环境支持。经过简单设置,可以把.m文件转换成C/C++代码,添加到MSVC,C++ Builder等的工程中。(3) 利用MIDEVA直接生成EXE文件,在VB中通过Shell调用。(4) 借用C++编译器把.m文件转换成DLL,VB可以直接调用。(5) 在Matlab6.0以后,可通过Add-in实现混合编程。(6) Matrix VB是一个包含MATLAB函数功能的COM库,可以在VB中直接调用。以上方法中,(3),(4),(5),(6)方法可以脱离MATLAB环境运行,可移植性较好。另外几种方法则需要用户在计算机上安装MATLAB后才可使用。由于本系统要求实现的功能单一,所以为了实现最终界面的统一,完成VB和MATLAB两者间的无逢连接我们决定采用ActiveX技术,即第一种方法。4.2 ActiveX技术ActiveX是Microsoft公司于1996年正式命名的一项技术,前身是Microsoft的OLE。ActiveX的基础是COM(Component Object Model:部件对象模型)。COM定义并实现了软部件机制,并把软部件统称为对象。ActiveX既不是一种编程语言,也不是一种操作系统,而是一种能使软部件作为对象进行交互作用的二进制标准。ActiveX部件是将现有的、完善的程序片段组合在一起的强有力的手段。在VB中,可以使用各种类型的ActiveX部件,如ActiveX控件和代码部件等。也可以在VB应用程序内部通过编程来操纵支持ActiveX技术的应用程序所提供的对象,如Microsoft Excel电子表格和Microsoft Word文档等。此外,还可以创建自己的ActiveX部件。4.3 ActiveX部件的创建ActiveX部件的创建根据具体情况可分为三类,一:如果需要的部件是不可见的,则应该创建代码部件。代码部件即以前的OLE服务器,是用来封装对象的一种对象库,为代码重用提供了一种简便的方法。代码部件既可是ActiveX EXE,也可以是ActiveX DLL。如果要创建的部件可以和应用程序运行在一个进程中,则应创建Active DLL;如果要创建的部件能服务于多个应用程序并能在远程计算机上运行,则应创建ActiveX EXE。二:如果需要的是可视的部件并在设计时能被拖放到应用程序中去,则应创建ActiveX控件。三:如果需要的是可视的部件并在运行时能接管应用程序的窗口,则应创建ActiveX文档。本文所利用的基本上属于第三种情况,由于MATLAB支持ActiveXAutomation服务器协议,该协议允许一个应用程序去控制另一个应用程序,因为VB也是支持该协议的,因此,一旦VB和MATLAB建立了ActiveXAutomation连接,VB即充当了控制端的角色,而MATLAB则作为服务器接收并处理VB发送的命令,实现了VB对MATLAB的调用。4.4 ActiveX部件的使用同其他对象一样,ActiveX部件创建后并不能直接使用,而必须通过一个变量,即将该部件对象引用赋值给变量,然后编写代码来使用对象的方法、属性与事件来完成对部件的使用,使用完后要释放对象。部件对象引用如何赋值取决于两个因素:①部件是否提供类型库。若提供类型库,则使用之前,要在工程中添加对类型库的引用。类型库含有ActiveX部件提供的全部对象的定义以及全部可用方法、属性和事件的定义。换句话说,若没有加载类型库的话,所使用的部件的所有可实现的功能都必须自己定义并编写代码后才可调用。②对象是顶层对象、外部可创建对象,还是从属对象。如果是外部对象,则可以在Set语句中用New关键字、CreateObject或GetObject函数从部件外面将对象引用赋予变量。如果对象是从属对象,则需要使用高层对象的方法在Set语句中指定一个对象引用。如图 4 1,由于MATLAB提供了相关的类型库,故本问所设计的仿真系统在使用VB设计时将库添加后即可使用MATLAB提供的相关方法、属性和事件。
通信原理仿真实验系统设计与实现5 仿真系统的VB界面设计及代码编写5.1 编程机理MATLAB提供了功能强大的与C/C++,Fortran的外部程序接口,而且提供了内嵌在VB的MATLAB矩阵函数库等等。这使得MATLAB与其他高级语言的混合编程成为可能。MATLAB与VB的混合编程有几种方法,本系统中,考虑到只是为了调用MATLAB产生波形仿真图,故采用了ActiveX技术。ActiveX是定义从Web到OLE(对象连接与嵌入)控件的所有内容的核心术语。Miscrosoft建立了一套使用和集成ActiveX组件的标准,从Visual Basic到Miscrosoft Word,到Java的所有产品都具有使用ActiveX组件的能力。ActiveX组件有很多类型,在MATLAB中,对两种ActiveX技术提供了支持,其中包括ActiveX自动化,也就是在上文2.3中提到的ActiveX Automation服务器协议,它包含了ActiveX自动化服务器和ActiveX自动化控制器,我们使用MATLAB作为自动化服务器,它是可以由其他应用程序编程驱动的组件。而自动化控制器就是使用和操纵自动化服务器的应用程序,本系统中使用Visual Basic作为自动化控制器,使用它可以生成、使用和删除自动化服务器,就好像它们是语言的一部分。在VB应用程序内创建MATLAB ActiveX对象后,就可以使用这个对象的方法、属性来实现对MATLAB的调用。5.2 系统界面设计由于该程序的开发意图在于方便计算机教学,使得教师在课堂上通过简单的点击几个按钮就能看到波形的仿真,节省时间;同时也能让没学过MABLAB编程或是不能熟练运用MATLAB编程的同学能够通过简单的点击几个按钮就能看到波形的仿真,起到与MATLAB接口的作用,因此考虑只添加足够多的命令按扭控件即可,系统的主界面如图 5 1:其中主界面将通信原理课程中的主要实验分为六个章节,其中每个章节又用子菜单共分为12个实验。
图 5 1 系统主界面由于篇幅有限,本文中所有代码编写及仿真原理介绍仅以第二节模拟线性调制中的抑制双边带调幅(DSB_SC)为例做介绍。本节实验界面如图 5 2: 图 5 2 抑制双边带调幅界面5.3 代码的编写如同其他可视化高级编程语言一样,VB采用的是事件驱动模式和面向对象,因此不存在所谓的主程序和子程序,代码整体可看成由许多小的过程组合在一起的集合,我们只需对用户可能发生的事件编写相应的代码即可,因此,相对于其他高级语言,VB体现了简单易用的优势。由于该程序对实现的功能要求不高,故编写代码的关键便在于如何通过VB实现对MATLAB的调用,正如前面我们所说的,在这我们用到了ActiveX技术,如图 4 1,由于MATLAB已经为我们提供了丰富的类型库,我们只需将其添加进VB即可实现对MATLAB功能的调用。在前面我们已经说过,ActiveX部件必须通过定义变量赋值的方式来调用,所以在调用MATLAB内部命令之前,VB的程序编辑器里需有如下指令:Dim Matlab as Object;Set Matlab=CreateObject(“Matlab.Application”)作为声明来实现对MATLAB对象的创建,该语句在通用声明栏,不属于任何过程和子过程,类似于c语言中的全局变量。则成功创建并引用了MATLAB对象。下面将通过MATLAB提供的方法、属性和命令来完成对程序的设计。Matlab.Application对象提供了5种方法来实现对MATLAB的调用,它们是:Execute,PutFullMatrix,GetFullMatrix,MinimizeCommandWindow和MaximizeCommandWindow。利用这些方法即可在VB程序中实现任何MATLAB的功能。其Execute方法用于在VB中调用MATLAB命令,也是本设计中用的方法,PutFullMatrix和GetFullMatrix主要实现1,2维数组在VB和MATLAB中的传递,本设计暂时不使用这两种方法,最后两种方法用于控制MATLAB命令行窗口的最大化和最小化,基本属于非必须的方法。下面重点介绍Execute方法如何使用。Execute(commandstring):其中参数commandstring为字符型参数,表示任何可在MATLAB命令行中输入的命令。举个例子:在MATLAB命令行下,输入surf(peaks)将绘制出一个三维曲面图,而在VB中则可通过下面的语句来实现同样的功能,结果如图 5 3:Dim Matlab as ObjectSet Matlab =CreateObject(“Matlab.Application”)Matlab.Execute(“surf(peaks)”) 图 5 3到此,该系统设计的关键已经突破,剩下的只是如何编写适当的代码来完成设计,以达到设计所需的功能。如果每条命令都通过Execute调用显然是很烦琐的,因此本设计中将每种调试的仿真程序写成.m文件保存在MATLAB的工作目录下,即可通过一条简单的命令实现对整个程序的调用。下面以 按钮控件为例介绍VB代码的编写。Dim Matlab As Object %创建ActiveX对象Private Sub Command1_Click() %DSB-SC按钮过程处理Set Matlab = CreateObject("Matlab.Application") %引用MATLAB对象Call Matlab.MinimizeCommandWindow %命令行窗口最小化Matlab.Execute ("dsbmod") %调用dsbmod.m文件生成仿真波形End Sub由于在使用ActiveX部件时,任何地方都有产生错误的可能,因此错误处理不可缺少,因此在通用声明中添加一个错误处理函数,用于判断是否正常启动MATLAB,具体函数如下:Function StartMath()
通信原理仿真实验系统设计与实现On Error GoTo ErrorTrapExit FunctionErrorTrap:Select Case Err.NumberCase 440intTries = intTries + 1If intTries < 5 ThenSet MathApp = New Matlab.ApplicationResumeElseErr.Raise Number:=vbObjectError + 28765Description = "不能启动 MATLAB"End IfCase ElseErr.Raise Number:=Err.NumberEnd SelectEnd Function定义了错误处理函数之后,以后只要在需要错误判断的地方插入该函数即可。其他按钮控件的代码编写大体和 一致。至于窗体过程,由于该软件只将课程中的实验例题的结果进行仿真显示,因此不在考虑范围。最后只剩例题题目的显示和主界面退出按钮两控件代码需要编写。由于在Text文本框中不能显示特殊的数学符号和数学公式的显示,因此考虑使用Image控件。将已在Word里面编辑好的例题题目,以图片的形式存储起来。然后在在Image控件的Picture属性里将这些图片加载进来即可。至于退出按钮,本设计中创建了一个对话框,如图 5 4,其中 按扭功能为结束此程序。原本只需要在代码栏中添加End语句即可,但由于设计中创建并引用了ActiveX对象,因此在程序退出时还需释放该对象,所以还需要一句释放对象的命令:Set Matlab = Nothing.。而 按扭功能为返回原程序,所以只需将此对话框窗体关闭即可,取消按纽所对应的代码为:Dialog.hide。到此,整个的设计和代码编写都基本完成。 图 5 4 退出界面
6 实现仿真功能的MATLAB代码段的编写6.1 通信系统模型与仿真模型通信是指消息传递的全过程,即信息的传输与交换。通信的目的在于传递信息,完成信息传递所需要的全部设备和传输媒介的总和称为通信系统。如果信道中传输的是模拟信号,所对应的通信系统为模拟通信系统,如果信道中传输的是数字信号,所对应的通信系统为数字通信系统。最简单的通信系统模型由信源、信道和信宿三个基本部分组成,同时在信道中还存在着干扰,模型[4]如下图 6 1:
图 6 1 简单通信系统模型实际的通信系统要比上图中的简单通信系统模型复杂得多,点对点通信系统的一般模型如图 6 2,它反映了通信系统的共性,由于数字化时代的到来,已经不再纯粹的采用单一的模拟信号进行传输,而是把模拟信号转换成数字信号,通过编码和解码的手段使原始模拟信号变成适合信道传输的数字信号,在数字信号到达接收端后再对其还原,恢复成原来的模拟电信号[3]。数字通信与模拟通信相比具有明显的优点:首先抗干扰能力强。模拟信号在传输过程中和叠加噪声很难分离,噪声会随着信号被传输,严重影响通信质量。数字通信中的信息包含在以0,1表示的序列脉冲中,只要噪声绝对值不超过某一门限值,接收端就可以判别脉冲的有、无和误差与否,以保证通信的可靠性。其次是远距离传输仍能保证质量。因为数字通信是采用再生中继方式,能够消除噪声,再生的数字信号和原来的数字信号一样,可继续传输下去,这样通信质量便不受距离的影响,可高质量地进行远距离通信。此外,它还具有适应各种通信业务的要求(如电话,电报,图像,数据等),便于实现统一的综合业务数字网,便于采用大规模集成电路,便于实现加密处理,便于实现通信网的计算机管理等优点。 图 6 2 现代数字通信系统的一般模型综合数字通信的优点,下图给出了一般数字通信系统的模型并介绍了个部分的具体作用:●信源:其作用是把各种可能的消息转换成原始电信号,即非电/电转换。●发送设备:用于将信源产生的消息信号变换成适合在信道中传输信号,其变换过程包括编码和调制,其基本功能是将信源和信道匹配。●信道:是信号传输的通道,即传输媒介,分为有线信道和无线信道类。信道为信号提供了通道,同时也对信号产生各种干扰和噪声。 噪声源:指信道中的噪声以及分散在通信系统其他各处的噪声的集中表示,它将影响通信质量。 接收设备:它的功能与发送设备相反,它能从带有干扰的接收信号中正确恢复出相应的原始信号。 信宿:其作用是将复原的原始电信号转换成消息,即电/非电转换。●信道编码器:将信源的输出变换为数字信息序列,信源编码的目的通常是为了降低信源输出中的多余度,减少每个消息、字符所需的平均码元数,从而提供信息传输或存储的有效性。●信道编码器:对信源编码器的输出进行变换,用增加多余度的方法提高对信道干扰的抗击能力。●解调器:将从信道中传送过来的信号波形还原为调制以前的数字序列。●信道译码器:与信源编码器作用相反,它把经过信道译码器核对后的信息序列转换为适合收信者接收的消息形式。通信的任务是快速、准确的传递信息,从消息的传输方面来说,通信的有效性和可靠性是通信系统最主要的性能标准。有效性是指在给定信道内所传输的信息内容的多少,主要指消息传输的“速度”问题;可靠性是指接收信息的准确程度,主要指消息传输的“质量”问题,这两者是相互矛盾而又是相互联系的。衡量数字通信系统的有效性的主要性能指标是传输速率、频带利用率;可靠性指标主要是差错率。6.2 仿真原理MATLAB提供了丰富的函数用于实现通信仿真,故本文以双边带抑制载波调制解调器的仿真为例介绍相应的仿真原理和仿真过程。幅度调制是正弦型载波的幅度随调制信号作线性变化的过程。双边带抑制载波振幅调制采用正弦波的原始信号m(t)进行处理: (1)其中y(t)表示调制后的信号, 为载波频率,是初始相位,双边带抑制载波振幅调制解调器为同步解调器,即由乘法器和低通滤波器组成,原理图如图 6 3: 图 6 3 原理图假设m(t)频谱为M(),则经过调制后其频谱S()会线性搬移到c处。 (2)通过调用MATLAB的函数,按照顺序依次执行,可以实现数据流的仿真分析。6.3 仿真实现过程在MATLAB中只需编写相应的代码,即可实现所给题目的仿真实验,得出相应的仿真结果。此处,仍以抑制双边带调幅为例,给出其MATLAB实现程序如下:(脚本文件dsbmod.m)%.抑制双边代调制clear echo on
通信原理仿真实验系统设计与实现t0=2; %信号持续时间ts=0.001; %抽样时间间隔fc=100; %载波频率fs=1/ts;df=0.3; %频率分辨力t=[-t0/2:ts:t0/2]; %定义时间序列%以下三句为定义信号序列x=sin(200*t);m=x./(200*t);m(1001)=1; %避免产生无穷大的值c=cos(2*pi*fc.*t); %载波u=m.*c; %抑制载波调制[M,m,df1]=fftseq(m,ts,df); %付里叶变换M=M/fs; [U,u,df1]=fftseq(m,ts,df);U=U/fs; %频率压缩f=[0:df1:df1*(length(m)-1)]-fs/2;clfsubplot(4,2,1)plot(t,m(1:length(t))) %作出未调信号的波形axis([-0.4,0.4,-0.5,1.1])xlabel('时间'); title('未调信号')subplot(4,2,3)plot(t,c(1:length(t))) %作出载波的波形axis([-0.1,0.1,-1.5,1.5]);xlabel('时间') title('载波'); %pause;subplot(4,2,2) %作出已调信号的波形plot(t,u(1:length(t)))axis([-0.2,0.2,-1,1.2]);xlabel('时间') title('已调信号'); %pause;subplot(4,1,3) %作出未调信号的频谱plot(f,abs(fftshift(M)))xlabel('频率'); title('未调信号的频谱')%pause;subplot(4,1,4) %作出已调信号的频谱plot(f,abs(fftshift(U)))title('已调信号的频谱'); xlabel('频率')6.4 仿真结果本例的仿真结果如图 6 4所示: 图 6 4 仿真结果 7 系统的初步完成、调试改进和不足系统界面设计及完成之后,整个系统算是初步完成,经过调试各项功能基本都能正确实现,但是考虑由于各章节都按课程提供的例题进行仿真,因此想到是否可以对其中的参数进行改变,而得到其他的结果。但是由于本文所采取的VB和MATLAB的接口方法的限制,对此造成了一定的困难。所以目前本文只完成了对一个例题的实现,即第一节中平均信息量的计算。其界面如图 7 1显示。 图 7 1 平均信息量计算界面本道例题是通过提供离散信息源的个数及其概率分布,从而计算该信源的平均信息量,因此关键的参数为信息源的定义。所以本例要解决的主要问题就是如何从外界接收信息源的定义并通过VB传递给MATLAB。添加了一个文本框Text2,Text1用于显示左边的文本说明。通过文本框的TEXT方法将用户信息传递给VB,既然可以将变量传递给VB,那么从VB传递给MATLAB只需用到Execute方法即可。只需添加语句:Matlab.Execute( Text2.Text)来完成用户对信息源的定义。其中“Text2.Text”为用户文本框中输入的内容,即用户如果在文本框中输入的是“message([0.1,0.9],2)”,单击仿真按扭后即相当于在MATLAB命令行中添加了“message([0.1,0.9],2)”这句,即可以在MATLAB中运行此句,同时显示相应的计算结果于标签Label1中。 命令按扭下的代码如下:Dim matlab As ObjectPrivate Sub Command1_Click()Set matlab = CreateObject("Matlab.Application") '引用MATLAB对象Call matlab.MinimizeCommandWindow '命令行窗口最小化Label2.Caption = matlab.Execute(Text1.Text) '调用message.m文件End Sub在调试时为了保证程序的运行可以在其后加入前文介绍的出错函数,以便检查用户在文本框中的输入时是否严格按照左边的说明填写,以便运行时不出错。至于其它的例题,仅能看到特定例题的仿真结果,这也是此次设计不足之处。
通信原理仿真实验系统设计与实现8 总结本文简单介绍了VB与MATLAB混合编程的技术,从而设计了本科教学中通信原理课程实验的演示系统。Microsoft VB作为开发软件,使用特别方便,尤其在开发界面方面有独到的优点,但是在计算与图形显示方面,显得能力不足。MATLAB系统中有许多科学计算及图形显示方面的函数,用MATLAB中的通信工具箱来进行通信领域的研究,开发和系统设计分析是一种行之有效的方法,在教学中也可起到很好的辅助作用,它不仅能完成设计分析,还能完成通讯系统的许多实际条件无法完成的仿真实验。另外,除了直接应用MATLAB中的工具箱实现仿真分析外,还可以用SIMULINK仿真平台。它为用户提供了完整的通讯系统模块库,用模块库可以搭建自己的系统,完成系统设计分析。这样工程人员就可以编写简单的语句调用这些现成的函数或编写出需要实现的功能函数。充分利用两个软件的优点进行混合编程,可以编制出界面友好、计算及图形处理能力强大的软件。本文的演示实例表明,在通信原理的学习过程中利用MATLAB和VB的混合编程可以大大降低代码的长度和复杂性,而且易于用户使用。限于篇幅,本文仅以双边带抑制载波调制为例子具体介绍了通过MATLAB仿真的过程,对其他的章节实验都可以做类似分析和仿真,程序都已在附录中给出。VB和MATLAB的接口技术还可采用其他的方法,如使用Shell函数的方法或者将MATLAB程序转换为动态链接库(DLL文件)的方法等。但利用ActiveX自动化和DDE法简单方便,效率较高,功能强大,再加上学校机房一般都安装了MATLAB,故是一种理想的无缝链接方法。
参考文献[1] 何文俊,马杰,等.Visual Basic编程实例精解.北京:北京希望电子出版社,2000[2] 王颖.ActiveX:从Visual Basic6.0调用MATLAB的实现方法.机电工程,1999 (5),72~74[3] 韩利竹, 王华,等.MATLAB电子仿真与应用.北京:国防工业出版社,2003[4] 樊昌信,张甫翊,等.通信原理.北京:国防工业出版社,2001[5] 周竹生,陈灵君,等.VB实现对Matlab程序的调用.电脑开发与应用,2004 (5),21~24[6] 朱志松,郭晓丽,等.VB与MATLAB接口编程控讨.电子应用技术,2003 (12)[7] 李天启. Visual basic6.0学习捷径.清华大学出版社,1998[8] 刘专俭.MATLAB应用程序接口用户指南.科学出版社,2000[9] 徐明远,邵玉斌.MATLAB仿真在通信和电子工程中的应用.西安电子科技大学出版社,2005.[10] MATLAB,MATLAB Complier Suite Documentation Mathworks,2003[11] Duance,Hanselman,Bruce. Littlefield Mastering MATLAB Prentice Hall. International, Inc,1996[12] S Card, S G Eick, N Gersho. Information Visuallization, New York: A CM Siggraph’ 98 course,ACM,1998(News):9~15[13] [美]Vinay K.Ingle, John G.Proakis. Digital Signal Processing Using MATLAB.北京:科学出版社,2003.
指导教师简介徐X,男,云南人,毕业于C学信息学院信息与电子科学系电子信息工程专业,获工学学士学位。毕业后到西南林学院计算机与信息科学系任教。主讲课程为:《数字电路》、《模拟电子电路》、《C程序设计》、《移动通信》、《VB程序设计》、《交换原理》、《自动控制原理》等。2005年获西南林学院“青年教师课堂教学”比赛二等奖。曾指导过西南林学院2003至2006届的多名本科毕业生的毕业设计。 致 谢写到这里,即我的学位论文将要付梓的时候,想要说的感谢很多,因此我想借这一隅之地说上几句。这篇并不太长的论文,不仅使我想到这三个月来的艰辛工作,四年来的寒窗苦读,更是我人生最重要的一段时间的一个句号。在这段时间里,我从一个从未离开父母庇护的懵懂少年成长为一个懂得人间寒暑的高校毕业生,其间的痛苦,悲伤,欢笑,一切的一切在我脑海中还是那么清晰、难忘……但我还是要感谢,感谢陪我走过陪我经历这一切的所有的朋友、同学、老师、父母。感谢你们对我的帮助,感谢你们给我的教导,感谢你们给我的温情。当然,还要感谢我的母校—X学院。一次次的迷失,一丝丝的曙光,导师徐老师的鼓励和教导指引着我走过了这几个月的时间。可以说没有恩师就没有本篇论文的完成。敬祝恩师身体安康,合家幸福!其次,我还要感谢系上四年来对我的关心与栽培,特别是授课予我的各位老师,四年来是你们孜孜的教诲,才成就了今天的我.此外,还要衷心感谢我的同学们的帮助,你们在生活和学习上对我的帮助是这篇论文得以顺利完成的保障。感谢我的父母在万里之外对我的关怀,你们的鼓励也是我完成论文的最大动力。四年时间转瞬即过,回首往事感慨万千。本科阶段只是我追求的开始,在以后的日子里我会更加勤奋的学习、工作,努力去征服一个个的困难,实现我人生的梦想。还有很多我无法一一列举姓名的师长和友人给了我指导和帮助,在此衷心的表示感谢,他们的名字我一直铭记在心!最后,衷心感谢在百忙之中抽出时间审阅本论文的专家教授。
通信原理仿真实验系统设计与实现附 录本论文中涉及的所有Matlab程序:%计算散信源平均信息量message.mfunction r=message(x,n)r=0;for i=1:nr=r-x(i)*log(x(i))/log(2);enddisp('此离散信息源的平均信息量为');r %直接在命令窗口中调用message函数,也可以在其他函数中调用
%调用例子hmessage.mx=[0.25,0.25,0.25,0.25];f1=rand(4,4);hf1=hmessage(x,f1,4,4); %求平均信息量hf1=1hx=message(x,4); %此散信息源的平均信息量为hx=2c1=hx-hf1;disp('信道1的容量为')c1%信道1的信道容量为:c1=1%对第二个信道f2=rand(4,8);hf2=hmessage(x,f2,4,8); %平均互信息量为hf2=1.5000hx=message(x,4); %平均信息量为hx=2c2=hx-hf2; %信道的容量为:c2=0.5000disp('信道2的容量为')abs(c2)
其中huffman.m函数如下:%.哈夫曼编码huffman.mfunction [h,l]=huffman(p);if length(find(p<0))~=0, %判断输入是否概率分布 error('Input is not a prob.vector,there is negative component')endif abs(sum(p)-1)>10e-10 error('Input is not a prob.vector,the sum of the components is not equal to 1.')endn=length(p); %将输入的概率元素个数q=p;for i=1:n-1[q,l]=sort(q); %将输入的概率元素排序m(i,: )=[l(1:n-i+1),zeros(1,i-1)]; q=[q(1)+q(2),q(3:n),1];endfor i=1:n-1c(i,: )=blanks(n*n);end c(n-1,n)='0'; c(n-1,2*n)='1';for i=2:n-1 c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))-(n-2):n*(find(m(n-i+1,:)==1)));c(n-i,n)='0'; c(n-i,n+1:2*n-1)=c(n-i,1:n-1);c(n-i,2*n)='1';for j=1:i-1 c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(m(n-i+1,: )==j+1)-1)+1:n*find(m(n-i+1, : )==j+1));end; endfor i=1:nh(i,1:n)=c(1,n*(find(m(1,: )==i)-1)+1:find(m(1,: )==i)*n);ll(i)=length(find(abs(h(i, : ))~=32));endl=sum(p.*ll);
%常规双边带调幅amodulate.mecho ondf=0.2; %频度分辩力t0=0.5; %定义t0信号的持续时间的值tz=0.001; %定义抽样时间fz=1/tz;fa=50; %定义载波频率snr=10; %定义信噪比,用DB表示snr_lin=10^(snr/10); %信噪比数值a=0.8; %定义调拷制系数t=[0:tz:t0]; %定义抽样点数据%定义信号mm=zeros(1,501);for i=1:1:125, m(i)= i; end;for i=126:1:375, m(i)=m(125)-i+125; end;for i=376:1:501, m(i)=m(375)-i-375; end;m=m/1000;;c=cos(2*pi*fa.*t); %载波信号m_n=m/max(abs(m));[M,m,df1]=fftseq(m,tz,df); %付里叶变换,fftseq函数的程序段见后M=M/fz; %频率缩放,便于做图f=[0:df1:df1*(length(m)-1)]-fz/2; %定义频率向量u=(1+a*m_n).*c; %将调质信号调颀在载波信号上 [U,u,df1]=fftseq(u,tz,df); %对以调信号做付里叶变换U=U/fz; %h频率缩放signal_power=ampower(u(1:length(t))); %计算信号的功率,ampower程序见后pmn=ampower(m(1:length(t)))/(max(abs(m)))^2; %计算调制信号的功率eta=(a^2*pmn)/(1+a^2*pmn); %计算调制效率noise_power=eta*signal_power/snr_lin; %计算噪声功率noise_std=sqrt(noise_power); %噪声标准差noise=noise_std*randn(1,length(u)); %产生高斯分布噪声r=u+noise; %总 接收信号[R,r,df1]=fftseq(r,tz,df); %对总信号进行付里叶变换R=R/fz; %频率缩放%以下为结果显示signal_power % 显示信号功率eta %显示调制效率clfsubplot(7,2,1)plot(t,m(1:length(t))) %做出调制信号的曲线www.lwfree.cntitle('the modulated signal'); subplot(7,2,3)plot(t,c(1:length(t))) %做出载波的曲线axis=([0 0.15 -2.1 2.1]); xlabel('Time')title('The carrier'); subplot(7,1,3)plot(f,abs(fftshift(M))) %作出频域的调制信号xlabel('Frequency'); title('Spectrum of the message signal')subplot(7,1,4)plot(f,abs(fftshift(U))) %作出频域的以调信号title('Spectrum of the modulated signal'); xlabel('Frequency')subplot(7,1,5)plot(t,noise(1:length(t))) %作出噪声曲线title('noise sample'); xlabel('Time')subplot(7,1,6)plot(t,r(1:length(t))) %做出总信号的时域曲线title('signal and noise'); xlabel('title')
通信原理仿真实验系统设计与实现subplot(7,1,7)plot(f,abs(fftshift(R))) %作出频域总信号曲线title('Signal and noise spectrum'); xlabel('Frequency')
%.抑制双边代调制clear echo on t0=2; %信号持续时间ts=0.001; %抽样时间间隔fc=100; %载波频率fs=1/ts;df=0.3; %频率分辨力t=[-t0/2:ts:t0/2]; %定义时间序列%以下三句为定义信号序列x=sin(200*t);m=x./(200*t);m(1001)=1; %避免产生无穷大的值c=cos(2*pi*fc.*t); %载波u=m.*c; %抑制载波调制[M,m,df1]=fftseq(m,ts,df); %付里叶变换M=M/fs; [U,u,df1]=fftseq(m,ts,df);U=U/fs; %频率压缩f=[0:df1:df1*(length(m)-1)]-fs/2;%pauseclfsubplot(4,2,1)plot(t,m(1:length(t))) %作出为调信号的波形axis([-0.4,0.4,-0.5,1.1])xlabel('时间'); title('未调信号')subplot(4,2,3)plot(t,c(1:length(t)))axis([-0.1,0.1,-1.5,1.5]);xlabel('时间') title('载波'); subplot(4,2,2)plot(t,u(1:length(t)))axis([-0.2,0.2,-1,1.2]);xlabel('时间') title('已调信号'); subplot(4,1,3)plot(f,abs(fftshift(M)))xlabel('频率'); title('未调信号的频谱')subplot(4,1,4)plot(f,abs(fftshift(U)))title('已调信号的频谱'); xlabel('频率')
%单边带调制 ssb.mclearecho on t0=2;%信号持续时间ts=0.001;%抽样时间fc=100;%载波频率fs=1/ts; df=0.3; %频率分辩力t=[-t0/2:ts:t0/2];%以下四句定义信号序列x=sin(200*t); m=x./(200*t);m(1001)=1; m=m.*m;c=cos(2*pi*fc.*t);%定义载波同向分量b=sin(2*pi*fc.*t);%定义载波正交分量v=m.*c+imag(hilbert(m)).*b;%计算出下边带调幅分量u=m.*c-imag(hilbert(m)).*b;%计算出上边带调幅分量[M,m,df1]=fftseq(m,ts,df);%付里叶变换M=M/fs;[U,u,df1]=fftseq(u,ts,df); U=U/fs;[V,v,df1]=fftseq(v,ts,df);V=V/fs;f=[0:df1:df1*(length(m)-1)]-fs/2; clfsubplot(5,2,1)plot(t,m(1:length(t))); axis([-0.1,0.1,-0.5,1.1])xlabel('时间'); title('未调信号')subplot(5,2,2)plot(t,c(1:length(t))); axis([-0.1,0.1,-1.5,1.5])xlabel('时间'); title('载波')subplot(5,2,3)plot(t,u(1:length(t))); axis([-0.2,0.2,-1,1.2]); xlabel('时间');title('上边带已调信号')subplot(5,2,4)plot(t,v(1:length(t)))axis([-0.2,0.2,-1,1.2]); xlabel('时间')title('下边带已调信号'); subplot(5,1,3); plot(f,abs(fftshift(M)))xlabel('频率'); title('未调信号的频谱')subplot(5,1,4)plot(f,abs(fftshift(U)))title('上边带已调信号的频谱'); xlabel('频率');subplot(5,1,5); plot(f,abs(fftshift(V)))title('下边带已调信号的频谱'); xlabel('频率')
%频率调制echo ont0=0.15; %信号持续时间tz=0.0005; %抽样频率fc=200; %载波频率kf=50; %调制系数fz=1/tz;t=[0:tz:t0]; %定义时间序列df=0.25;%定义信号序列m=[ones(1,t0/(3*tz)),-2*ones(1,t0/(3*tz)),zeros(1,t0/(3*tz)+1)];int_m(1)=0; %对M积分,以便后面的调频for i=1:length(t)-1 int_m(i+1)=int_m(i)+m(i)*tz;end [M,m,df1]=fftseq(m,tz,df);M=M/fz;f=[0:df1:df1*(length(m)-1)]-fz/2;u=cos(2*pi*fc*t+2*pi*kf*int_m); %调制信号调制在载波上[U,u,df1]=fftseq(u,tz,df);U=U/fz; %pause; subplot(4,1,1)plot(t,m(1:length(t))) %作出信号波形axis=([0 0.15 -2.1 2.1]); xlabel('时间')title('未调信号'); subplot(4,1,2)plot(t,u(1:length(t))) %作出调频信号波形axis=([0 0.15 -2.1 2.1]); xlabel('时间')title('调频信号'); % pausesubplot(4,1,3)plot(f,abs(fftshift(M))) %作出原信号频谱xlabel('频率'); title('信号的频谱')subplot(4,1,4)plot(f,abs(fftshift(U))) %作出调频信号频谱
通信原理仿真实验系统设计与实现title('调频信号的频谱'); xlabel('频率')
%相位调制clearecho ont0=0.25; %抽样持续时间tz=0.0005; %抽样周期fc=200; %载波频率kf=50;fz=1/tz; %抽样频率t=[0:tz:t0]; %抽样序列df=0.25;%定义序号序列m=zeros(1,501);for i=1:1:125 %前125个点值为对应标号 m(i)=i;endfor i=126:1:375 %最后125点值又用另一条直线方程 m(i)=m(125)-i+125;endfor i=376:1:501 m(i)=m(375)+i-375;endm=m/50; %将信号值 幅度变至要求[M,m,df1]=fftseq(m,tz,df);M=M/fz;f=[0:df1:df1*(length(m)-1)]-fz/2;for i=1:length(t) %便于进行相位调制和作图 mn(i)=m(i);endu=cos(2*pi*fc*t+mn); %相位调制[U,u,df1]=fftseq(u,tz,df);%付里叶变换U=U/fz; %频率压缩subplot(4,1,1)plot(t,m(1:length(t)))axis([0 0.25 -3 3]); xlabel('时间')title('信号波形'); subplot(4,1,2)plot(t,u(1:length(t)))axis([0 0.15 -2.1 2.1]); xlabel('时间')title('调制信号的时域波形'); subplot(4,1,3)plot(f,abs(fftshift(M)))xlabel('频率'); title('信号频谱')subplot(4,1,4)plot(f,abs(fftshift(U)))title('调相信号的频谱'); xlabel('频率')
%低通抽样定理lowpsample.mcleart0=10; %定义时间长度ts=0.001; %抽样周期ts1=0.01; %欠抽样周期ts2=0.005 %正确抽样周期fs=1/ts; fs1=1/ts1; fs2=1/ts2;df=0.5 %定义频率分辩力t=[-t0/2:ts:t0/2]; %定义时间序列%定义抽样函数的平方,即信号序列x=sin(200*t); m=x./(200*t);w=t0/(2*ts)+1; %确定t=0的点m(w)=1; %令t=0点的信号值为1m=m.*m; m=50.*m;[M,mn,dfy]=fftseq(m,ts,df);M=M/fs;f=[0: dfy: dfy*length(mn)-dfy]-fs/2; %定义频率序列%pause; subplot(2,1,1); plot(t,m);xlabel('时间'); title('原信号的波形')axis([-0.15, 0.15, -1, 50]); subplot(2,1,2)plot(f,abs(fftshift(M))) %作出原信号频谱xlabel('频率'); axis([-500,500,0,1]);title('原信号的频谱fh约为64HZ')%***********以上为被抽样信号t0=10; %定义时间长度ts=0.001; %抽样周期ts1=0.01; %欠抽样周期ts2=0.005 %正确抽样周期fs=1/ts; fs1=1/ts1; fs2=1/ts2;df=0.5 %定义频率分辩力%以下为抽样频率f1<2fH的欠抽样t1=[-t0/2:ts1:t0/2]; %定义抽样时间序列x1=sin(200*t1); %计算对应抽样序列的信号序列m1=x1./(200*t1); %计算函数序列w1=t0/(2*ts1)+1; %由于除0产生错误值,计算该值的标号m1(w1)=1; %将错误值修正m1=m1.*m1; m1=50.*m1;[M1,mn1,df1]=fftseq(m1,ts1,df); %对抽样序列进行付里叶变换M1=M1/fs1;N1=[M1,M1,M1,M1,M1,M1,M1,M1,M1,M1,M1,M1,M1];f1=[-7*df1*length(mn1):df1:6*df1*length(mn1)-df1]-fs1/2;%pause;subplot(2,1,1); stem(t1,m1);xlabel('时间'); title('抽样不足信号的波形')axis([-0.15,0.15,-1,50]);; subplot(2,1,2)plot(f1,abs(fftshift(N1)))title('抽样率不足的信号频谱 fs=100HZ<2fh')axis([-500,500,0,1]); xlabel('频率')t0=10; %定义时间长度ts=0.001; %抽样周期ts1=0.01; %欠抽样周期ts2=0.005 %正确抽样周期fs=1/ts; fs1=1/ts1; fs2=1/ts2;df=0.5 %定义频率分辩力%以下成功的抽样,并通过低通滤波器来恢复信号的频谱t2=[-t0/2:ts2:t0/2]; %定义抽样时间序列x2=sin(200*t2); %计算对应时间序列的信号序列m2=x2./(200*t2); %计算Sinc函数序列w2=t0/(2*ts2)+1; %计算除0产生的错误点m2(w2)=1; %修正该错误值m2=m2.*m2; m2=50.*m2;[M2,mn2,df2]=fftseq(m2,ts2,df); %对抽样序列进行付里叶变换M2=M2/fs2;N2=[M2,M2,M2,M2,M2,M2,M2,M2,M2,M2,M2,M2,M2];f2=[-7*df2*length(mn2):df2:6*df2*length(mn2)-df2]-fs2/2;%pause;subplot(2,1,1); stem(t2,m2);xlabel('时间'); title('抽样满足信号的波形')axis([-0.15,0.15,-1,50]);; subplot(2,1,2)plot(f2,abs(fftshift(N2)))title('达到抽样最低频率抽样信号频谱 fs=200HZ>2fh')axis([-500,500,0,1]); xlabel('频率')
%带通抽样定理bandpsample.mclear
通信原理仿真实验系统设计与实现t0=10; %时间序列长度ts=0.001; %画出原信号采用的抽样周期,注意不是题中的抽样周期ts1=0.1; %欠抽样时的周期ts2=0.05; %抽样条件满足fs=1/ts;fs1=1/ts1;fs2=1/ts2;df=0.5;t=[-t0/2:ts:t0/2]; %计算序列第一步x=sin(20*t);m=x./t; %计算出sinc函数w=t0/(2*ts)+1; %计算错误值标号m(w)=20; %修正错误值m=m.*cos(100*t); %频谱搬移[M,mn,dfy]=fftseq(m,ts,df); M=M/fs;f=[0:dfy:dfy*length(mn)-dfy]-fs/2;%pause; subplot(2,1,1) plot(f,abs(fftshift(M)))axis([-50,50,0,3]); title('原信号的频谱')t1=[-t0/2:ts1:t0/2]; %抽样不足的信号序列x1=sin(20*t1);m1=x1./t1; %计算出sinc函数w1=t0/(2*ts1)+1; %计算错误值标号m1(w1)=20; %修正错误值m1=m1.*cos(100*t1); %频谱搬移[M1,mn1,df1]=fftseq(m1,ts1,df); M1=M1/fs1;N1=[M1,M1,M1,M1,M1,M1,M1,M1,M1,M1,M1,M1,M1];f1=[-7*df1*length(mn1):df1:6*df1*length(mn1)-df1]-fs1/2;subplot(2,2,3); plot(f1,abs(fftshift(N1)))title('不满足抽样要求'); axis([-50,50,0,5]);t2=[-t0/2:ts2:t0/2]; %满足抽样要求的时间序列x2=sin(20*t2);m2=x2./t2; %计算出sinc函数w2=t0/(2*ts2)+1; %计算错误值标号m2(w2)=20; %修正错误值m2=m2.*cos(100*t2); %频谱搬移[M2,mn2,df2]=fftseq(m2,ts2,df); M2=M2/fs2;N2=[M2,M2,M2,M2,M2,M2,M2,M2,M2,M2,M2,M2,M2];f2=[-7*df2*length(mn2):df2:6*df2*length(mn2)-df2]-fs2/2;subplot(2,2,4); plot(f2,abs(fftshift(N2)))title('满足抽样要求'); axis([-50,50,0,3]);xlabel('频率')
%单极性非归零码 snrz.mfunction y=snrz(x)%本函数实现将输入的一段代二进制代码编为相应的单极性非归零码输出%输入X为二进制码,输出Y为编好的码%给出计算每一个码元的点数,因为我们只有用离散的点来得出连续的函数表示grid=300;t=0:1/grid:length(x); %给出相应的时间序列for i=1:length(x) %计算码元的值 if(x(i)==1) %若输入信息为1 for j=1:grid, %该码元对应的点值取1 y((i-1)*grid+j)=1; end else for j=1:grid, %反之信息为0,码元对应点值取0 y((i-1)*grid+j)=0; end; end; endy=[y,x(i)]; %给序列Y加上最的一位,便于做图M=max(y); m=min(y);subplot(2,1,1);plot(t,y);axis([0,i,m-0.1,M+0.1]);title('1 0 0 1 1 0 0 0 0 1 0 1');%单极性归零码 srz.mfunction y=srz(x)%本函数实现将输入的一段代二进制代码编为相应的单极性归零码输出%输入X为二进制码,输出Y为编好的码grid=200;t=0:1/grid:length(x); %给出相应的时间序列for i=1:length(x) %进行码型变换 if(x(i)==1) %若输入信息为1 for j=1:grid/2 y(grid/2*(2*i-2)+j)=1; %定义前半时间值为1 y(grid/2*(2*i-1)+j)=0; %定义后半时间值为0 end else for j=1:grid/2 %反之,输入信息为○ y(grid*(i-1)+j)=0; %定义所有时间值为○ end; end; endy=[y,x(i)]; %给序列Y加上最的一位,便于做图M=max(y); m=min(y);plot(t,y);axis([0,i,m-0.1,M+0.1]);title('1 0 0 1 1 0 0 0 0 1 0 1');
%双极性非归零码 dnrz.mfunction y=snrz(x)%本函数实现将输入的一段代二进制代码编为相应的双极性非归零码输出%输入X为二进制码,输出Y为编好的码%给出计算每一个码元的点数,因为我们只有用离散的点来得出连续的函数表示grid=300;t=0:1/grid:length(x); %给出相应的时间序列for i=1:length(x) %计算码元的值 if(x(i)==1) %若输入信息为1 for j=1:grid, %该码元对应的点值取1 y((i-1)*grid+j)=1; end else for j=1:grid, %反之信息为0,码元对应点值取0 y((i-1)*grid+j)=-1; end; end; endy=[y,x(i)]; %给序列Y加上最的一位,便于做图M=max(y); m=min(y);subplot(2,1,1);plot(t,y);axis([0,i,m-0.1,M+0.1]);title('1 0 0 1 1 0 0 0 0 1 0 1');
%双极性归零码 drz.mfunction y=drz(x)%本函数实现将输入的一段代二进制代码编为相应的双极性归零码输出%输入X为二进制码,输出Y为编好的码%给出计算每一个码元的点数,因为我们只有用离散的点来得出连续的函数表示grid=300;t=0:1/grid:length(x); %给出相应的时间序列for i=1:length(x) %计算码元的值 if(x(i)==1) %若输入信息为1 for j=1:grid/2
通信原理仿真实验系统设计与实现 y(grid/2*(2*i-2)+j)=1; %定义前半时间为1 y(grid/2*(2*i-1)+j)=0;%定义后半时间为0 end else for j=1:grid/2 y(grid/2*(2*i-2)+j)=-1; y(grid/2*(2*i-1)+j)=0; end; end; endy=[y,x(i)]; %给序列Y加上最的一位,便于做图M=max(y); m=min(y);plot(t,y);axis([0,i,m-0.1,M+0.1]);title('1 0 0 1 1 0 0 0 0 1 0 1');
%密勒码 miler.mfunction y=miler(x)%本函数实现将输入的一段代二进制代码编为相应的密勒码输出%输入X为二进制码,输出Y为编好的码%给出计算每一个码元的点数,因为我们只有用离散的点来得出连续的函数表示grid=100;t=0:1/grid:length(x); %给出相应的时间序列i=1 %因为这里是直接对一段二进制数编码if(x(i)==1) %前面的值不定,所以第一值我们单独给出 for j=1:grid/2 %若第一个信息为1 y(grid/2*(2*i-2)+j)=0; %定义前半时间为0 y(grid/2*(2*i-1)+j)=1;%定义后半时间为1 end else for j=1:grid %反之,输入信息为0 y(grid*(i-1)+j)=0; %所有时间为0 endendfor i=2:length(x) %从第二个信息起编码与前面的码元有关系 if(x(i)==1) for j=1:grid/2 %前半时间与前一码元后半时间值相同 y(grid/2*(2*i-2)+j)=y(grid/2*(2*i-3)+grid/4); %后半时间值 与本码元间半时间值相反 y(grid/2*(2*i-1)+j)=1-y(grid/2*(2*i-2)+j); end else if(x(i-1)==1) %输入为0,若前一信息为1 for j=1:grid %所有时间与前一码元后半时间值相同 y(grid*(i-1)+j)=y(grid/2*(2*i-3)+grid/4); end else %否则前一信息为0 for j=1:grid %所有时间值与前一码元后半时间值相反 y(grid*(i-1)+j)=1-y(grid/2*(2*i-3)+grid/4); end; end; end; endy=[y,y(i*grid)]; M=max(y); m=min(y);plot(t,y);axis([0,i,m-0.1,M+0.1]);title('1 0 0 1 1 0 0 0 0 1 0 1');
%曼彻斯特码(数字双相码)macheser.mfunction y=macheser(x)%本函数实现将输入的一段代二进制代码编为相应的数字双相码输出%输入X为二进制码,输出Y为编好的码%给出计算每一个码元的点数,因为我们只有用离散的点来得出连续的函数表示grid=300;t=0:1/grid:length(x); %给出相应的时间序列for i=1:length(x) %计算码元的值 if(x(i)==1) %若输入信息为1 for j=1:grid/2 y(grid/2*(2*i-2)+j)=1; %定义前半时间为1 y(grid/2*(2*i-1)+j)=0;%定义后半时间为0 end else for j=1:grid/2 y(grid/2*(2*i-2)+j)=1; y(grid/2*(2*i-1)+j)=0; end; end; endy=[y,x(i)]; %给序列Y加上最的一位,便于做图M=max(y); m=min(y);plot(t,y);axis([0,i,m-0.1,M+0.1]);title('1 0 0 1 1 0 0 0 0 1 0 1');
%条件双相码 dmachester.mfunction y=dmachester(x)%本函数实现将输入的一段代二进制代码编为相应的条件双相码输出%输入X为二进制码,输出Y为编好的码%给出计算每一个码元的点数,因为我们只有用离散的点来得出连续的函数表示grid=100;t=0:1/grid:length(x); %给出相应的时间序列i=1 %因为这里是直接对一段二进制数编码if(x(i)==1) %前面的值不定,所以第一值我们单独给出 for j=1:grid/2 %若第一个信息为1 y(grid/2*(2*i-2)+j)=0; %定义前半时间为1 y(grid/2*(2*i-1)+j)=1;%定义后半时间为0 end else for j=1:grid/2 %反之,输入信息为0 y(grid/2*(2*i-2)+j)=1; y(grid/2*(2*i-1)+j)=0; endendfor i=2:length(x) %从第二个信息起编码与前面的码元有关系 if(x(i)==1) for j=1:grid/2 %前半时间与前一码元后半时间值相反 y(grid/2*(2*i-2)+j)=1-y(grid/2*(2*i-3)+grid/4); %后半时间值 与本码元间半时间值相反 y(grid/2*(2*i-1)+j)=1-y(grid/2*(2*i-2)+j); end else for j=1:grid/2 %输入为0时 %前半时间与前一码元后半时间值相同 y(grid/2*(2*i-2)+j)=y(grid/2*(2*i-3)+grid/4); %后半时间值与本码元间半时间值相反 y(grid/2*(2*i-1)+j)=1-y(grid/2*(2*i-2)+j); end; end; endy=[y,y(i*grid)]; M=max(y); m=min(y);plot(t,y);axis([0,i,m-0.1,M+0.1]);title('1 0 0 1 1 0 0 0 0 1 0 1');
%对二元序列10110010画出幅度键控2ASK的波形t=0:0.01:8;y=sin(2*pi*t); %载波x=[ones(1,100),zeros(1,100),ones(1,100),ones(1,100), zeros(1,100),zeros(1,100),ones(1,100),zeros(1,101)];%定义一个与二元序列对应的时间序列
通信原理仿真实验系统设计与实现z=x.*y; %幅频键控plot(t,z)%对二元序列10110010画出2FSK(移频銉控)的波形x=0:0.01:8;t=[ones(1,100),zeros(1,100),ones(1,100),ones(1,100),zeros(1,100),zeros(1,100),ones(1,100),zeros(1,101)];y=sin(x.*(2*pi+2*t));plot(x,y)
%PSK包络的绘制pskbaoluo.mecho onT=1; M=8; Es=T/2; fc=6/T;N=120; delta_T=T/(N-1); t=0:delta_T:T;u0=sqrt(2*Es/T)*cos(2*pi*fc*t);u1=sqrt(2*Es/T)*cos(2*pi*fc*t+2*pi/M);%求出八个波形u2=sqrt(2*Es/T)*cos(2*pi*fc*t+4*pi/M);u3=sqrt(2*Es/T)*cos(2*pi*fc*t+6*pi/M);u4=sqrt(2*Es/T)*cos(2*pi*fc*t+8*pi/M);u5=sqrt(2*Es/T)*cos(2*pi*fc*t+10*pi/M);u6=sqrt(2*Es/T)*cos(2*pi*fc*t+12*pi/M);u7=sqrt(2*Es/T)*cos(2*pi*fc*t+14*pi/M);subplot(8,1,1); plot(t,u0);subplot(8,1,2); plot(t,u1);subplot(8,1,3); plot(t,u2);subplot(8,1,4); plot(t,u3);subplot(8,1,5); plot(t,u4);subplot(8,1,6); plot(t,u5);subplot(8,1,7); plot(t,u6);subplot(8,1,8); plot(t,u7);%函数文件pskmoto.m进行蒙特卡洛仿真function[pb,ps]=pskmoto(snr_in_dB)%pskmoto求出以dB为单位的给定信噪比的比特误码率和符号误码率N=1000;E=1;snr=10^(snr_in_dB/10);sgma=sqrt(E/snr)/2;%信号映射n=[0 0];s00=[1 0]; s01=[0 1];s11=[-1 0]; s10=[0 -1];for i=1:N, temp=rand; %区间(0,1)的一个均匀随机变量 if(temp<0.25), %信源输出为00的概率为1/4 dsource1(i)=0; dsource2(i)=0; elseif(temp<0.5) dsource1(i)=0; dsource2(i)=1; elseif(temp<0.75) dsource1(i)=1; dsource2(i)=0; else dsource1(i)=1; dsource2(i)=1; end;end;%判决,误码率的计算numofsymbolerror=0; numofbiterror=0;for i=1:N, %在判决器的接收端的信号,对于第i个符号为: n=gngauss(sgma); if((dsource1(i)==0)&(dsource2(i)==0)), r=s00+n; elseif((dsource1(i)==0)&(dsource2(i)==1)), r=s01+n; if((dsource1(i)==1)&(dsource2(i)==0)), r=s10+n; else r=s11+n; end; %以下为计算互相关量度 c00=dot(r,s00); c01=dot(r,s01); c10=dot(r,s10); c11=dot(r,s11); %第i个符号的判决如下进行 c_max=max([c00 c01 c10 c11]); if(c00==c_max), decis1=0; decis2=0; elseif(c01==c_max), decis1=0; decis2=1; elseif(c10==c_max), decis1=1; decis2=0; else decis1=1; decis2=1; end; %若判决不对,计错器数加1 symbolerror=0; if(decis1~=dsource1(i)), numofbiterror=numofbiterror+1; symbolerror=1; end; if(decis2~=dsource1(i)), numofbiterror=numofbiterror+1; symbolerror=1; end; if(symbolerror==1), numofsymbolerror=numofsymbolerror+1; %误比特率数加1 end;end;ps=numofsymbolerror/N; %总共发出N个符号pb=numofbiterror/(2*N);end%PSK系统的实现pskmotocalo.mecho on SNRindB1=0:2:10; %定义信噪比序列,共六个值SNRindB2=0:0.1:10; %扫描用的信噪比序列,采用DB作单位for i=1:length(SNRindB1), [pb,ps]=pskmoto(SNRindB1(i)); %计算误比特率 smld_bit_err_prb(i)=pb; smld_symbol_err_prb(i)=ps;end;for i=1:length(SNRindB2) SNR=exp(SNRindB2(i)*log(10)/10); %转化信噪比为数值表示 theo_err_prb(i)=Qfunct(sqrt(2*SNR));end;semilogy(SNRindB1,smld_bit_err_prb,'*'); %以对数形式作Y坐标绘图holdsemilogy(SNRindB1,smld_symbol_err_prb,'o');%作出实际的信噪比semilogy(SNRindB2,theo_err_prb); %作出理论信噪比%函数文件qammoto.mfunction[p]=qammoto(snr_in_dB)N=1000;d=1;Eav=10*d^2;snr=10^(snr_in_dB/10);sgma=sqrt(Eav/(8*snr));M=16;for i=1:N temp=rand; dsource(i)=1+floor(M*temp);end;
通信原理仿真实验系统设计与实现mapping=[-3*d 3*d; -d 3*d; d 3*d; 3*d 3*d; -3*d d; -d d; d d; 3*d d; -3*d -d; -d -d; d -d;3*d -d; -3*d -3*d; -d -3*d; d -3*d; 3*d -3*d];for i=1:N qam_sig(i,: )=mapping(dsource(i),: );end;for i=1:N, n=gngauss(sgma); %产生高斯随机噪声 r(i,: )=qam_sig(i,: )+n;%在信号上參加噪声end;numoferr=0; %误比特数初始值置为0for i=1:N, for j=1:M, metrics(j)=(r(i,1)-mapping(j,1))^2+(r(i,2)-mapping(j,2))^2; end; [min_metric decis]=min(metrics); if(decis~=dsource(i)), %若出现错的情况,误比特数加一 numoferr=numoferr+1; end;end;p=numoferr/(N);
%qammotocalo.mecho onSNRindB1=0:2:15; SNRindB2=0:0.1:15;M=16; k=log2(M);for i=1:length(SNRindB1), smld_err_prb(i)=qammoto(SNRindB1(i));end;for i=1:length(SNRindB2), SNR=exp(SNRindB2(i)*log(10)/10); theo_err_prb(i)=4*Qfunct(sqrt(3*k*SNR/(M-1)));end;semilogy(SNRindB1,smld_err_prb,'*'); %用对数坐标做出实际信噪比holdsemilogy(SNRindB2,theo_err_prb); %画出理论信噪比%函数文件gugauss.m产生高斯分布的随机函数function grsv=gngauss(m,sgma)
if(nargin==0), m=0; sgma=1;elseif nargin==1 sgma=m; m=0;end;u=rand;z=sgma*(sqrt(2*log(1/(1-u)))); %利用上面的U产生一个瑞利公布随机数u=rand;grsv(1)=m+z*cos(2*pi*u); grsv(2)=m+z*sin(2*pi*u);%函数文件Qfunct.m用于求出理论误码率function[y]=Qfunct(x)y=(1/2)*erfc(x/sqrt(2));