关键字:Matlab 信道 编码 译码 Simulink
目 录
摘要 I
Abstract II
绪论 1
1 信道编码 3
1.1信道编码的概念及分类 3
1.2 信道编码及各种码类的简介 3
1.2.2 循环码 4
1.2.3卷积码 4
2 MATLAB简介 6
2.1 MATLAB 6
2.2 Simulink简介 6
3 汉明码 8
3.1 汉明码编码原理 8
3.2 汉明码对高斯白噪声信道编码及仿真 9
4 循环码 12
4.1 循环码编译码原理 12
4.1.1 编码原理 12
4.1.2 译码原理 13
4.1.3 循环码的检错与纠错 13
4.2 循环码编译码及仿真 14
5 卷积码 17
5.1卷积码及其维特比译码原理 17
5.2卷积码仿真 19
5.2.1 维比特译码器仿真 19
5.2.2 简化后的维特比译码器仿真 25
结论 27
参考文献 29
附录一 汉明码仿真代码 30
附录二 (7,4)循环码仿真代码 33
附录三 (3,2)循环码仿真代码 34
绪论
现如今,随着无线通信技术的快速发展,数字信号技术发展迅速,它已渐渐将模拟信号取代成为了主流的传输信号类型,其优点有数字通信保密性高、抗干扰性能强、调制信号容易等。数字信号在信道的传输过程中,信道的特性过于复杂,主要体现在实际信道的传输特性不理想、噪声干扰等,当经过调制的信号进入信道传输时由于信道的影响在接收端容易产生误码。
为了提高数字通信过程中的可靠性,就必须合理设计系统的发送和接收滤波器,采取均衡技术,消除数字系统中码间干扰的影响,还可选择合适的调制解调技术,增加发射机功率,采用先进的天线技术等。若数字信号的误码仍不能满足要求,则可以采用信道编码技术,进而降低误码率。
在通信系统设计的历程中,系统仿真发展有着非常重要的作用。这都要归功于系统仿真灵活性好、适应性广等特点。通过系统仿真可以将复杂的系统变为简单的子系统来进行分析研究。本课题目标是以Matlab及其仿真工具包Simulink对通信系统信道编码方式进行仿真分析。
在1948年的时候,香农发表了《通信的数字理论》文章,也是从那时开始,信道编码技术的研究方向渐渐得以明确,使研究者能更加深入进行设计研究。
在之后近50年的发展历程中,各种新的信道编码技术及方案被研究人员研究开发出来。例如汉明码,Reed-Muller,Golay码等几类码是属于分组码,使用的是AWGN信道,只能针对随机错误进行编码,而不能纠错突发错误,也就是不能用于衰减信道的编码。1959年Bose和Chaudhuri共同提出一类循环码中的BCH码[1],而这种BCH码良好的编码增益一种被研究者看好,也是因此它被沿用至今日。1960年RS码被Reed和Solomon两位提出,相对于早期的编码技术来说,它具有良好的频带有效性,所以被广泛应用于卫星通信信道中。在1955年科学家Elias提出了一种全新的编码方式(卷积编码),Wozencraft和Reiffen提出了序列译码,它是一种有效的译码方法,在1963年由Massey提出了门译码方法,虽然这种方法的性能较差,但它的实用性还是不错的[16]。1967年Viterbi提出最大似然译码方法,对于存储级数较小的卷积码易于实现,因此它广泛应用于现代通信中[2] 。1993年,C.Barrou发表的Turbo论文中提出了Turbo码,
给出了Turbo码结构及在BPSK下其性能几乎达到了香农限,1995年Mackay和Neal发现低密度效验码的优越性之后,非常多的研究者都将注意力放在了LDPC码上,并将其作为未来高速宽带移动通信系统中的信道编码的主要备选方案之一[3]。
在实际的应用开发中,通信系统的优劣主要体现在有效性和可靠性这两个重要的方面,它们也是通信技术设计中非常重要的部分。
数字通信系统中由于信道在传输特性不理想及加噪声等易于造成码间串扰,功率和多径传播等导致错误译码,一般采用信道编码来确保系统的误比特率指标。
众所周知纠错编码技术在数字通信系统中起着很重要的作用,主要是用来提高通信的可靠性,所以从它出现到如今一直都是全世界通信领域研究的热点。从1950年开始这一方面的研究一直没有中断且非常活跃。在通信领域,由于计算机模拟技术的广泛实践应用,更加促进了纠错码技术的发展研究。
提高信息传输的可靠性和有效性一直是通信技术想要实现的目标,信道编码能够大大提升信息传输的可靠性,就让这一目标的实现容易了很多。在这个过程中,我们需要学习通信系统传输原理,建立起通信系统仿真的模型(编码、译码),学习如何使用仿真工具MATLAB。利用仿真工具MATLAB对通信系统信道编码(分组编码、冗余编码、卷积编码)仿真。通过仿真分析,从纠错能力,译码性能等方面分析研究各自的优缺点。
1信道编码
1.1 信道编码的概念及分类
信道编码是为了保证信息传输的可靠性、提高传输质量而设计的一种编码[4]。信道编码的基本思想是在被传输信号中附加一些冗余码元,我们称这些冗余码元为监督码元。监督码元和信号码元有一定的关系也可以说是规律,接收端可以利用监督码元与信号码元的这种关系对其进行效验,达到检测和纠正错误的目的,这种纠、检错能力是用编码的冗余度来换取的。
在编码之前信号是没有效验码或监督位的,传输过程中容易产生误码,所以说信道编码就需要给信息添加冗余度,使没有什么规律的原始数字信息转换成带有一定规律的数字信息。信道译码就是利用其规律来检验在传输过程中是否发生错误,进而达到纠正错误的目的。
1.2 信道编码及各种码类的简介
在二十世纪中期,在信源编码研究领域,通过香农得以证明:当信源输出的信息添加有监督位的情况下,就能通过编码方式达到改变信源的输出的目的,这样就使得信息传输速率非常接近信道容量。
图1-1 采用信道编码技术的数字通信系统
信道编码定理是在信息传输过程中,设r为其传输速率,c为离散信道的信达容量,是大于零的任意小的一个数,当r 1.2.1线性分组码 线性分组码从字面上可以理解为既是线性码也是分组码。由码的分类知道,监督码元仅与本组监督码元有关的码称为分组码,监督码元与信息码元之间的关系可以用线性方程表示的码称为线性码[5]。所以,在线性分组码中,一个码字中的监督码元只与这个码字中的信息码元相关,而且这种关系是使用线性方程来表示的。 线性分组码也是属于奇偶效验码,其形式是由(n,k)表示的。编码器将一个k比特信息分组转变为一个更长的由给定元素符号集组成的n比特编码分组。如果此元素符号集只是包含0和1两个元素的时候,与二进制相对,就被称为二进制编码[6]。 以长度为n的二进制分组码为例,可将其表示成(n,k)的形式,它一般情况用于前向纠错。在分组码中,监督位加到信息位之后就生成新的码,在编码过程中,k个信息位加入监督位形成n位长度,n-k为监督码的个数,用以实现检错和纠错[7]。 1.2.2循环码 循环码它是一种重要的线性分组码。如果线性分组码中的任一码字循环移位之后得到的码字在该码字集中仍然存在,那么就把这种线性分组码称为循环码。可以知道在循环码中两个码字之和还是该码字中的一个码字。 循环码是由其码字长度n及生成多项式g(x) 所决定。除去全零的码字外,循环码中次数最低的码字多项式称为生成的多项式[8]。循环码的生成多项式g(x)有以下三个特性: (1) g(x)是的一个因子。 (2) g(x)是r=n-k次多项式。 (3) g(x)的常数项为1. 1.2.3卷积码 卷积码是在线性码之后提出的,但是卷积码和线性分组码有很大不同,首先卷积码是属于非分组码的,它的所有(n,k)码字内的n个码元不仅与该码字内的信息码元有关,还与前面m个码字内的信息码元有关联。或者说,各子码内的监督码元不仅对本子码起监督作用,而且对前面m个子码内的信息码元也起着监督作用[10]。所以,卷积码通常用(n,k,m)表示。通常称m为编译存储,它反映了输入信息码元在编码器中需要存储时间长短;称N=m+1为编码约束度,它是相互约束的码字个数;称nN为编码约束长度,它是相互约束的码元个数。卷积码也有系统码和非系统码两种情况,如果其子码是系统码,则称这个卷积码为系统卷积码,反之,就是非系统卷积码。 2MATLAB简介 2.1MATLAB MATLAB是英文MATrix LABoratory缩写的意思,矩阵实验室是其中文翻译,它是一款商业数学软件。MATLAB是用于数据可视化、交互式环境和数据分析的高级技术计算语言和交互环境。MATLAB矩阵运算、实现算法,绘制函数和数据图像是其常用的功能,MATLAB也用来创建用户界面及与调用一些例如C,C++的语言编写的程序[12]。 MATLAB的基本数据单位是矩阵,与一般我们在数学等领域用到的表达式相比,它们及其相似,也是因此,相对于用C、C++等语言来解决运算问题,用MATLAB要比它们简单很多,使之成为一个非常强大的数学软件。还有一点就是它有很强的荣扩性,能直接调用其他语言编写的程序,将程序导入MATLAB函数库中就能很好的使用,也可以直接运行一些已经被编好的程序。 Matlab的特点: (1) 此高级语言可以用于技术计算 (2)此开发环境可对代码、文件及数据进行管理 (3)其内部的二维或三维图形函数一般用于可视化数据 (4) 交互式工具可以按迭代的方式探查、设计及求解问题 (5)其数学函数一般用于fft分析、线性代数、统计等功能 (6) 各种工具可用于构建自定义的图形用户界面 (7)各种函数可集成一些外部应用程序或语言,例如C、C++、Java等 2.2 Simulink简介 Simulink是可视化动态系统仿真环境,其拥有动态系统建模和仿真的功能。Simulink是MATLAB最重要的组件之一,其集成环境具有综合分析的能力[20]。在这个环境中,根本不用大量书写程序,仅仅通过简单操作,就能构造出复杂的系统,用于仿真分析等。 在MATLAB中,Simulink是的一种可视化仿真工具,是实现动态系统建模、仿真和分析的一个软件包,被广泛应用于线性和非线性系统、数字控制及数字信号处理的建模和仿真中[13]。. Simulink的优点: (1) 直接通过图形搭建模型,不需要编程,用户使用起来很方便。 (2) 具有结构和流程清晰,效率很高,灵活性强等优点; (3) 其扩展能力较强、移植性和开发性好 (4) 语言简洁,内容丰富 3汉明码 3.1汉明码编码原理 在电信领域,汉明码是一种线性调试码。当计算机进行存储或转移等操作时,其数据位上的信息很有可能会产生错误,这种情况发生时就需要利用汉明码来对其检测并纠错。汉明码是一个错误校验码码集,是Hamming发明,所以命名为汉明码。 汉明码也利用了奇偶校验位的概念,这一点与其他的错误校验码相似。通过在数据位之后添加加一定数量比特,就能达到验证数据的有效性的目的,这种方法非常实用。它是通过利用多余一个的校验位,来验证数据的有效性,以及在出错的情况下找到错误的位置,方便纠错。 在接受端纠错译码,通过自动纠正传输中的差错来实现码纠错功能,称为前向纠错FEC。FEC属于三种常用的差错控制方式中的一种,另外两种分别是检错重发(ARQ)以及混合纠错。而FEC的特点主要体现在其根本不需要反向信道而且实时性非常好。前向纠错码(FEC)的码字是具有一定纠错能力的码,它是自动纠错的,在接收端译码后,对其中错误的码进行自动纠错,不需人为操纵。汉明码就是利用奇偶块机制从而达到降低了前向纠错的成本的目的。 进行奇偶校验的方法:先计算数据中1的个数,然后通过增加一个0或1(称为校验位),使1的个数变为奇数就叫奇校验,变成偶数就叫偶校验。 汉明码是编码效率较高的线性分组码,解码方式简单、方便、有效。汉明码指某一种码这种说法不太正确,它其实而指一类码。当m=3,4,5,6,7,…时,分别有(7,4),(15,11),(31,26),(63,57),…汉明码。 下面以(7,4)hamming码为例,简单介绍其参数: 码长: 信息位: 效验位: (m大于等于3) 最小码距: 其生成矩阵G如下: (其中前四位是信息位,后三位是监督位) 此次也是利用(7,4)汉明码进行仿真,使用的是高斯白噪声信道,可以通过观察仿真结果观察其编译码性能的优缺点。 3.2汉明码对高斯白噪声信道编码及仿真 3.2.1 对仿真过程进行分析,确定编码过程中需要使用的函数,分放置在.m文件中。代码见附录一。 编译码程序是由一个主程序和6个子函数组成。Number.m为随机信号源函数,Hm74.m和Dehm74.m分别为汉明码编码和解码函数,Modd.m和Demod.m分别为调制和解调函数。Noise.m为产生高斯噪声函数,Exception.m文件中为业务控制函数,Main.m为主程序文件。 Number.m中随机信号源函数,rc=rand(k,1)中rand函数是产生在(0, 1)之间均匀分布的随机数组成的数组。这里是生成4乘1的矩阵。数组中的数大于等于0.5输出1,小于0,5输出0,就得到了信息矩阵。 Hm74.m中函数为汉明码编码过程,先将随机信息矩阵、信息位k、矩阵P传入函数,通过Y=eye(k)得到k*k的单位矩阵,后面的G=[Y,P']就得到相应的生成矩阵G,rem(ic*G,2)函数用来求两数的余数,因此就可以求出信息矩阵通过生成矩阵G后生成的码字,将生成码字赋给code。 Modd.m中Modd()函数其中传入Hm74函数求得的生成码字、信息位k、监督位r,将生成码字中的值放入循环中,根据条件输出对应的载波信号1和-1。 Noise.m中noise函数是传入的是信号的分贝值SNR、信息位k以及监督位r的值。函数中snr=10^(snr/10)就将对应的分贝转换成了对应的信噪比snr,再根据信息位与码长(信息位k加监督位r)之比得到编码效率,一般情况下,编码效率越高,传输效率越高,但纠错或是检错的能力会降低一些。根据对信噪比、编码效率进行运算,再加入一个1*k+r的矩阵,就得到了经过高斯白噪声信道之后的码字。 Demod.m中Demod()函数将已调信号中携带的信号恢复出来的过程。将载波信号1、-1转换为对应的1*7的0、1序列矩阵。 Dehm74.m中Dehm74()函数为汉明码译码过程。函数传入的数据有解调后的信息矩阵in,信息位k、监督位r、矩阵P的值,得到码长m,然后先是生成r*r的单位矩阵,再将其与矩阵P结合得监督矩阵H,通过rem(in*H,2)将信息矩阵in与H的转置矩阵相乘再取余得到输出的信息码S,利用H(:,n)取得监督矩阵H中第1列到第7列的数据赋给h。将循环得到的每一个h的转置与S做比较,当它们相等时跳出循环,得到此时的n值,将信号矩阵in的第n位上的数字做一次改变由0变为1,或者由1变0,就达到了纠错一位码字的功能。将修改后的k位信息码输出。 Example.m中定义了信号位k、监督位r的值,监督矩阵P,给出测试数据包的数量以及用来统计译码后错误码元的数量w的初始值0。通过调用随机信号源、编码译码、调制解调等函数得到译码后输出的信息码dhc,将其与随机信号函数得到的信息码ic进行比较,不相等的情况下w自增1,得打所以测试数据包检测完后的w。代码中通过BER=w/(N*k)就就将误码率求出来了。 Main.m为主程序文件,定义一个信噪比s变量,调用Example函数,run(运行)主程序输出信噪比和误码率的关系曲线图。 Main.m函数仿真结果如图3-1所示: 2 图3-1 误码率曲线图 观察图3-1中发现,汉明码的编码效率很好,在高斯白噪声信道中,当信噪比较小时,误码率略高,但当信噪比不断增大时,误码率随之越来越低了,理论上当信噪比非常大的时候,误码就会无限接近于0或等于0, 此设计代码完成了汉明码的编码和译码过程,令人遗憾的是,汉明码的编码效率虽好,但它是不能同时对7位码字进行两位纠错的,也就是说,只能完成一位信息码的纠错。这一点制约了汉明码在实际系统的应用,如果能通过整合其他技术,到达检错并纠错多位码元,那么汉明码的发展前景会非常大。 4循环码 4.1循环码编译码原理 循环码的编码系统是以比特组为基础建立起来的,也就是字节了,但不要理解为它是单个的0和1,也就是说是非二进制BCH码,这种非二进制BCH码具有很强的处理突发错误的能力,在这一点上汉明码是不具有的。 循环码的特点: (1) 循环码是一类重要的线性分组码,因此它具有线性分组码的一般特性,还具有循环性,纠错能力强的特点。 (2) 循环码是一种无权码,其相邻数码间只有一位码元不同,因此它它满足邻接条件,没有瞬时错误的优点。 循环码完全由其码字长度n及生成多项式g(x)所决定。以(7,4)循环码为例,n=7,k=4,r=3.生成多项式为,效验多项式为。 其生成矩阵和效验矩阵分别为: 4.1.1编码原理 在讨论循环码时,一般是用代数多项式来表示循环码的码字,此多项式就被称为码字多项式了。对于(n,k)循环码的码字,其码字多项式的一般形式为式(4-1): (4-1) 系统循环码的码字多项式可表示为式(4-2): (4-2) 其中,前一部分代表信息码元组,后一部分用[]’表示,是被g(x)除得的余式,它代表监督码组。 (1) 有信息码构成信息多项式:,其中高幂次为k-1。 (2) 用乘上信息多项式m(x),得最高幂次为n-1,做移位。 (3) 用g(x)除和到余式r(x)。 4.1.2译码原理 发送码字多项式A(x)是生成多项式g(x)的倍式,换言之,生成多项式g(x)能将发送码字多项式A(x) 整除.如果码字经信道传输后没有发生错误,那么接收码字多项式B(x)也是生成多项式g(x)的倍式,但如果码字在传输过程中发生错误,则接收码字多项式不再是生成多项式g(x)的倍式,即此时g(x)不能整除接收码字多项式[15]。所以定义伴随多项式S(x)为: (4-3) 即S(x)是接收码字多项式B(x)除以g(x)后的余式,是不大于r-1次多项式。 接收码字多项式B(x)是发送码字多项式A(x)和差错多项式e(x)(错误图样所对应的多项式)相加的结果,即 (4-4) 得: (4-5) 由式可发现,伴随多项式只与差错多项式有关。所以,循环码的译码过程也可以归纳为如下三个步骤: (1) 根据式(4-5)计算出可纠错图样多项式e(x)的伴随式S(x),将e(x)与S(x)的对应关系列成译码表。 (2) 当收到一个码字B(x)后,利用式(4-3)求出伴随式S(x),对照译码表找到e(x); (3) 利用式(4-4)求出发送码字A(x),即. 4.1.3循环码的检错与纠错 循环码的译码是可以检测和纠正突发错误的。循环码的检错能力优越于其它码主要表现在他的超强检错能力和超强纠错能力,它的超强检错能力具体表现在以下的方面: (1)能检出全部单个错码; (2)能检查全部离散的二位错码; (3)能检测出所以的奇数个错码; (4)能检测所以长度不超过(n-k)的突发错误; 4.2循环码编译码及仿真 4.2.1编译码程序说明 此次设计是(7,4)循环码来描述其编译码过程,过程与上述汉明码相似,代码见附录二。 先定义码长n和信息位k,通过mess=randint(k*4,1,2)函数产生一个由0或1组成的16*1的信息矩阵,通过subplot()函数创建图形。其中subplot(2,2,1)为4幅图的第一幅,再通过Stem函数将信息矩阵绘制到图形中就得到编码器输入的信号。title函数用于标注所画图像的题目。 代码中P=cyclpoly(n,k)函数为循环码生成多项式; encode()为编码函数,这是Matlab自带的函数,不需要自己去编写。encode(mess,n,k,'cyclic',p)中‘cyclic’指定以循环码进行纠错编码,传入mess、n、k以及编码所需的生成多项式p。得到循环码的监督矩阵H,之后将编码后的信号绘图显示。 decode()函数对信号进行译码,也是Matlab中定义好的,其内部实现循环码的译码是通过发送多项式、生成多项式以及接收码字多项式之间的关系来实现的。这里需要指出的是一个伴随式对应一个差错多项式也对应一个错误样式,这就可以检测出经过信道传输过来得到码字来个位上存在错误,转换为信息码元。 图4-1 (7,4)循环码编译码结果图 运行代码过程中,先对随机信号进行提取,在图4-1中编码器上输入为1010110010111100,然后通过encode函数(编码函数)之后,其中加入了监督码,信号在此过程中发生变化,变得更加复杂密集一些,编译后输出为0111010010110000010110101100,之后通过decode译码函数后,输出译码结果为:10101100101101100,发现其结果与编码输入信号是相同的。说明循环码的检错和纠错能力性能非常好。 输出的多项式为:; 图4-2 (7,4)循环码编译码结果图 再次运行代码后,得到如图4-2图形。观察后发现,编译码前后输入输出信号是一致的,但对比两图后发现,编码器输入信号会有所不同,那是由于提取到的信号为随机信号,所以码元也是随机的,信号经过编码器后,因为加入监督码的原因,波形变得更加密集。可以清楚的发现,图中信号经过译码之后,输出的波形与原编码器输入的信号大致是相同的,这就很好的说明了循环码的纠错性能非常好。 下面对循环码在不同信噪比下的误码率进行设计分析,代码见附录三。 此次设计以(3,2)循环码为例,先是给定码长n与信息位长度k,还有采样频率与码速率,可以得到其整数比,在这种情况下是为了实现位同步,编译码过程与上述(7,4)循环码相同,编译码之后,可以求出在不同信噪比的情况下所对应的误码率。 运行代码后,在控制台输出其误码率,显示信噪比与误码率之间的关系图如图4-3所示: 图4-3(3,2)循环码信噪比与误码率关系图 从图4-3中不难看出,信噪比低于20dB时,循环码的误码率很高,但超过20dB之后,误码率就非常低了,图中显示误码率达到23时,误码率就为0了,之后一直为0值。 5卷积码 5.1卷积码及其维特比译码原理 卷积码是一种前向纠错控制编码。它是通过将连续的信息比特序列映射为连续的编码器输出符号,卷积码的译码方式与分组码译码采取的方式有很大的区别就是由于卷积码的这种映射是高度结果化的。在同等复杂度情况下,卷积码的编码增益是要大于分组码的编码增益的。所以说,在对某一个应用时,是采用分组编码还是采用卷积编码哪一种更实用更符合就取决于这个应用的具体情况来定了。 卷积码的概率译码是始于序列译码,1961年序列译码的概念被提出,过去6年后,维特比算法出现,也是从那时开始卷积码才真正得到及其广泛的应用。 卷积码是没有固定长度的,译码过程是通过搜索网格来找出最有可能的序列,它的译码方式有两种--软判决和硬判决,本次设计我是采取硬判决的维特比译码。通过Simulink设计一个硬判决维特比译码输出的完整电路。 维特比译码适用于约束长度不太大的卷积码的译码中,如果约束长度比较大的时候,一般采用序列译码,它能很大程度降低运算量,但其性能要比维特比译码差些。维特比译码方法在通信领域有着广泛的应用,市场上已有实现维特比译码的超大规模集成电路。 维特比译码是一种最大似然译码。这里给出其基本思想:通常是把接收到的码字序列和发送序列比较,这里的发送序列是指所以可能的序列,然后选择其中一个码距最小的序列为发送序列,也就是译码之后的输出序列。具体的译码方法是: (1)在格状图上,计算从起始状态(j=0时刻)开始,到达j=m时刻的每一个状态的所有可能路径上的码字序列与接收到的头m个码字之间的码距,保存这些路径及码距。 (2) 从j=m到j=m+1共有条路径(状态数为,每个状态往下走各有个分支),计算所以分支上的码字和相应时间段内接收到的码字之间的码距,都加到前面保留路径的码距上,得到个路径的累加码距,对到达j=m+1时刻各状态的路径进行比较,每一个状态保留一条具有最小码距的路径及相应的码距值。 (3)按(2)方法继续下去,直到比较完所有接收码字。 (4)所以接收码字比较完之后,剩下个路径,将最小码距的路径挑选出来,这个路径上的发送码字序列即是译码后的输出序列。 卷积码的Viterbi译码框图如图5-1所示: 图5-1 Viterbi译码流程 这里以(2,1,2)编码器为例,若发送码字序列为0000000000,经过信道传输后,接收码字序列为010*******[11]。求其译码后的输出序列。 由于(2,1,2)编码器的编码存储m=2,所以译码方法应从j=m=2时开始。从图a)中可以看出,在j=2时刻有4个状态,由初始状态出发到达这4个状态一共有4条路径。可以得出,到达a状态路径的码字序列为0000;到达b状态路径的码字序列为0011,到达c状态路径的码字序列为1110;到达d状态路径的码字序列为1101。路径的长度为2,在这段时间内,有2个接收码字,它们分别为01,00。通过这4条路径上可能发生的2个码字序列与接收的2个码字分别进行比较,得到的4条路径的码距分别为1,3,2,2,将这4条路径对应的码距保留下来,这些被保留的路径称为幸存路径。 a) j=2时刻b) j=3时刻 c) j=4时刻 d) j=5时刻 图5-2 卷积码的维特比译码图 从j=2时刻的4个状态到达j=3时刻的4个状态共有8个路径,从a状态出发的2条路径上的码字分别为00和11,和这期间接收码字01相比,码距分别为1和1,分别加到a状态前面这段路径的码距上,得到2条延长路径000000和000011的码距,它们都等于2,一条到达j=3时刻的a状态,另一条到达j=3时刻的b状态。使用相同的方式求得从j=2时刻的b,c,d出发达到j=3时刻各状态的6条路径的码距,并把这些码距分别加到前面保留路径的码距上,得到6条延长路径的码距。图5-2b)中,到达j=3时刻的每个状态各有2条路径,在这2条路径中选择码距小的路径将其保留下来。 按照上述方法继续计算到达j=4,j=5时刻各状态路径的码距,并选择相应的保留路径及码距,见图5-2c)和5-2d)。在j=5时刻的4条保留下来的路径中选择一条离接收码字码距最小的路径,由图5-2d)可知,码距最小的路径是aaaaaaa,所有,也就能得出其发送码字序列为0000000000。 由此可以得出结论,通过上述维特比译码,接收序列010*******中的两位错误得到了纠正。 5.2卷积码仿真 5.2.1维比特译码器仿真 在Matlab软件的Simulink组件库中存在维特比译码器模块整体的设计框架如图5-3所示: 图5-3 整体设计结构模块框图 由上图5-3可以看出整个系统由3个子系统组成,信源模块的功能是用来对随机二进制信号进行卷积码和二进制相位调制,然后将调制后的信号输出发送给信道;然后是信道,可以看出它是加有噪声的信道;而最后的信宿模块用于对调制后的信号进行软判决或是硬判决译码,还原其原始的信息序列,最后就能通过计算得出调制后信号的误码率了,也可以通过分析判断出卷积码的维特比译码能力的强弱及优缺点。 首先分析图5-3中的信源模块,它是由贝努利二进制序列产生器、卷积码编码器还有二进制相位调制3个小的模块组合而成。 以下是3个模块的参数设置和模块图。 图5-4 贝努利二进制序列产生器模块及其参数设置 图5-4中probability of a zero是零出现的概率,Initial seed指定序列从哪个地方开始取值,Sample time为测试周期(采样时间),Samples per frame为每帧的采样数。 图5-5 卷积码编码模块及其参数设置 参数中Trellis structure为网格结构,在下面维特比模块会做详细介绍,Reset复位重置。 图5-6 二进制相位调制模块图及其参数设置 Phase offset设置的是相位偏移参数,Samples per symbol表示每个符号的输入采样。 此次仿真使用的是相对简单的加性高斯白噪声信道作为噪声信道,其原理是在二进制相位调制信号中叠加高斯白噪声。下图5-7是对加性高斯白噪声模块的参数设置: 图5-7 加性高斯白噪声模块图及其参数设置 Mode属性参数设置为信噪比,SNB(信噪比)为1,Input signal power为输入信号功率参数。 最后一个子系统信宿模块先是接收到调制后的二进制相位信号,然后利用解调模块(BPSK Demodulator Baseband)把信号量化,得到的是硬判决量化信号,最后就可以通过维特比译码器对信号译码了。Error Rate Calculator(误码率统计模块)是用来保存译码输出信号和原始信号的,可以看出 Display模块是用来显示数据的,它可以将计算得到误码率显示出来,其过程是渐变的,最后趋于一个定值。由于Selector选择器参数简单,本设计中就列出其模块及参数图了,它的作用是把编码信号的误码率保存到工作区变量BitErrorRatea中,方面查看分析。图5-8、图5-9、图5-10是信宿模块主要的子模块及其内部参数设置图: 图5-8 二进制相位解调模块图及其参数设置 二进制相位解调模块参数与调制模块参数设置是一致的,这样才能保证信号在调制解调过程中不会报错。 图5-9 维特比译码器模块图及其参数设置 由图5-9可见,维特比译码器中网状结构与卷积码编码器中的网状结构属性参数相同。模块中通过poly2trellis()函数产生的Trellis结构(当然也可以通过其他方式,这里就不做解释了)。其中Decision Type(判决类型)有3种:Unquantized(非量化),Hard Decision(硬判决)和Soft Decision(软判决)。Number of soft decision bits是软判决的个数,由于Decision type设置为Hard Decision,Number of soft decision bits模块参数没有实际意义。 图5-9中Traceback depth反馈深度影响了维特比译码的精度,也影响着解码的时延。而Operation mode操作模式有3种:Continuous,Terminated和Truncated。这个参数里面如果设置为Continuous模式时,维特比译码器输出的信号为抽样信号;输入信号为时帧数据时,3种模式都可以选择。而这我此次采用的是Truncated模块,当每帧数据传输完毕之后,解码器会重置到全0的初始状态。 图5-10计算误码率模块图及其参数设置 Receive delay接收延迟;其中Output data如果设为workspace的话,运行完毕后需要打开MATLAB的workspace才能看到对应的变量。将参数设置为Port,然后接一个Display模块就能显示输出误码率。 卷积码维特比译码完整设计模型如图5-11所示: 图5-11 卷积码维特比译码完整设计模型 将图5-11中设计的系统命名为juanji00.mdl。其中Display为模块仿真后的误码率,可以看出,误码率为0.005091. 5.2.2简化后的维特比译码器仿真 由于上述设计较为复杂,也为验证译码模块的正确性,就将上述模块做了一个简化,将其中的信道噪声关闭,同时也不进行二进制相位的调制和解调,将其中的误比特率模块去掉,再在其中添加一个To Workspace(输入二进制码模块)和To Workspace(译码输出二进制码),变量名分别设置为pdata和data。简化后仿真系统模块如图5-12所示: 图5-12简化维特比设计 将图5-12中Bernoulli Binary Generator模块中的参数略作修改,Sample per frame参数改为10,使其产生较为简单的10位二进制随机码,并将Viterbi Decoder的Trceback depth值改为5.运行juanji11.mdl仿真,然后在matlab命令窗口将pdata.signals.values与data.signals.values输入,就会得到输入和译码后输出的二进制序列如图5-13所示: a) 输入二进制 b) 输出二进制 图5-13输入输出二进制图 通过观察图5-13a)和图5-13b)的结果后发现,译码器译码过程正常,能够实现译码功能,输入输出序列大致相同。 通过利用Matlab仿真组件Simulink对卷积码进行维特比译码,再对错误码元进行纠错,基本上实现了编码、传输、解码以及纠错的整个过程。在现代通信系统中,在卫星通信网络和3G通信网络等系统中卷积码是一个很重要的编码手段,因此对其研究和分析是非常重要的,也有很大的实际应用价值。 结论 本次设计利用MATLAB强大的仿真功能,先是搭建了具体的仿真模型,然后对模型的仿真过程及结果做出详细的分析。 在这整个毕设过程中,需要完成的是利用不同的码(汉明码,循环码,卷积码)对信道的进行仿真,在这个过程中去学习它们不同的编码和译码方式,更深层次的理解汉明码,卷积码以及卷积码,学会并掌握维特比的基本译码思路。 通过这次设计,本人感觉到了汉明码的不足之处,如果能让汉明码和其他一些纠错编码结合起来,实现检错和纠错多位的能力,那样它的应用就会更加广泛,适用性更强。对于循环码编码,循环码其独特的循环性,也使得其编码方式与普通的线性分组码有所不同,但其译码方式与汉明码在原理上是相同的。 而卷积码的纠错性能相对于线性码码来说大大增强,差错率随着码长的增加而下降。在同等复杂情况下,卷积码的性能要优于分组码。 在这次设计过程中遇到了不少问题,比如在对软件的应用中,由于不够熟悉,走了不少弯路,浪费了很多时间,还有在仿真方面的问题也困难重重,但是在老师和同学的帮助上,问题基本得带解决,使我收获很多。 参考文献 [1] Morelos-Zaragoza.R.H 著.张立军译.北京交通大学出社.2007.8.1.vol.3. [2] 刘健.信道编码的盲识别技术研究.西安电子科技大学博士毕业论文.2010. [3] 袁东风,张海霞.宽带移动通信中的先进信道编技术.北京:北京邮电出版社.2004. [4] 刘玉君.信道编码.河南:河南科学技术出版社.2006. [5] 阮宜武.汉明码检验系统的电路实现.武汉:华中科技大学出版社.2005. [6] 徐明远,稍玉斌.Matlab仿真在通信与电子工程中的应用.西安: 西安电子科技大学出版社.2005. [7] 沈振元,等.通信系统原理.西安:电子科技大学出版社,2004. [8] PROAKIS J,G,SALEHI,M.Contemporary Communication Systems using MATLAB.PWS Publishing Company,1998. [9] ETSL,Technical Specification 102 377,Digital Video Broadcasting;DVB- H Implementtation Guidelines,v.1.4.1,2009. [10] 邓华.Matlab通信仿真及应用实例详解。北京人民邮电出版社,2003 [11] 孙祥,徐流美,吴清.Matlab7.0基础教程.北京:清华大学出版社,2005. [12] 王士林,等.现代数字调制技术.北京:电子工业出版社,1998. [13] 南利平.通信原理简明教程,北京:清华大学出版社,1999. [14] 宋祖顺,等.现代通信原理.北京:电子工业出版社,2001. [15] 樊昌信,等.通信原理.北京:国防工业出版社,2001. [16] 陈国通.数字通信.哈尔滨:哈尔滨工业大学出版社,2002. 附录一 汉明码仿真代码 随机信号源: function [out,rn]=Number(k) rn=rand(k,1); for n=1:k if rn(n)>0.5 out(n)=1; else out(n)=0; end end 汉明码编码: function code=Hm74(ic,k,P) Y=eye(k); G=[Y,P']; code=rem(ic*G,2); 调制: function out=Modd(ic,k,r) m=k+r; for n=1:m if ic(n)<1 out(n)=-1; else out(n)=1; end end 加入高斯白噪声: function out=Noise(snr,k,r) snr=10^(snr/10); rate=k/(k+r); q=1/(sqrt(2*snr*rate)); out=randn(1,k+r)*q; 解调: function out=Demod(in,k,r) m=k+r; for n=1:m if in(n)<0 out(n)=0; else out(n)=1; end end 汉明码译码: function out=Dehm74(in,k,r,P) m=k+r; X=eye(r); H=[P,X]; S=rem(in*H',2); n=0; while n h=H(:,n); if S==h' break; end end in(n)=1-in(n); for i=1:k out(i)=in(i); end 调用函数: function BER = Example(SNR) k=4; r=3; P=[1 1 1 0; 0 1 1 1; 1 1 0 1;]; N=1000; w=0; n=1; s=1; while n hc=Hm74(ic,k,P); mc=Modd(hc,k,r); nc=mc+Noise(SNR,k,r); dmc=Demod(nc,k,r); dhc=Dehm74(dmc,k,r,P); for m=1:k; if dhc(m)~=ic(m) w=w+1; end end n=n+1; end BER=w/(N*k); end 主程序: s = 1:0.1:10; BER = s; for i = 1:length(s) BER(i) = example(s(i)); end semilogy(s,BER); 附录二 (7,4)循环码仿真代码 clear all; clear all; n = 7; k = 4; mess = randint(k*4,1,2) subplot(2,2,1) stem(mess) title('编码器输入信号') p=cyclpoly(n,k) code = encode(mess,n,k,'cyclic',p); subplot(2,2,2) stem(code) title('编码器输出信号') recode=decode(code,n,k,'cyclic',p) subplot(2,2,3) stem(recode) title('译码器输出信号') t=-1:0.01:1; x=recode; N=length(x); fx=fft(x); df=100/N; n=0:N/2; f=n*df; subplot(2,2,4); plot(f,abs(fx(n+1))*2/N); grid; title('频谱图') 附录三 (3,2)循环码仿真代码 n =3 ; %定义码长 k =2 ; %信息位长 Fs=40; %系统采样频率 Fd=1; %码速率 N=Fs/Fd; %采样频率与码元速率是整数倍的情况下在MATLAB中已经实现位同步的功能。 M=2; %进制数 for SNRpBit=1:100;%信噪比 SNR=SNRpBit/log2(M); %制造100个信息组,每组k位 msg = randint(100,k,[0,1]); code = encode(msg,n,k,'cyclic/binary'); %加入噪声 %在已调信号中加入高斯白噪声 noisycode=awgn(code,SNR-10*log10(0.5)-10*log10(N),'measured',[],'dB'); %将浮点数转化为二进制,波形整形过程 for i=1:100 for a=1:k+1 if noisycode(i,a)<0.5 noisycode(i,a) = 0; else noisycode(i,a) = 1; end end end %译码 newmsg = decode(noisycode,n,k,'cyclic'); %计算误码率 [number,ratio]=biterr(newmsg,msg); result(SNRpBit)=ratio; disp(['The bit error rate is',num2str(ratio)]); end %不同信噪比下循环码经过加性高斯白噪声信道的误码率 figure(1) stem(result); title('循环码在不同信噪比下的误码率') legend('误码率','*') xlabel('信噪比'); ylabel('在加性高斯白噪声下的误码率'); 下载本文