1、 分类号 编号某 某 大 学 毕 业 论 文(设 计)基于C语言的RS(7,3) 编码器设计Design and Implementation of RS(7,3) Encoder Based on C申请学位:工学学士院 系:电子信息学院专 业:通信工程某某大学毕业论文(设计)任务书院(系):姓名学号毕业届别2009专业通信工程毕业论文(设计)题目基于C语言的RS (7,3)编码器设计指导教师学历研究生职称讲师所学专业通信与信息系统具体要求(主要内容、基本要求、主要参考资料等):主要内容:研究纠错码的基本理论和数学基础,学习循环码,BCH码,RS码等几种常见的纠错码,研究它们的编码、解码原理
2、。重点研究RS编码原理及实现方法。应用C语言进行RS编码器的软件设计,并选用MATLAB对编码结果进行验证。基本要求:应用C语言进行有限域乘法器、RS编码器的仿真设计,并利用TLAB对编码结果进行验证,实现编码功能。参考资料: 1.王新梅,肖国镇.纠错码原理与方法.西安电子科技大学出版社.2002.2.张鸣瑞,邹世开.编码理论.北京航空航天大学出版社.1990.3.曹雪虹,张宗橙.信息论与编码.清华大学出版社.2004.4.叶才炜,李式巨.RS编译码的c语言实现.无线电工程第33卷第8期. 5.孙屹,李妍.MATLAB通信仿真开发手册.北京:国防工业出版,2005进度安排:2008-2009-
3、1学期第8周第16周,选定毕业论文题目、进行开题。2008-2009-2学期第1周第4周,查阅资料,完成相关文献翻译。 2008-2009-2学期第5周第8周,有限域乘法器、RS编码器的软件设计。 2008-2009-2学期第8周第13周,设计结果的Matlab验证,撰写论文。 2008-2009-2学期第14周第15周,论文答辩。指导教师(签字): 年 月 日院(系)意见: 教学院长(主任)(签字): 年 月 日备注:摘要RS(Reed-Solomon)码是一种多进制的BCH码。既适宜纠正随机错误,更适宜纠正突发错误,因而被广泛地用于各种通信系统及数据存储中,如深空通信、移动通信、光纤通信、
4、磁盘阵列、DRAM、光盘数字视频广播(DVB)等系统。本论文重点介绍了纠错码基本理论,有限域乘法器、RS码编码原理。利用C语言实现了RS(7,3)码的编码器和伽罗华域GF()内的乘法器的设计,并通过Matlab仿真对编码器结果进行验证,程序输出结果与验证结果一致,表明所设计的编码器和乘法器算法能够满足设计要求。 关键词Reed-Solomon码;乘法器;编码器Abstract RS (Reed-Solomon) code is an M-ary code of the BCH. Appropriate to correct random errors,and more appropriate
5、to correct the unexpected error,it has been widely used in various communications systems and data storage, such as deep-space communication, mobile communication, optical fiber communication, disk array, DRAM, CD-ROMs Digital Video Broadcasting ( DVB) systems. The paper focuses on the basic theory
6、of error-correcting codes,and finite field multiplier, RS coding principle. Then implement RS(7,3)encoder and GF()multiplier with language C.And tested by Matlab simulation.The results of RS encoder are correcr,which prove the design of the RS encoder and finite field multiplier can meet the require
7、ment of the usement.Key words RS (Reed-Solomon) code;encoder;Multiplier目录1 绪论11.1课题研究的意义及背景11.2 RS码的国内外发展状况22 纠错码的基本理论42.1 纠错码简介42.2循环码52.3 BCH码62.4 RS码63 有限域的乘法器设计83.1有限域(伽罗华域)的基本概念83.2 有限域元素运算113.2.1有限域GF()中的加法113.2.2有限域GF()中的乘法124 RS(7,3)码的编码器设计154.1 RS码的编码原理154.1.1生成多项式的求解154.1.2 RS(7,3)码的C语言实现1
8、64.2 MATLAB验证20总结与展望22致 谢23参考文献24某某大学毕业论文(设计)1 绪论1.1课题研究的意义及背景信息的交换、处理和传输是现代通信的任务。数字信号经过传输,会产生错误。可靠的数字通信系统必须将差错率控制在允许的范围内。提高信息传输的可靠性和有效性,始终是通信工作所追求的目标。而纠错码技术是提高信息传输可靠性的一种重要手段。所有的数字通信系统如通信、雷达、遥控遥测、数字计算机的存储系统和内部运算以及数字计算机之间的数据传输等,都可归结成如图1-1所示模型图1-1通信系统模型我们关心的是图中的信道编、译码器即纠错编、译码器两个方框。信道编码器对信息序列进行编码,增加冗余度
9、。当码元经信道传输产生错误时,译码器可以检出或纠正错误。所编的具有检错或纠错能力的码就称为纠错码。随着信息时代的到来和微电子技术的飞速发展,纠错码技术已成为一门标准技术而被广泛应用。研究纠错码是一项理论性与实践性均很强的工作。在通信领域中,CRC循环校验已成为各类线路传输中必不可少的一部分。在移动通信中,纠错码被广泛应用于模拟体制的信令传输及数字体制的整个传输,以提高传输的可靠性和节省珍贵的频谱资源;在电话网的数据传输中,纠错码、差错控制技术已是高速数据传输成为现实的关键技术。纠错码技术还广泛应用于计算机存储和运算系统中。1.2 RS码的国内外发展状况RS(Reed-Solomon)码是差错控
10、制领域中一类重要的线性分组码,由于具有很强的纠错能力,具有同时纠正突发错误和随机错误的能力,因而被广泛地应用于各种现代通信系统中,以满足对信道可靠性的要求。很多国际标准采用了RS码例如空间数据系统咨询委员会在遥测信道编码的建议书中将RS(255,223)系统码作为标准使用。美国的蜂窝数字分组数据系统(CDPD)中采用了m=6的RS(63,47)码。RS码也是空间应用存贮器系统中的首选码。故自RS码出现以来,便一直是国际通信领域研究的热点问题之一。对于RS码的编译码器,现有的专用集成电路(ASIC)大部分是数字电视广播(DVB)的RS(204,188)和深空卫星通信系统中用的RS(255,223
11、)码。在可编程逻辑器件上做RS码编码器的很多,而把RS码译码器也做在可编程逻辑器件上的很少。对于低速率码流,国内外大部分都是用单片机和DSP来实现。究其原因,是因为RS码编码器比较简单,而译码器的算法比较复杂,而c语言对于算法的描述比用HDL(硬件描述语言)要方便的多。使用硬件描述语言设计高速执行的芯片,这种设计是富有挑战性和花费时间的,需要一定的硬件工程技巧,并且需要用到的芯片资源比较多(上万门)。以前的PLD或达不到所需的要求或价格昂贵,EDA软件功能也有限,往往对于复杂算法的综合能力很差。而现在,随着芯片价格的下调和集成的提高,以及功能强大的EDA软件的帮助,将有能力把译码器做在便宜的F
12、PGA上。虽然可编程逻辑器件供应商Altera公司及Xilinx公司可提供IP软核,但它需要授权使用,并且它提供的软核也是在可实现DVB译码的基础上再考虑其它码率的RS码,所以效率低,器件资源消耗比较多。而且它只提供编译后的.vho文件,不提供源代码。从RS纠错编译码的设计到实现过程相当复杂,随着VLSI(超大规模集成电路)技术的发展,高集成度电路为其庞大的编译码设计提供了强大的硬件支撑。正因为有超大规模集成电路出现,RS码在通信领域被广泛应用。目前实现RS编译码的方法有如下几种:1采用一些厂家提供的功能特定的RS编译码芯片。这种方案用户可以不必关心RS编译码器的内部结构,只要了解如何使用这个
13、芯片就行了。这种市售的RS芯片通常是为了满足特定的功能要求而设计的,其功能的配置虽也可做部分调整,但局限性较大,灵活性较差,而且资源浪费多,引脚数目也多。2.利用可编程的数字信号处理(DSP)芯片实现RS编译码功能。这种方案DSP芯片的设计者必须对RS编译码的算法有深入了解。这种方法灵活,用户通过修改软件代码的办法对RS编译码的参数和功能做出较大的调整。这种方法的缺点是DSP芯片的价格比较昂贵、编译码的速度受限制。3.利用FPGA技术,以配置FPGA器件的方式实现RS编译码。采用这种方案,即通过配置FPGA来完成RS编译码的方法,是目前看来最好的一种方法。因为FPGA作为一种高密度可编程逻辑器
14、件,可以反复编程,具有很好的灵活性,便于修改RS编译码的参数。用FPGA实现的RS编译码器速度很快,运算速度远高于DSP编程的方法。另外这种方法还可以根据实际要求,把RS编译码器的周围的一些相关电路也集成在同一片FPGA芯片里。这样一来既充分利用了器件资源,又提高了产品集成度和可靠性,减少了功耗,降低了成本,而且使电路性能得到明显提高。正因为基于FPGA的RS码实现方式有如此显著的优势。随着研究与应用的不断发展,RS码硬件译码器的实现已呈现出模块化的设计形式。这样的设计形式一般可分为五个部分:1)计算校验子2)求解关键方程3)求取错误位置4)求取错误值5)纠正错误。上述五个部分的具体关系如图1
15、-2:图1-2 RS译码原理2 纠错码的基本理论2.1 纠错码简介纠错码的产生源于1948年Claude Shannon的著名论文“A mathematical theory of communication”的发表。而Shannon提出的信道编码定理正是为纠错码的发展奠定了理论基础。这是因为在Shannon提出信道编码定理之前,工程师们仅仅知道只有无限能量或无限带宽才能保证噪声信道中的消息能够可靠传输;但是,信道编码定理提出之后,工程师们意识到建立一条太好的通信信道是不值得的,而有效地使用纠错码的能力才是合理的。可惜的是,Shannon只是证明了合适码字的存在,而并没有阐述如何去获得合适的码
16、字。所以,在上世纪的整个50年代,主要的工作在于寻找能够产生低误码率的码型构造方法,但结果却不如人意;到了60年代,纠错码研究开始从两个方向进行长期的发展。纠错码研究的第一个方向是在码字的构造中引入代数结构,其中的研究成果集中在分组码的研究。在1950年,Hamming第一次描述了一类具有单个纠错能力的分组码Hamming码。由于Hamming码存在一定的局限性,所以人们在往后的10年里坚持不断地向着Shannon指出的方向努力。尽管如此,在1960年以前,人们仍然无法找到比Hamming码更好的一类码型。同时,在这段岁月里,许多长度较短的分组码仍然不断地被人们发现了。但是,这些分组码都没有一
17、般的理论基础。而到了1960年,重大的突破终于发生了。这就是Bose,Ray-Chaudhuri(1960)和Hocquenghem(1959)发现了一类具有多个纠错能力的分组码BCH码,以及Reed和Solomon(1960)发现了适用于非二元信道的分组码Reed-Solomon码。至此以后,由于这个领域的理论得到了很大的发展,所以在往后的岁月中,新的码型也不断地被发现。BCH码的发现同时带动了在软件和硬件上设计有效编译码算法的研究。第一个好的译码算法是由Peterson提出的,接着,就是由Berlekamp和Messay提出的更加有效的迭代算法。随着研究地不断深入,更为有效的编译码算法也不
18、断地得到改进,如在1972年由Chase提出的Chase算法。纠错码研究的第二个方向是与概率统计相结合的研究方向。最初的研究是在最优码字未知的情况下去估计分组码中最好的码型的误码率。以这类研究为基础,人们开始尝试从概率的角度出发来了解编译码的原理,从而提出了序列译码的概念。从对序列译码的研究中,人们了解到一类具有高度结构化的有效的树型码卷积码,其中卷积码是由Elias在1955年所发现的。在上世纪的五十年代末,卷积码已可以通过序列译码算法得到成功的译码。在1967年,由Viterbi提出的Viterbi算法成为了卷积码的译码工作中至今为止最常用的译码算法。2.2循环码循环码是一类最重要的线性码
19、,它具有严格的代数结构,其性能易于分析。目前已发现的大部分线性分组码均与循环码有密切联系,它们之中的大部分都可归结于循环码的范畴。并且循环码具有循环特性,其编译码电路,特别是编码电路易于实现。基于这些特征,循环码特别引人注目,对它的研究也比较深入和系统。循环码的定义:设有一个n重的k维子空间,若对其中任意一个,恒有,则称为循环子空间或循环码。通常用多项式来表示循环码。将码矢表示成多项式的形式,即码元多项式为: (2.1)其i次循环移位所得的码矢也用多项式表示为: (2.2)由式(2.2)乘以再除以得: (2.3)由此可知:的i次循环移位是乘以后再除以的余式。即: (2.4)根据循环码的循环特性
20、,可由一个码字的循环移位特性得到其他的非零码字。在循环码的个码字,取其前k-1位皆为0的码字g(x)(其次数为r=n-k),在经过k-1次循环移位后,总共得到k个相互独立的码字:可作为码生成矩阵的k行,于是得到循环码的生成矩阵: (2.5)码的生成矩阵一旦确定,码就可以确定。这表明循环码可以由它的一个r(r=n-k)次码多项式来确定。每一个码多项式都是的倍式,每一个是倍式且次数n-1的多项式都是码多项式。多项式称为码的生成多项式。2.3 BCH码自1950年汉明发表了纠正单个错误的码以来,几乎过了10年的时间,才于1959年由霍昆格姆(Hocquenghem),1960年由博斯(Bose)和雷
21、一查得胡里(Ray-Chaudhuri)分别提出了纠正多个随机错误的循环码BCH码的构造方法。BCH码是目前所发现的一类很好的线性纠错码类,它的纠错能力很强,特别是在短和中等码长下,其性能接近理论值,并且构造方便,编码简单。特别是它具有严格的代数结构,因此它在编码理论中起着重要的作用。BCH码是迄今为止研究得最为详尽,分析得最为透彻,取得成果也最多的码类之一。1960年彼得逊伊(Peterson)从理论上解决了二进制BCH码的译码算法,奠定了BCH码译码的理论基础。稍后,格林斯坦(Greenstein)和齐勒尔(Ziegler)把它推广到多进制。1966年伯利坎谱(Berlekamp)利用迭代
22、法译码BCH码,从而大大地提高了译码速度,从实际上解决了BCH码的译码问题。BCH码的定义:给定任一有限域及其扩域,其中q是素数或素数之幂,m为某一正整数。若码元取自上的一个循环码,它的生成多项式的根集合R中含有以个连续根,则由生成的循环码称为q进制BCH码。在实际中应用的最多的是二进制BCH码,将二进制BCH码的概念进行扩展可以得到多进制BCH码。因为码元符号取自二元域、纠t个错误的二元BCH码的生成多项式是以的扩域上2t个相邻元素为根的多项式。那么,多元BCH码的码元符号取自多元域,其中q为某一素数或素数之幂,而纠正t个错误的多元BCH码的生成多项式是以的扩域上2t个元素为根的多项式为 (
23、2.6)多元BCH码的校验矩阵: (2.7)式中,为本原元:码长;d为设计距离,d=2t+1。由确定的BCH码是q元本原BCH码。RS码是多元BCH码的一种特例,即取m=1,故RS码的生成多项式的根和码元符号在同一域上。下面将讨论RS码。2.4 RS码RS码是线性分组BCH 码中一个重要的子类。在同样编码冗余度下,RS 码具有最强的纠错能力。在q进制BCH 码的码字中, 每个码元的取值在GF(q)上,但码的g(x)的根却在GF(q)的扩域中,若码元取值的域与码的g(x)的根所在的域相同, 则称这类BCH码为RS码。RS码是非二进制循环码,每一个码元由m个比特构成,m是大于2的任意正整数.只有所
24、有的n和k都满足以下条件时,m比特码元的码才存在。 (2.8)其中,k是已编码分组的数据码元数目,n是已编码分组中总的码元数。对于大多数码 (2.9)其中,t是RS码能够纠正的错误码元个数,是监督码元个数。扩展的RS码由,或组成, 但n不能再大。对任何相同输入输出分组长度的线性编码, 里德-索罗蒙码可以达到最大可能的码元最小距离。对于非二进制编码, 两个码字间的距离(类似于汉明距离)定义为序列间的不同码元数目。里德-索罗蒙码最小码本距离为 (2.10)这种编码可以纠正少于t的任意多个错误组合。t可以表示为: (2.11)其中:x 表示小于或等于x的最大正整数。上式表明,对于RS码,纠正t个错误
25、需要不超过2t个的监督码元。式(2.11)具有以下直接含义,我们可以认为译码器花费n-k个冗余码元,它是可纠正码元数的2倍。对于每个错误,一个冗余码元用于定位此错误,另一个用于找到其正确的取值。由于RS的编码比较简单,实现起来也很容易。RS码的编码原理分为时域编码和频域编码2种,本文中仅讨论时域编码。3 有限域的乘法器设计3.1有限域(伽罗华域)的基本概念首先介绍一下域的概念。域:非空元素集合Q,若在Q中定义了加和乘两种运算且满足下述公理:1)Q关于加法构成阿贝尔群,其加法恒等元(单位元)记为0。2)Q中非零元素全体对乘法构成阿贝尔群。其乘法恒等元(单位元)记为1。3)加法和乘法间有如下分配律
26、: (3.1) (3.2)则称Q是一个域。域中元素的个数为域的阶。元素个数有限的域称有限域,用GF(q)表示q阶有限域。有限域也称为伽罗华域,在编码理论中起着非常重要的作用。有限域的一个重要性质是每个有限域GF(q)至少要包含一个叫做a的本原元素,它能生成该域中的每个元素。可以将GF(q)延伸为一个含有个元素的域,这称为GF(q)的扩展域,表示为GF(),m是一个非零正整数。GF(q)是GF()的子集。扩展域GF()中的码元用于构造RS码。二进制域GF(2)是GF()的一个子域,类似于实数是复数的一个子域一样。除了数字0和1,在扩展域中还有特殊的元素,用一个新的符号a表示。GF()中任何非零元
27、素都可以由a的幂次表示。元素的无限集G,就是根据元素0,1,a而形成的,后一个元素通过前一项乘以a而得: (3.3)为了从G中得到有限元素的集合GF(),必须对G域施加一个条件,使它只能含有个元素,并且对乘法封闭。域元素对乘法封闭的条件可由下面的不可约多项式表示:即 (3.4)根据这个多项式限制条件,任何幂次等于或超的域元素都可降阶为如下表示的幂次小于的元素。有限域的本原多项式:有限域GF()可用一组本原多项式来定义,有限域是定义RS码所必需的,所以研究RS码须研究本原多项式。本原多项式可定义为:一个m阶的不可约多项式f(x)。如果f(x)能整除的最小整数n,其中,则该多项式是本原多项式。不可
28、约多项式是指一个多项式不能因式分解为更低幂次的多项式,B整除A是指A除以B得到非0商并且余数为0。表3-1中列举了一些常用的本原多项式。表31常用本原多项式M本原多项式2345678本原多项式g(x)具有以下的性质:(1)在n,k循环码中,生成多项式g(x)是唯一的(n-k)次多项式,且次数是最低的。(2)在n,k循环码中,每个码字多项式C(x)都是g(x)的倍式,而每个为g(x)倍式且次数(n-1)的多项式必为一个码字多项式。(3)n,k循环码的生成多项式g(x)是的因式,即。(4)若g(x)是一个(n-k)次多项式,且为的因式,则由g(x)可以生成一个n-k循环码。本文设计的是RS(7,3
29、)码编码器,由表3-1可以查出本原多项式是:,用本源多项式表示的基本元素可映射为域元素图2.1的线性移位反馈寄存器(LFSR)电路的形式。例如,电路产生了域中的个非0的域元素,注意在图3-1中线路反馈连接是与本源多项式的系数相对应的,类似于二进制循环码的情况。置线路初始状态非零,例如为100,每个时钟实现一次右移,可以证明,图3-1中所示的每个域元素(除了全0元素)将周期性地出现在移位寄存器的状态上。两种算术运算即加法和乘法可以用来定义这个GF()有限域。 图3-1由本源多项式表示的基本元素映射为域元素的电路根据本源多项式可得GF()域元素表如表3-2所示。表3-2 GF()域中的元素映射表指
30、数形式二进制形式十进制形式00110102100401131106111710150011根据图3-1可以通过c语言求出在域GF()中的所有元素。源程序代码如下:#include void main()int GF7=1; int i;for(i=0;i=6;i+)if(GFi=3) GFi+1=GFi1;else GFi+1=(GFi1)&7)3;for(i=0;i=6;i+)printf(%dn,GFi);程序运行结果图3-2。图3-2 GF()域十进制元素生成图3-2中所示的7位十进制数字就是GF()域中的十进制形式的元素。3.2 有限域元素运算了解了有限域后,看看如何用高级语言编写出有
31、限域上的加法器和乘法器。这里以为准。可以看出,多项式加法器的实现比较简单,可以直接将2个多项式对应的系数异或即可,而多项式乘法器的实现比较复杂,这里重点介绍用高级语言编写出有限域上的乘法器原理和方法。 3.2.1有限域GF()中的加法有限域中两个元素的加法定义为两个多项式中同幂次项系数进行模2加,即 (3.5)已知GF()上的两个多项式由有限域中两个元素的加法定义得两多项式相加 (3.6)其中若为A(x)-B(x),则只要把B(x)系数以GF()中的加法逆元代替得到- B(x),再作- B(x)+ A(x)运算即可,在二进制情况下“-”与“+”运算相同,以此相加和相减的运算结果一样。3.2.2
32、有限域GF()中的乘法为了找到一种遵守有限域内全部乘法性质的多项式乘法,将构成一个元素为的有限域。首先,我们要求在一个集合内的任何两个多项式之积是本集合中的另一个多项式,以满足封闭性。只要该乘积是一个次数等于或低于m-1的多项式,就可以满足这一要求。对于次数等于或大于m的乘积多项式,可以取它相对于一个m次固定多项式的余项多项式。这里所需要的m次固定多项式就是本原多项式q(x)。它的最高次幂为m,而系数在GF(q)上,它是不可约多项式。一般地说,系数取自GF(q)的不可约多项式在GF(q)中无根,但在扩张域GF()内有根。具体说,m次q(x)在扩张域GF()内必有m个根。在有限域GF()中,个元
33、素中的任意一个都可由阶数小于或等于m-1的不同多项式来表示。多项式的阶数是它的最高幂指数。当m=3时,有限域表示为GF()。由于,所以在该域中有7个非零元素,或者说总共7个元素。GF()是GF(2)的扩展域,GF()中8个元素都可以用GF(2)中的两个元素0,1组合来表示,例如100,110,011等等。扩展域元素代替二进制元素的一个好处就是表达的紧密性,使得非二进制编码和译码过程的数学表示变得简单。有限域中的乘法运算规则是把两个元素表示成指数形式,将指数直接相加取模,如下式所示: (3.7)RS码定义在有限域上,其编码译码运算都是有限域上的算术运算。在有限域的各种算术运算中,乘法研究最多。乘
34、法器按实现方法分为比特串行乘法器和比特并行乘法器两种,比特串行乘法器的硬件实现比较简单,但是由于运算逐比特进行,实现高速的难度较大,不易达到较高的吞吐率。在高速应用时一般考虑用比特并行乘法器。所谓比特并行乘法器是指通过连接,直接实现输出结果的多位运算 , 最后结果并行输出,这样可以显著提高处理速度。在域中 , 两个以自然基表示的元素直接相乘时,约需要个模2加法器 , 这样实现的电路复杂度较高 , 而且缺乏规范性 , 因此一般釆用对偶基下的乘法器。现以乘为例,说明八进制常乘器的组成,GF()中每个元素都可表示成它的自然基底的线性组合:,再乘以后,则式中所以,乘电路如下图3-3所示图3-3 乘电路
35、用c语言实现有限域GF()中乘法器源程序代码如下#includeint MUL(a,b)int i,j,k,n,m;int GF7=1; for(i=0;i=6;i+)/生成GF2域/ if(GFi=3) GFi+1=GFi1; else GFi+1=(GFi1)&7)3; for(n=0;n=6;n+) if(GFn=a) i=n;for(m=0;m=6;m+) if(GFm=b)j=m;for(k=0;kj;k+)if(a=3) a=a1; else a=(a1)&7)3; return a;main() int x,y,z; scanf(%d %d,&x,&y); z=MUL(x,y);
36、 printf(%dn,z); 有限域GF()中4*6的运行结果如图3-4所示。图3-4 有限域GF()中4*6的运算结果通过图3-4可以看出,当输入十进制数4和6时,表示在GF()域中作4*6的运算,结果输出为5,运算结果正确。4 RS(7,3)码的编码器设计4.1 RS码的编码原理4.1.1生成多项式的求解GF()域上RS码一般写成(n,k)形式,其中n为码长n=-1,k为信息位的长度,码的最小距离d=n-k+ 1。每个符号表示m比特,可纠t=(d-1)2个错误。设A为GF()的本原元,码的生成多项式为g(x)=(x-)(x-) (4.1)由g(x)所生成的系统码的生成矩阵G为G=,R=
37、(4.2)式中为kk阶单位方阵,R为k(n-k)级矩阵,元素表示的系数,而对于RS码的校验矩阵H,可以由上式得到 (4.3)设信息组为,生成的码字为, 则, 本设计方案中, 选择RS(7,3)码的生成多项式为 (4.4)由g(x)所生成的系统生成矩阵G为 (4.5)由生成矩阵G易得校验矩阵H。所以编码的关键是首先得出生成矩阵G, 而且为了得到G, 必须首先找到生成多项式g(x)。RS(7,3)编码程序的主要部分是移位法求校验元。它由两个步骤构成, 首先完成每次移位时校验元的求解, 然后完成码元的移位。本程序算法中根据校验元多项式来构造校验元。设系统码的多项式 (4.6)其前k位系数是已知的信息
38、位,后n-k位系数是需求的校验元,C(x)为g (x)倍式, 即, 而, 由于最高次数为n-1次, g(x)最高次数为n-k次,q(x)最高次数为k-1次,最低次数为n次, 即中次项系数为0。而的系数由组成, 即, 因, 从而有, 即, (4.7)这表明码字C的第一个校验元可由k 个信息元与h(x)的系数相乘得到, 而由,可得到第二个校验元, 以此类推可得到所有n-k个检验元从而完成RS 码的编码过程。4.1.2 RS(7,3)码的C语言实现RS编码的步骤:RS编码主要是围绕码的生成多项式进行的,其编码器基本可分为2类:N-K级编码器和K级编码器。一般的循环码的编码电路是一个N-K级编码器,该
39、编码器又可分为2类:一种是的乘法电路,另一种是除法电路。1基于多项式乘法电路的编码器,编出来的码字是非系统码,因此在译码时,首先要将信息从接收码中选出,其编码效率明显低于系统码,实际应用中都采用系统码。2基于多项式除法电路的编码器,将信息组乘以,得到,在除以,求得相应的余式r(x),在加原来的信息组组成了码字。本文中采用除法电路来实现RS编码,实现框图如图4-1所示。本文中RS码采用的本原多项式和生成多项式分别为: (4.8) (4.9)N-K级RS编码器主要由一组线性反馈移位寄存器和控制电路组成,是n-k=4级编码器,是线性反馈寄存器的反馈系数,reg4寄存器的值和当前输入的信息码元异或得到
40、的值的就是feedback寄存器的值。编码步骤:1.将所有寄存器清零,门关闭,则3个信息码元一边依次进入信道,一边依次输出。2.当最后一个信息码进入电路后,将门开启,第一个校验位输出,同时寄存器中码元依次右移一位,产生的第一个校验码存入。3.校验码按时钟节拍载入寄存器,并依次输出。如此循环7次,当最后一个校验位输出时,编码结束。图4-1 RS(7,3)码编码器实现电路RS码的编码算法虽比较复杂,但用高级语言来实现不是很难的事,可以撇开硬件单纯从逻辑上考虑。RS(7,3)编码程序流程图如图4-2所示:图4-2 RS(7,3) 编码程序流程图C语言程序源代码如下:#include stdio.hi
41、nt MUL(a,b)int i,j,k,n,m;int GF7=1; for(i=0;i=6;i+)/生成GF2域/ if(GFi=3) GFi+1=GFi1; else GFi+1=(GFi1)&7)3; for(n=0;n=6;n+) if(GFn=a) i=n;for(m=0;m=6;m+) if(GFm=b)j=m;for(k=0;kj;k+)if(a=3) a=a1; else a=(a1)&7)3; return a;void main() int i,c0,c1,c2,c3; scanf(%d%d%d,&c0,&c1,&c2); for(i=0;i=6;i+) c3=MUL(c0,6)MUL(c1,4)MUL(c2,3); printf(%d ,c0); c0=c1;c1=c2;c2=c3; 程序中的函数MUL()是第三章实现GF()域中乘法器所定义的函数。输入4 3 6运行结果如图4-3所示。图4-3 输入4 3 6的编码结果通过图4-3可以看出当输入3位信息位4、3、6时,程序输出一个