第五节 系统循环码的编译码电路


综上可知,当被除数是n位二进制数时,低端 输入除法电路要经过n次移位运算得到最后余 数。如果接收端按生成多项式g(x)构成低端 输入除法电路,并把从信道中接收的码字按 接收节拍逐位送入除法电路,那么当n位码元 接收完后,除法电路中寄存器状态便是接收 码字除以生成多项式之后的余式,即伴随式。 这时,低端输入除法电路完成了译码运算。
• 由生成多项式g(x)=1 * x3+0 * x2+1* x+1得 到除数:1 0 1 1; • 由信息多项式m(x)= 1 * x3+1 * x2+1* x+1得 到被除数:1 1 1 1; • 在运算中,当被除数或中间余数的位数不 小于除数位数n-k+1时,若被除数或中间余 数的最高位为1,则商取1,同时将被除数 或中间余数的前面n-k+1位与除数的n-k+1 位模2加,得另一中间余数;
• 从理论上讲,低端输入除法电路也可以完 成编码除法运算。这时被除数为1111000, 电路除法运算过程如表3-6所示。
移位次数 0 1 2 3 4 5 6 7
被除数 1111000 111000 11000 1000 000 00 0
r0 0 1 1 1 0 1 0 1
r1 0 0 1 1 0 1 1 1
三、系统循环码的编码电路
图3-5为g(x)=x3+x+1对应的高端输入除 法电路,它仍由生成多项式g(x)唯一地确定。
• 如果被除数为信 息序列1111,即 m(x)=x3+x2+x+1, 当信息序列送入 该除法电路时, 除法电路的运算 过程如表3-7所 示。这时电路经 过四次移位运算 得到余式111。
二、系统循环码的 译码电路
按照图3-3,当 g(x)=x3+x+1时可以 构成图3-4所示的除 法电路。这种除法电 路的被除数从移位寄 存器的低端输入,所 以称它为低端输入除 法电路。被除数为 1111111,它在低端 输入除法电路中的运 算过程如表3-5所示。
• 该除法电路完成的除法运算,与前面竖式 所做的除法运算一样。前三个移位节拍, 将被除数的高三位逐位移入移位寄存器, 因为这是被除数的位数小于n-k+1=4,高端 始终输出为0。从第4个节拍开始,移位寄 存器的高端开始输出商,寄存器中则留下 运算过程的中间余数的高三位。到第七个 节拍时,被除数全部输入电路,三个寄存 器中留下最后的余数0 0 0。
• 若被除数或中间余数的位数不小于除数位 数n-k+1,但最高位为0,则商取0,同时将 被除数或中间余数的前面n-k+1位模2加与 除数的n-k+1个0位,得新的中间余数,直 到最高位是1,重复前面运算过程;当中间 余数位数等于n-k时,运算结束,这个中间 余数就是最后的余数。
• 多项式的除法运算,还可以用反馈移位寄存器实 现。当除式g(x)为n-k次多项式时,完成除法运算 的电路见图3-3,称为除法电路 除法电路。只要除式g(x)被 除法电路 确定,与它对应的除法电路也唯一地被确定。
• n – k级编码器有两种:一种是g(x)的乘法电 路;另一种是g(x)的除法电路。前者主要利 用方程式C(x) = m(x)g(x)进行编码,但这样 编出的码为非系统码,而后者是系统码编 码器中常用的电路,这里我们只介绍系统 码的编码电路。
• 二元域上多项式的除法运算,可以用多项 式运算,也可以用与多项式对应的二进制 序列运算。 • 例如: • 生成多项式g(x)=x3+x+1生成(7,4)系统循 环码时,对信息多项式m(x)=x3+ x2 + x+1的 编码和对它生成的码字进行译码的除法运 算用可以二进制序列计算。
综上可知,当被除数是n位二进制数时,低端 输入除法电路要经过n次移位运算得到最后余 数。如果接收端按生成多项式g(x)构成低端 输入除法电路,并把从信道中接收的码字按 接收节拍逐位送入除法电路,那么当n位码元 接收完后,除法电路中寄存器状态便是接收 码字除以生成多项式之后的余式,即伴随式。 这时,低端输入除法电路完成了译码运算。
• 比较表3-6和表3-7,低端输入除法电路先要 将被除数逐位移入n-k个移位寄存器,在第 n-k+1个节拍,才从电路高端输出商的第一 位。而高端输入除法电路的被除数从高端 输入,第一个节拍就可以从高端的模2加法 器输出商,相当于把运算提前了n-k个节拍, 因此上时不同的,后者的运算过程不能直 接从除法算式中理解
r2 商 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1
综上可知,当被除数是n位二进制数时,低端 输入除法电路要经过n次移位运算得到最后余 数。如果接收端按生成多项式g(x)构成低端 输入除法电路,并把从信道中接收的码字按 接收节拍逐位送入除法电路,那么当n位码元 接收完后,除法电路中寄存器状态便是接收 码字除以生成多项式之后的余式,即伴随式。 这时,低端输入除法电路完成了译码运算。
• 用高端输入除法电路完成编码运算时,只 需将k位信息码元在向信道发送的同时,也 送入除法电路,当k位信息位发送结束时, k次运算同时完成,在除法电路中便得到信 息位对应的余数。再把信息的余数紧跟信 息位发向信道,就保证了一个码字中的n位 码元向信道发送是不间断的。同理,也可 以使码字与码字之间的发送也是连续的。
第五节 系统循环码的编译码电路
一、除法电路
系统循环码的编码是将信息多项式 m(x)乘以xn-k,再除以生成多项g(x),把所 得余式r(x)与xn-km(x)模2加,便得到码字 c(x)=xn-km(x)+r(x)。译码时用接收码字去 除以生成多项式g(x),判余式是否为零。 由此可见,无论编码还是译码,都要进行 多项式的除法运算,求余式。
• 在计算机通信中,可以直接用串行接口电 路对传送的信息信息实现循环码的编码和 译码效验。串行接口电路内部都包含有生 成多项式的对应的编码和译码电路。因此 可以通过对串行接口电路的初始化编程, 使信息在通过串行接口电路发送和接受时, 同时自动完成循环码的编码和译码除法运 算。
合集下载

电力系统远动第二版 考试重点

电力系统远动第二版 考试重点

1“四遥”功能:①遥测:远程测量,传输被测变量值.②遥信:远程指示,如告警\开关位置等状态.。

对状态信息的远程监视。

③遥控:传送改变运行设备状态的命令。

④遥调:远程调节,传送改变运行设备参数的命令。

2,实现远程的手段:配置必要的自动装置;设国家调度,大区网调,省级调度和地区调度等各级调度中心。

2两种传输模式:循环传输模式CDT或问答传输模式poling3五级调度:国家调度、大区网调、省级调度、地区调度和县级调度。

4电力系统调度中心的任务:1 合理调度发电厂出力2 迅速排除故障3 实时了解,决策调整5远程监控:远动技术在电力系统中的应用,使调度员借助遥测和遥信,监视远方运行设备的实时运行状况;借助遥控和遥调,完成对远方运行设备的控制.即远程监视和远程控制。

6,远程信息内容:包括①遥测信息,②遥信信息,③遥控信息,④腰调信息。

①分为电量和非电量两类。

②用“1”“0”表示出一个遥信对象的两种不同状态。

遥测信息称为上行信息。

③是传送改变运行设备状态的命令。

必须进行返回校核。

④传送改变运行设备参数的命令。

遥调信息和遥控信息称为下行信息。

7,远程信息传输模式:①循环传输模式CDT②问答传输模式polling。

①信息的传送是周期性的,周而复始的,发端不顾及收端的需要,也不要求收端给予回答。

②必须由调动主动像厂站端发送查询命令报文,厂站端按调度端的查询要求发送回答报文(按需传送,必须保证有上下行信道。

)8,远东信息的编码:远动信息在传输前,必须按有关规定,把远动信息变换成各种信息字或各种报文。

9,远动信道:传输远动信号的通道。

包括专用有线信道,复用电力线载波信道,微波通道,光纤信道,无线电信道等。

10,远动系统的设备:厂站端远动装备,调度端远动装置,远动信道。

11远动系统配置类型:①点对点配置,②多路点对点配置,③多点星形配置,④多点共线配置,⑤多点环形配置。

①专用的传输链路想连接。

②东故宫各自链路与多个站相连的一种配置。

循环码的译码

循环码的译码

纠错能力与正交一致校验矩阵 的关系
一个线性分组码若在任一位上都能建立J个正交 一致校验和式,则该码能纠正t≤J/2个错误. t≤J/2 大数逻辑译码:当要判断第I位码元处是否发生 错误时,可以根据J个该位的正交一致校验和式 为0的个数来判断,如果为不为0的个数大于J/2 时则该位有错,否则该位正确.
循环码译码算法之一: 伴随式译码
将常数项(或最高项)非零的可纠错误 图案E(x)组成一个集合,计算它们的伴随 式,构成一张表.译码时,先计算出S(x), 然后对其做0, 1, …, n-1次模g(x)移位,得 到Sj(x).比较Sj(x)是否在可译表中,若在, 则得到循环移位j次后的错误图案.
运算量分析
纠t个错的(n,k)线性分组码译码所需错误 图案表大小为
n t
,而纠t个错的(n,k)循
t 1
环码译码所需错误图案表大小为 n 1,
循环码伴随式译码举例
纠一个错的循环码:汉明码
– 共有n种可纠的错误图案,而它们都是 000…001 000…001(伴随式为S0(x))的循环移位.因 S (x) 此它们可以归为一类,即对计算出的S(x)做 0~n-1次模g(x)移位,直到出现S0(x)为止,将 R(x)做相应次移位后最后一位反转,再做剩 余的移位,即得到正确的译码结果.可见伴 随式表可以大大缩小.
线性分组码小结
为了分析和译码的方便而引入线性分组 为了同样的原因引入循环码 为了分析循环码而引入近世代数 循环码是模xn-1剩余类结合代数是的理想 用根定义的循环码 循环码的译码
�
时非变对称DMC中的最大似然准则
对接收矢量R,和一个可能的许用码矢量C,它 们的相应的似然值为∏iP(ri|ci),这里用到了信 道的无记性,再利用非时变性和对称性得 Pcm[(1-Pc)/(M-1)]n,其中m为序列中ri=ci的符号 个数,n为序列中ri≠ci的符号个数,M为符号集 大小;此外根据最大似然准则且在信道容量不 为0的情况下,有Pc >(1-Pc)/(M-1).因此有最小 差错概率的序列就是与R的汉明距离最小的序 列.

循环码编译码实验ppt课件

循环码编译码实验ppt课件
X 1 X 1 4 X 1 3 X 1 2 X 1 1 X 9 0 X 8 X 7 X 6 X 5 X 4 X 3 X 2 X 1 X 0
SE•HT
CP K1 K2
1 1 1 1 0 0 1 0 0 0 0 0 0 0 0
0 1 1 1 1 0 0 1 0 0 0 0 0 0 0
0 0 1 1 1 1 0 0 1 0 0 0 0 0 0
2、封锁性:循环码中任两个码组之和〔模2〕必定为该码组集合中的一个码组。 如 0100110+ 0010010=0110100也为一个码组
〔二〕生成多项式与编译码电路的关系
编码:循环码的码多项式可表示为 到的余式,代表监视位。结论:只需知道
,其中 为 就能构造编码器。
与 相除得
译码:由于 就可以构造一个除法电路,把接纳码组除以 字没有错码,否那么有错码。
数字通讯原理实验 循环码编、译码实
验
指点教师:李冰、梁仕文
一、实验目的
❖ 1. 了解生成多项式g(x)在循环码编码器和译码器之间的关系。 ❖ 2.了解码距与纠、检错才干之间的关系。
二、循环码引见
〔一〕循环码是一类很重要的线性码,具有循环性和封锁性。
1、循环性:循环码中任一码组循环一位〔将最右端的码移至左端〕以后,仍为该 码中一个码组。如0100110为一个码组,那么0010011也为一个码组。
随
发生2个错码
其中一个错码在正交位(e14)上 A3 A2 A1 A0中有三个“1”
式
两个错码均在非正交位上
A3 A2 A1 A0中有两个“1”或0个“1”
修
发生3个错码
超出纠错范围,不研究
正
结论:当三个或以上的正交方程为1时,正交位有 错码,需求纠错;当三个以下的正交方程为1时,

循环码的编码电路6.6循环码的译码6.7循环汉明码

循环码的编码电路6.6循环码的译码6.7循环汉明码

*
*
6.5 循环码的编码电路
*
6.5.1 非系统码编码电路
循环码码式是生成多项式倍式。 非系统编码电路/循环码乘法编码电路 输入 a(x)=m(x), m(x)的次数 <k 输出 a(x)g(x)=C(x)即是码式,C(x)的次数 <n 举例:生成 (7,4) 汉明码的生成多项式为 g(x)=x3+ x2+1,非系统编码电路如图6.13所示。电路共工作7个时钟节拍。
*
6.5.2 系统码编码电路
*
(2) 用 (n-k) 级移位寄存器实现的编码电路 循环码编码电路结构和工作原理 工作原理:二元 (n,k) 循环码的编码是将信息多项式 m(x) 乘 xn-k 后再除以生成多项式 g(x) 求出它的余式,即为监督数字多项式 r(x)。 二元 (n,k) 循环码的编码电路就是以 g(x) 为除式的除法电路,而输入的被除式为 xn-km(x) 。 实际的编码电路如图6.15所示。 其级数等于 g(x) 的次数 (n-k) ; 反馈连接决定于 g(x) 的系数 当 gi=0 时 (i=0,1,2,…, n-k),反馈断开; 当 gi=1 时,对应级加入反馈。
*
*
6.6.1 接收矢量伴随式计算
设 E(x) 为 R(x) 的错误图样,那么 R(x)=C(x)+E(x),由于 C(x)为 g(x) 的倍式,所以
S(x)≡C(x)+E(x)≡E(x) (mod g(x)) 上式表明:伴随式是由错误图样决定的,与具体码字无关。 说明:循环码伴随式的表示式 (6.4) 是由系统码推出的,但由于伴随式仅与错误图样有关,因而对非系统码也是适用的。
工作过程:
x7+1=(x+1)(x3+x+1)(x3+x2+1) 任取一个三次因式为监督多项式 h(x)=x3+x+1 得 h3=1, h2=0, h1=1, h0=1

循 环 码

循 环 码

(2) 求 R(x) : R(x)是 xr m(x)除以 g(x) 得到的余项。
xr g
mx x
Qx
Rx gx
(3)将R(x) 加在信息位之后作为监督码,组成多项式A(x)。
Ax xr mx Rx
则码编码电路
表 10.6 (7,3)循环码的编码过程
现代通信原理
循环码
1.1 循环码的基本概念
循环码是一种具有循环性的线性码(具有封闭性) 。 一个(n, k) 线性分组码, 如果每个码组任意循环移位
后仍然是一个线性分组码 , 则称此码组为循环码。
例(7,3)循环码:g(x)= x4 + x3 + x2+ 1
表 10.5 (7,3)循环码
为了利用代数理论研究循环码,可以将码组用代数多
2. 译码过程
循环码的译码可以分三步进行:
(1)由接收到的码多项式B(x)计算校正子(伴随式)多项 式S(x); (2)由校正子S(x)确定错误图样E(x); (3)将错误图样E(x)与B(x)相加,纠正错误。
检错: 设接收码组为B(x), 作B(x) / g(x), 若能除尽(余
式为0),则B(x)为码多项式,表示传输无错码;若余 式不为0,则有错码。
纠错: 建立 B(x) / g(x) 的余式与错误图样的一一对应关
系。根 据余式得到错误图样E(x) , 则A(x)= B(x) -E(x)
或通过计算校正子S, 利用类似 表10-4的关系,确定错 码的位置。
由上述分析可知,只要找到循环码的生成多项式g(x), 就决定了编码、译码、纠错能力。
但在实际的系统设计中,往往要按给定的纠正随机错 误的个数来寻找 g(x)。
+
D0

循环码的编译码方法..

循环码的编译码方法..

循环码的编译码方法..***************** 实践教学****************** 兰州理工大学计算机与通信学院2013年秋季学期《计算机通信》课程设计题目:(15,7)循环码的编译码方法专业班级:通信工程一班姓名:学号:指导教师:成绩:摘要本次课程设计研究的是循环码的编译码方法,在设计过程中,首先要介绍了线性分组码的编码和译码原理,并介绍了循环码的定义及其相关内容;其次给定的生成多项式g?x?求解出了生成矩阵和监督矩阵,并且利用MATLAB编写循环码的编码器和译码器代,实现编码及译码功能;求出该码的最小码距,并分析讨论该码的纠错能力以及在高斯信道下的误码性能。

关键词: 循环码;编码;译码;MATLAB 目录一前言............................................................... ..................................................................... .................................. 1 二循环码编译码的基本原理............................................................... ...................................................................2 循环码的简介............................................................... ..................................................................... ......... 2 循环码的定义............................................................... ....................................................................2 线性分组码与循环码的区别............................................................... ............................................3 循环码的最小码距............................................................... ............................................................ 3 循环码的检纠错能力...............................................................环码编译码原理及过程............................................................... (4)循环码的编译码原理............................................................... ........................................................ 4 循环码编译码的............................................................... (5)三系统分析............................................................... ..................................................................... .......................... 7 循环码编译码方法的实现框图............................................................... ................................................. 7 循环码编译码实现过程............................................................... . (8)四系统设计....................................................................................... 10 生成矩阵和监督矩阵............................................................... . (10)循环码的编码............................................................... ..................................................................... ....... 10 循环码的的译码............................................................... ..................................................................... ... 11 循环码在高斯信道下的误码性能............................................................... ............................................ 13 总结............................................................... ..................................................................... .. (14)线性分组码与循环码的区别线性分组码是同时具有分组特性和线性特性的纠错码。

(完整)循环码的编码与译码

循环码是线性分组码中一个重要的子类,具有检错纠错能力强,实现方便等特点.它具有严密的代数学理论,封闭性与循环性.(n,k)循环码表示信息位为k位,监督位为(n-k)位.本次设计实验首先分析了(7,4)循环码的编码与译码原理,然后,用C语言实现其编码与译码功能。

通过C语言平台运行所编写的程序,观察了在输入信息码情况下输出对应的编码结果以及相反的译码功能。

通过多组的对比验证了该(7,4)循环码的编译码程序的正确性。

最后,在程序运行的过程中进一步分析循环码的编译码原理,并通过比较仿真模型与理论计算的性能,证明了仿真模型的可行性。

关键词:循环码,编码与译码,C程序。

现代通信的发展趋势为数字化,随着现代通信技术的不断开发,差错控制技术已日趋成熟,在各个领域都得到了广泛的应用和认同。

本文就(7,4)循环码的编码与译码原理进行C语言的编程及运行仿真。

现代社会发展要求通信系统功能越来越强,可靠性越来越高,构成也越来越复杂;这就要借助于功能强大的计算机辅助分析设计技术和工具才能实现。

现代计算机科学技术快速发展,已经研发出了新一代的可视化的仿真软件。

这些功能强大的仿真软件,使得通信系统仿真的设计和分析过程变得相对直观和便捷,由此也使得通信系统仿真技术得到了更快的发展。

本文使用的是功能强大的C语言软件。

C语言是一种使用简便的、特别适用于科学研究和工程计算的高级语言,与其他计算机语言相比,它的特点是简洁和智能化,具有极高的编程和调试效率.通过使用C工具箱函数对数字调制进行仿真,更能直观彻底的掌握循环码的编码与译码原理。

有助于我们的学习和研究,加深对知识的理解和运用. C的便利性还体现在它的仿真结果还可以存放到的工作空间里做事后处理。

方便我们修改参数对不同情况下的输出结果进行对比。

目录第1章概述 (1)第2章计算机通信与纠错码 (2)2。

1 计算机通信技术 (2)2.1.1 通信的概念 (2)2。

1。

2 通信的发展史简介 (2)2。

第五节 系统循环码的编译码电路.


• 例如: • 生成多项式g(x)=x3+x+1生成(7,4)系统循 环码时,对信息多项式m(x)=x3+ x2 + x+1的 编码和对它生成的码字进行译码的除法运 算用可以二进制序列计算。
• 由生成多项式g(x)=1 * x3+0 * x2+1* x+1得 到除数:1 0 1 1; • 由信息多项式m(x)= 1 * x3+1 * x2+1* x+1得 到被除数:1 1 1 1; • 在运算中,当被除数或中间余数的位数不 小于除数位数n-k+1时,若被除数或中间余 数的最高位为1,则商取1,同时将被除数 或中间余数的前面n-k+1位与除数的n-k+1 位模2加,得另一中间余数;
• 从理论上讲,低端输入除法电路也可以完 成编码除法运算。这时被除数为1111000, 电路除法运算过程如表3-6所示。
ห้องสมุดไป่ตู้
移位次数
0 1 2
被除数
1111000 111000 11000
r0
0 1 1
r1
0 0 1
r2 商
0 0 0 0 0 0
3 4
5 6 7
1000 000
00 0
1 0
1 0 1
综上可知,当被除数是n位二进制数时,低端 输入除法电路要经过n次移位运算得到最后余 数。如果接收端按生成多项式g(x)构成低端 输入除法电路,并把从信道中接收的码字按 接收节拍逐位送入除法电路,那么当n位码元 接收完后,除法电路中寄存器状态便是接收 码字除以生成多项式之后的余式,即伴随式。 这时,低端输入除法电路完成了译码运算。
• 用高端输入除法电路完成编码运算时,只 需将k位信息码元在向信道发送的同时,也 送入除法电路,当k位信息位发送结束时, k次运算同时完成,在除法电路中便得到信 息位对应的余数。再把信息的余数紧跟信 息位发向信道,就保证了一个码字中的n位 码元向信道发送是不间断的。同理,也可 以使码字与码字之间的发送也是连续的。

循环码编译码工作过程

循环码编译码工作过程可以概括为以下几个步骤:一、循环码编码过程1. 生成多项式选择:循环码的编码过程中,需要选择合适的生成多项式,以便将输入的数据符号转换成循环码序列。

常见的生成多项式有GF(2^m)中的最小多项式、标准多项式等。

2. 输入数据符号的编码:将输入的数据符号转换成二进制码字,可以采用简单的模2加法或利用编码算法进行转换。

3. 生成多项式扩展:将二进制码字通过生成多项式进行扩展,得到循环码的码字。

由于循环码是循环移位对称的,因此可以通过将码字循环移位得到不同的码字。

4. 校验位添加:根据循环码的校验规则,添加校验位,以确保编码后的码字是正确的循环码序列。

二、循环码解码过程1. 循环移位:将接收到的码字进行循环移位,使其与发送的码字匹配。

2. 校验位检查:根据循环码的校验规则,检查接收到的码字中的校验位是否正确。

3. 错误检测与纠正:如果校验位不正确,需要根据错误的位置和大小进行错误检测和纠正。

如果错误数量较少且位置相对固定,可以采用简单的错误纠正算法;如果错误数量较多或位置不固定,则需要利用更复杂的算法进行错误检测和纠正。

4. 数据恢复:根据解码过程中得到的正确的二进制码字,恢复原始数据符号。

需要注意的是,循环码的编码和解码过程都涉及到多项式的运算,因此需要选择合适的算法和工具进行实现。

同时,为了保证编码和解码的正确性和效率,还需要对传输过程中的干扰和噪声等因素进行考虑和处理。

在实现循环码的过程中,可以采用硬件或软件的方式。

对于硬件实现,可以利用数字电路和微处理器等技术进行设计;对于软件实现,可以利用编程语言和算法库等进行编写。

在实际应用中,需要根据具体的需求和环境选择合适的方式。

总之,循环码是一种重要的编码技术,具有较高的可靠性和效率。

了解循环码的编译码工作过程,对于在实际应用中实现循环码、优化编码和解码性能、提高通信系统的性能具有重要意义。

循环编码

汕头大学工学院三级项目报告课程名称:信息论与编码课程题目:循环码的编码和译码程序设计指导教师:唐雅娟系别:电子工程系专业:电子信息工程学生姓名:曾煌冠学号: 09141014完成时间: 2012 年 5月4日至 5月14日成绩:评阅人:唐雅娟循环码的编码和译码程序设计一. 循环码编码和译码原理简介: 1. RS 循环码编码原理与特点:首先令22112211()...t t n t t n m x c x c x c x ----=+++和210121()...t t r x c c x c x --=+++分别表示信息多项式与校验多项式,则一个RS 码的多项式表达式为:()()()c x m x r x =+如果()c x 为一个码字,则它必须为生成多项式()g x 的位数,即:()()()c x q x g x =编码的过程就是从()m x 和()g x 中寻找()p x ,它可通过除法算法来完成。

即用()m x 除以()g x 得到:()()()()m x q x g x p x =+(1式)同时令()r x =-()p x ,则有()()()()()q x g x m x r x C x =+=。

2. RS 循环码译码原理与特点:(1) 能纠正t 个符号差错的(n ,k )RS 码,数据段中包含k 个信息符号和2t个校验符号。

设存贮器系统数据输出的多项式(妈接收字多项式)可以表达为11()n n i n i i R x r x ---==∑,差错图样多项式为11()n n i n i i E x e x ---==∑,纠错后的码多项式为11()n n i n i i C x c x ---==∑,伴随式多项式为()S x ,差错定位多项式为()x σ。

3.RS循环码的基本步骤及实现循环码的程序流程图:Array4.主要源程序:/*输入的信息元:m(x)*/void information_element(unsigned char mx[K]) {unsigned char tem;srand((unsigned)time(0));for (unsigned int i=0;i<K;i++) {tem = rand()%6+1;if (tem == 1) mx[i] = 'a';else mx[i] = tem + 48;}}/*确定被除数:x^(n-k)m(x)*/void count_dividend(unsigned char dividend[],unsigned char mx[]) { for (int i=0;i<N;i++) {if (i>=K) { dividend[i] = '0';continue; }dividend[i] = mx[i];}}/*gx各项乘以被除数的第一项系数;注意:符号'0'的ASCII码为48*/ void for_mod2(unsigned char tem[],unsigned char c){ unsigned int i;switch (c){ case '1':for (i=0;i<5;i++) tem[i] = gx[i];break;case 'a':for(i=0;i<5;i++){if (gx[i] == '1') tem[i] = 'a';else if (gx[i] == 'a') tem[i] = '2';else tem[i] = gx[i] + 1;}break;default:for(i=0;i<5;i++){ if (gx[i] == '1') tem[i] = c;else if (gx[i] == 'a') tem[i] = (int)c + 1;else tem[i] = (int)gx[i] + (int)c - 48;}break;}/*应用课本第153页的表6-7的关系式转换*/for (i=0;i<5;i++){ if (tem[i] == '8') tem[i] = 'a';if (tem[i]>'8'&& tem[i]!='a') tem[i] -= 7;if (tem[i]=='7') tem[i] = '1';}}/*与GF(2^3)扩域(课本153页)匹配*/unsigned char math(unsigned char ctem[]){unsigned char c = '0';//当两系数相同时(即a^i+a^i=0)为0if (ctem[0]=='0'&&ctem[1]=='0'&&ctem[2]=='1') c = '1';if (ctem[0]=='0'&&ctem[1]=='1'&&ctem[2]=='0') c = 'a';if (ctem[0]=='1'&&ctem[1]=='0'&&ctem[2]=='0') c = '2';if (ctem[0]=='0'&&ctem[1]=='1'&&ctem[2]=='1') c = '3';if (ctem[0]=='1'&&ctem[1]=='1'&&ctem[2]=='0') c = '4';if (ctem[0]=='1'&&ctem[1]=='1'&&ctem[2]=='1') c = '5';if (ctem[0]=='1'&&ctem[1]=='0'&&ctem[2]=='1') c = '6';return c;}/*mod2加*/void mod2(unsigned char dividend[],unsigned char tem[],unsigned char remainder[]){ unsigned int k;for (unsigned int j=1;j<5;j++){ unsigned char tem1[3]; unsigned char tem2[3];/*被除数对应到GF(2^3)扩域,增加三位都是'0'的情况*/switch (dividend[j]){case '1':for (k=0;k<3;k++) tem1[k] = GF[0][k];break;case 'a':for (k=0;k<3;k++) tem1[k] = GF[1][k];break;case '0':for (k=0;k<3;k++) tem1[k] = '0';break;default:unsigned int n = dividend[j] - 48;for (k=0;k<3;k++) tem1[k] = GF[n][k];}/*gx各项乘以被除数的第一项系数后对应到GF(2^3)扩域,增加三位都是'0'的情况*/switch (tem[j]){case '1':for (k=0;k<3;k++) tem2[k] = GF[0][k];break;case 'a':for (k=0;k<3;k++) tem2[k] = GF[1][k];break;case '0':for (k=0;k<3;k++) tem1[k] = '0';break;default:unsigned int m = tem[j] - 48;for (k=0;k<3;k++) tem2[k] = GF[m][k];}/*异或运算*/unsigned char ctem[3];for (k=0;k<K;k++){ if (tem1[k] == tem2[k]) ctem[k] = '0';else ctem[k] = '1';}remainder[j-1] = math(ctem);/*匹配*/}}/*多项式相除*/void polynomial_division(unsigned char dividend[],unsigned char remainder[],int flag){unsigned char tem[5];unsigned int i,n=5;for (i=0;i<flag;i++){for_mod2(tem,dividend[0]);mod2(dividend,tem,remainder);/*准备下次除法的被除数,如果被除数的第一项为0则被除数数组左移一位,第一,二项都为0则停止*/for (unsigned int j=0;j<R;j++)dividend[j] = remainder[j];dividend[4] = dividend[n++];if (dividend[0] == '0'){if (dividend[1] == '0')break;for (unsigned int k=0;k<K;k++)dividend[k] = dividend[k+1];i ++;n ++;dividend[3] = '0'; }}}/*求余式*/void count_remainder(unsigned char remainder[R]){information_element(mx);unsigned char dividend[N];count_dividend(dividend,mx);polynomial_division(dividend,remainder,K);}/*RS码映射成7个二进制3bit组,对应GF表*/void create_rsc(unsigned char rsc[],unsigned char remainder[],unsigned char rsc_GF[N][K]){unsigned int i,k;for (i=0;i<3;i++){rsc[i] = mx[i]; }for (i=3;i<N;i++){rsc[i] = remainder[i-3]; }for (i=0;i<N;i++){ switch (rsc[i]){ case '1':for (k=0;k<3;k++)rsc_GF[i][k] = GF[0][k];break;case 'a':for (k=0;k<3;k++)rsc_GF[i][k] = GF[1][k];break;case '0':for (k=0;k<3;k++)rsc_GF[i][k] = '0';break;default:unsigned int m = rsc[i] - 48;for (k=0;k<3;k++)rsc_GF[i][k] = GF[m][k];}}}/*BPSK映射:符号‘1’映射成‘1’,符号‘0’映射成‘-’;注意:符号‘-’输出为‘-1’*/void BPSK_mapping(unsigned char rsc_GF[N][K],unsigned char rsc_BPSK[N][K]){ unsigned int i,j;for (i=0;i<N;i++){for (j=0;j<K;j++){if (rsc_GF[i][j] == '1')rsc_BPSK[i][j] = '1';else rsc_BPSK[i][j] = '-';if (rsc_BPSK[i][j] == '-') }}}/*加噪声干扰*/void add_noise(unsigned char rsc_BPSK[N][K]){ srand(unsigned(time(0)));unsigned int n1=1,n2=2;unsigned int m1=1,m2=1;while (1){n1 = rand()%7;n2 = rand()%7;m1 = rand()%3;m2 = rand()%3;if (n1!=n2)break;}//*//*对应的位置取反*/if (rsc_BPSK[n1][m1] == '-') rsc_BPSK[n1][m1] = '1';else rsc_BPSK[n1][m1] = '-';if (rsc_BPSK[n2][m2] == '-') rsc_BPSK[n2][m2] = '1';else rsc_BPSK[n2][m2] = '-';}/*解映射*/void de_mapping(unsigned char rsc_BPSK[N][K],unsigned char de_rsc[N]) { unsigned int i,j;for (i=0;i<N;i++){ for (j=0;j<K;j++){if (rsc_BPSK[i][j] == '-')rsc_BPSK[i][j] = '0';} de_rsc[i] = math(rsc_BPSK[i]); }}/*匹配GF扩域*/void math_GF(unsigned char c,unsigned char c_tem[K]){ unsigned int k;while(1){if (c == '8')c = 'a';if (c>'8'&& c!='a')c -= 7;if (c=='7')c = '1';if (c < '7'|| c=='a')break;}switch (c){ case '1':for (k=0;k<3;k++)c_tem[k] = GF[0][k];break;case 'a':for (k=0;k<3;k++)c_tem[k] = GF[1][k];break;case '0':for (k=0;k<3;k++)c_tem[k] = '0';break;default:unsigned int m = c - 48;for (k=0;k<3;k++)c_tem[k] = GF[m][k];}}/*求伴随多项式*/unsigned char count_sx(unsigned char de_rsc[N],unsigned int f){ unsigned char tem = '0' ,result = '0';unsigned char c_tem1[K];unsigned char c_tem2[K];unsigned char c_tem[K];for (unsigned int i=0;i<N;i++){if (de_rsc[i] == '0')continue;else if (de_rsc[i] == 'a')tem = '1' + (6 - i)*f;else if (de_rsc[i] == '1'){if ((6-i)!=0)tem = '0' + (6 - i)*f;else tem = '1';}elsetem = de_rsc[i] + (6 - i)*f;math_GF(tem,c_tem1);math_GF(result,c_tem2);for (unsigned int k=0;k<K;k++){if (c_tem1[k] == c_tem2[k])c_tem[k] = '0';else c_tem[k] = '1';}result = math(c_tem);}return result;}/*求错误多项式count_ex()的子程序,实现异或运算*/void nor(unsigned char temp1[K],unsigned char temp2[K],unsigned char result[K]){for (unsigned int i=0;i<K;i++){if (temp1[i] == temp2[i])result[i] = '0';else result[i] = '1';}}/*求错误多项式count_ex()的子程序,返回两个行列式相减的结果*/int fun(unsigned char c1,unsigned char c2){ unsigned char temp1[K],temp2[K],result[K];if (c1 == '0')c1 = '1';else if (c1 == '1') c1 = 'a';if (c2 == '0') c2 = '1';else if (c2 == '1') c2 = 'a';math_GF(c1,temp1);math_GF(c2,temp2);nor(temp1,temp2,result);unsigned char c = math(result);if (c == '1') return 0;else if (c == 'a') return 1;else return c-48;}/*求错误多项式*/void count_ex(unsigned char s[R],unsigned char qx[K-1],int n) { unsigned char tem1,tem2; u nsigned char sx[R]; int tem;for (unsigned int i=0;i<n;i++) {if (s[i] == '1') sx[i] = '0';else if (s[i] == 'a') sx[i] = '1';else sx[i] = s[i]; }/*采用行列式法*/if (s[0]!='0'&&s[2]!='0') tem1 = sx[0]+sx[2]-48;else tem1 = '0';if (s[1]!='0') tem2 = sx[1]+sx[1]-48;else tem2 = '0';tem = fun(tem1,tem2);/*Q2=(s3s3-s2s4)/(s1s3-s2s2)*/if (s[2]!='0') tem1 = sx[2]+sx[2]-48;else tem1 = '0';if (s[1]!='0'&&s[3]!='0') tem2 = sx[1]+sx[3]-48;else tem2 = '0';int a = fun(tem1,tem2);qx[0] = a-tem+48;if (qx[0] < '0') qx[0] = qx[0] + 7;/*Q1=(s1s4-s2s3)/(s1s3-s2s2)*/if (s[0]!='0'&&s[3]!='0') tem1 = sx[0]+sx[3]-48;else tem1 = '0';if (s[1]!='0'&&s[2]!='0') tem2 = sx[1]+sx[2]-48;else tem2 = '0';int b = fun(tem1,tem2);qx[1] = b-tem+48;if (qx[1] < '0') qx[1] = qx[1] + 7;}/*搜索错误位置*/void wrong_position(unsigned char tem[2]){ unsigned char qx[K]; unsigned int i,j; unsigned char tem1[K],tem2[K],tem3[K]; unsignedchar temp='0',result;for (i=0;i<N;i++){for (unsigned int j=0;j<K-1;j++) qx[j] = tem[j];/*确保下次循环时错误位置不变*/int n=2; result = '0';for (j=0;j<K;j++){ if (qx[j]=='1') qx[j] = '0';else if (qx[j]=='a') qx[j] = '1';qx[K-1] = '1';/*错误多项式的最后一位是‘1’*/temp = qx[j]+i*n;/*实现x^i*a^i*/n -= 1;math_GF(temp,tem1);math_GF(result,tem2);for (unsigned int k=0;k<K;k++)/*异或运算*/{ if (tem1[k] == tem2[k]) tem3[k] = '0';else tem3[k] = '1';}result = math(tem3); }}}/*译码与纠错*/void decode_rsc(unsigned char de_rsc[N],unsigned char sx[R]){ for (unsigned int i=0;i<R;i++) { sx[i] = count_sx(de_rsc,i+1);}unsigned char qx[K-1];count_ex(sx,qx,R);for (unsigned int j=0;j<K-1;j++){ if (qx[j] == '8') qx[j] = 'a';else if (qx[j]>'8'&& qx[j]!='a') qx[j] -= 7;else if (qx[j]=='7') qx[j] = '1';else if (qx[j] < '0') qx[j] = qx[j] + 7;}wrong_position(qx);}void main(){char GX[R+1];void count_gx(char GX[R+1]);count_gx(GX);unsigned char rsc[N];unsigned char rsc_GF[N][K];unsigned char remainder[R];count_remainder(remainder);create_rsc(rsc,remainder,rsc_GF);unsigned char rsc_BPSK[N][K];BPSK_mapping(rsc_GF,rsc_BPSK);add_noise(rsc_BPSK);unsigned char de_rsc[N];de_mapping(rsc_BPSK,de_rsc);unsigned char sx[R];decode_rsc(de_rsc,sx);cout << endl;system("pause");}5.实验测试结果:二.心得体会:通过这次的实验,让我对循环码有了更深刻的理解。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档