实验6 循环码的软件编、译码实验
基于MATLAB的循环码实验报告

课程名称:信息论与编码课程设计题目:循环码的编码和译码程序设计指导教师:系别:专业:学号:姓名:合作者完成时间:成绩:评阅人:一、实验目的:1、通过实验了解循环码的工作原理。
2、深刻理解RS 码构造、RS 编译码等相关概念和算法。
二、实验原理1、RS 循环码编译码原理与特点设C 使某线性分组码的码字集合,如果对任C c c c C n n ∈=--),,,(021 ,它的循环移位),,,(1032)1(---=n n n c c c c C也属于C ,则称该码为循环码。
该码在结构上有另外的限制,即一个码字任意循环移位的结果仍是一个有效码字。
其特点是:(1)可以用反馈移位寄存器很容易实现编码和伴随式的计算;(2)由于循环码有很多固有的代数结构,从而可以找到各种简单使用的译码办法。
如果一个线性码具有以下的属性,则称为循环码:如果n 元组},,,{110-=n c c c c 是子空间S 的一个码字,则经过循环移位得到的},,,{201)1(--=n n c c c c 也同样是S 中的一个码字;或者,一般来说,经过j 次循环移位后得到的},,,,,,,{11011)(---+--=j n n j n j n j c c c c c c c 也是S 中的一个码字。
RS 码的编码系统是建立在比特组基础上的,即字节,而不是单个的0和1,因此它是非二进制BCH 码,这使得它处理突发错误的能力特别强。
码长:12-=mn信息段:t n k 2-= (t 为纠错符号数) 监督段:k n t -=2 最小码段:12+=t d最小距离为d 的本原RS 码的生成多项式为:g(x)=(x-α)(x -α2)(x -α3)…(x -αd -2) 信息元多项式为::m(x)=m0+m1x+m2x2+…+mk -1xk-1循环码特点有:1)循环码是线性分组码的一种,所以它具有线性分组的码的一般特性,且具有循环性,纠错能力强。
循环码的编码和译码

信息编码技术实验艮告三题目:循环码的编码和译码院系:计算机科学与工程学院班级:姓名:学号:【实验目的】1. 通过实验了解循环码的工作原理。
2. 了解生成多项式g(x)与编码、译码的关系。
3. 了解码距d 与纠、检错能力之间的关系。
【实验条件】仪器设备:PC 机,应用软件:Matlab 。
【实验内容]1、编程实现(7,4)系统循环码的编、译码。
已知(7, 4)循环码的生成多项式和校验多项式分别为:£(/)=疋+兀+ 1, h(x) = x 4+x 2+x + U 其生成矩阵和校验矩阵分别为:2、计算出所有的码字集合,可纠错误图样E (X 〉表和对应的错误伴随式表。
【程序代码】% (7,4)系统循环码编码.译码 clc;clear all;close all;n=7;k=4;r=n-k;mx=input ('请输入信息码字:m=\n' ) ; %输入信息码字 gx=[l Oil];x_nk=[l, zeros (1, r)];messg=conv(x.nk> mx); [qx, rxO] =deconv(messg, gx); %模 gx> qx 为所得除式,rxO 为余式 rx=mod (rxO, 2); %将余式rxO 转换为二进制cx=me ssg+rx;%编码码字多项式 c=cx瀚出编码码字 %=====绘图======== fs=1000;ts=l/fs;%fs 为一个单位内的样点 for i=l :n%以方波形式输出编码码字,一个单位内一个码字for j=l :fscx.wave ((i-1) *fs+j) =c (i);end endt=O :ts :n-ts;1 0 1 1000 0 10 1 1 00 G= 00101 1 0000 10 11 1110100 H = 0 1110 10 0011001%循环码生成多项式 %x* (n-k)> %x*(n-k)*mxplot (t, cx_wave); %以方波形式输出编码码字xlabel ('时间');ylabel C 幅度');title C (7,4)循环码编码输出波形');axis([0 7 0 1. 2]);%==^ 码===============S=zeros (1, r); 颂始化校验子gx=[l Oil]; %循环码生成多项式Rx=input (*请输入接收码字:R=\n ) ;%接收码字多项式% Rx=[l 0 1 0 1 1 1];R=Rx;繊收码字[nx, SxO]=deconv(Rx, gx); %接收码字多项式除以gx, SxO为余式(十进制) Sx=mod(SxO, 2); %将SxO转换为G (2)域下多项式S=Sx(5:7); %SxO最后3位为检验子if S=[0 0 0] 燈验子二0disp('There is no wrong!'); % 显示接收码字无错E=[0 0 0 0 0 0 0]; %査表得出错误图样为0C=R; %译码输出为接收码字elseif S=[0 0 1] %接收码字第一位r0错dispC1 r0 is wrong!'); % 显示rO 错E=[0 0 0 0 0 0 1]; %査表得出错误图样C=xor (R, E); %译码输出C=R+Eelseif S=[0 1 0] %rl 错disp('rl is wrong!');E=[0 0 0 0 0 1 0];C=xor (R, E);elseif S=[l 0 0] 紐2 错disp('ir2 is wrong!');E=[0 0 0 0 1 0 0];C=xor(R, E);elseif S=[0 1 1] %r3 错dispC1 r3 is wrong!');E=[0 0 0 1 0 0 0];C=xor (R, E);elseif S=[l 1 0] %r4 错disp('r4 is wrong!');E=[0 0 1 0 0 0 0];C=xor (R, E);elseif S=[l 1 1] %r5 错dispC r5 is wrong!');E=[0 1 0 0 0 0 0];C=xor (R, E);elseif S=[l 0 1] %r6 错dispC* r6 is wrong!1);E=[l 0 0 0 0 0 0]; C=xor (R, E);endC %输出译码码字【实验结果】请输入信息码字:[10 110 10]10 110 1 0 1 1请输入接收码字:R 二 [10 11010 110] There is no wrong!C =10 11 0 1 0 1 1 0【实验心得】通过本次实验,我加深了对循环码的1:作原理的理解,也了解了生成多项式 g(x)与编码、译码的关系和码距d 与纠、检错的关系,在动手实验过程中,对知 识点的印象更加清晰,让我的理解更加深刻了。
循环编译码实验报告

一、实验目的1. 理解循环编译码的基本原理和实现方法;2. 掌握循环编译码的编译过程和性能评估方法;3. 分析循环编译码在不同场景下的应用效果。
二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 实验语言:C++三、实验内容1. 循环编译码的基本原理循环编译码是一种特殊的线性编译码,具有循环结构,可以将信息以循环的方式存储在码字中。
循环编译码具有以下特点:(1)循环结构:码字中的信息以循环的方式存储,即码字的前n个比特与后n个比特相对应;(2)线性结构:码字中的比特之间满足线性关系;(3)性能优越:循环编译码具有较好的纠错性能和抗干扰能力。
2. 循环编译码的编译过程循环编译码的编译过程主要包括以下步骤:(1)码字生成:根据信息比特和校验比特的线性关系,生成码字;(2)码字循环:将码字中的信息比特以循环的方式存储,实现循环结构;(3)码字传输:将码字传输到接收端;(4)码字检测:对接收到的码字进行检测,判断是否存在错误;(5)错误校正:对检测到的错误进行校正,恢复原始信息。
3. 循环编译码的性能评估循环编译码的性能评估主要包括以下指标:(1)纠错能力:循环编译码能够纠正的最大错误数量;(2)误码率:在给定信道条件下,码字中错误比特的比例;(3)抗干扰能力:循环编译码在信道干扰下的性能。
四、实验步骤1. 设计循环编译码的结构:确定码长、信息比特数、校验比特数等参数;2. 编写码字生成函数:根据信息比特和校验比特的线性关系,生成码字;3. 编写码字循环函数:将码字中的信息比特以循环的方式存储;4. 编写码字传输函数:模拟码字在信道中的传输过程;5. 编写码字检测函数:对接收到的码字进行检测,判断是否存在错误;6. 编写错误校正函数:对检测到的错误进行校正,恢复原始信息;7. 评估循环编译码的性能:在不同信道条件下,对循环编译码的纠错能力、误码率和抗干扰能力进行评估。
循环码编译码matlab程序

循环码编译码matlab程序循环码编码程序function [ C ] = cyclic_encoder( Si )%C为循环编码的输出编码结果%对x^8+1进行模2因式分解得到:x^8+1=(x^3+x^2+x+1)*(x^5+x^4+x+1)y=size(Si,2);%y表示Si的列数,即输入码元的个数M=ceil(y/5);%将信息码元分成M帧,一帧5个信息码元n=8;%循环编码的一帧码长k=5;%信息位的个数r=n-k;%监督位的个数gx=[1,1,1,1];%(8,5)循环码的生成多项式g(x)=x^3+x^2+x+1Ai=zeros(1,8*M);%Ai用来存放所输入的码元经过循环编码后的码字Axi=zeros(1,8);%Axi用来表示循环编码后的一帧的编码输出码字mi=zeros(1,5);%mi用来存放每一帧的信息码元for i=1:Mfor j=1:5mi(j)=Si(j+(i-1)*5);endAxi(4:8)=mi(1:5);Axi=circshift(Axi',-r)';%实现(x^(n-k))*m(x),其中m(x)的系数由mi决定[qx,rx]=deconv(Axi,gx);%实现((x^(n-k))*m(x))/g(x),得到商q(x)和余数r(x)Axi=Axi+rx;%实现Axi(x)=Axi(x)+r(x),得到的Axi就是循环编码的编码输出码字Ai(8*i-4:8*i)=Axi(1:5);Ai(8*i-7:8*i-5)=Axi(6:8);end%for循环是为了实现模2相加,使循环编码的输出码字Ai中只有0,1for i=1:8*Mif rem(abs(Ai(i)),2)==0Ai(i)=0;elseAi(i)=1;endendC=Ai;%循环编码的输出码字C=Aiend循环码译码程序function [ So ] = cyclic_decoder( R )%输入R为经AWGN信道传输后的二进制信息,So为循环译码器的译码结果R=1*(R>0.5);%对接收到的信号进行抽样判决y=size(R,2);%y表示R的列数,即输入码元的个数M=ceil(y/8);%将接收到的码元R分成M帧,一帧8个码元So=zeros(1,5*M);%用来存放纠检错之后的译码结果Axo=zeros(1,8);%用来存放纠检错之后每一帧的译码结果%对接收信号进行纠检错译码n=8;%循环编码的码长k=5;%信息位的个数r=n-k;%监督位的个数s=zeros(1,3);%用来存放校正子sh=[1,1,0,0,1,1];%监督多项式h(x)=x^5+x^4+x+1hn=[];%hn(x)为监督多项式h(x)的逆多项式,hn用来放hn(x)的各项系数for i=2:5hn(i)=h(k+2-i);endhn(1)=h(1);hn(6)=h(6);%计算监督矩阵HH=zeros(r,n);%监督矩阵H为r*n阶矩阵H0=zeros(1,n);%用来存放hn(x)的系数H1=zeros(1,n);%用来存放x*hn(x)的系数H2=zeros(1,n);%用来存放x^2*hn(x)的系数H0(3:8)=hn(1:6);H1(2:7)=hn(1:6);H2(1:6)=hn(1:6);H(1,:)=H2(1:8);H(2,:)=H1(1:8);H(3,:)=H0(1:8);flag=0;%出错的标志,为1表示检测出错误for i=1:Mfor j=1:8Axo(j)=R(j+(i-1)*8);ends=Axo*H';%计算校正子sfor k=1:3if rem(abs(s(k)),2)==0s(k)=0;elses(k)=1;endendif s==[0 0 0]if flag==0flag=0;endelseflag=1;endfor k=1:8if rem(abs(Axo(k)),2)==0Axo(k)=0;elseAxo(k)=1;endendSo(1+(i-1)*5:5+(i-1)*5)=Axo(4:8);endif flag==1disp('检测出有错误,但无法纠正!'); elsedisp('没有错误');endend。
循环码编译码实验报告

Harbin Institute of Technology信息论与编码报告题目:循环码编译码实验院(系)电子与信息工程学院班级通信1班学生学号序号哈尔滨工业大学循环码编译码实验1 设计内容循环码是线性分组码中最重要的一类码,它的结构完全建立在有限域多项式的基础上,它具有两个基本特点:一是编码电路与译码电路非常简单,易于实现;二是其代数性质好,分析方便,有一定的成熟的译码方法。
一个(n ,k )线性分组码C ,如果码组中的一个码字的循环移位也是这个码组中的一个码字,则称C 为循环码。
本实验主要完成以下四项内容:(1)利用(7,4)系统循环码的生成多项式为:3()1g x x x =++,请设计该循环码的编码器。
(2)随机产生重量为0或1的八种错误图样中的一种,得到实际接收码字。
(3)根据接收到的码字进行译码,译码方式分为校验子译码和梅吉特译码两种。
(4)对于在BSC 信道传输时的情形进行讨论,验证(7,4)系统循环码的纠错能力。
2 编程环境本实验采用Matlab 作为编程工具,所有代码均在Matlab 软件中运行,此软件功能强大,应用广泛,在此不再赘述。
3 各模块设计3.1 编码器模块利用(7,4)系统循环码的生成多项式为:3()1g x x x =++,请设计该循环码的编码器。
流程图为:图1 (7,4)循环码编码流程图图2 4位信息码元编码流程图在学生设计的演示工具中输入的信息码元可以为任意多个,系统自动按每4个连续的码字一组进行编码,当输入的信息码元不是4的倍数时,自动补零到与信息码元长度最接近的4的倍数。
译码时也是按照每7个连续的码字一组进行译码。
但是为了流程图的清晰明了,在本文的流程图除流程图1以外,其余均按一个循环码码字(即7位)来描述。
编码器模块源程序如下:%%%函数功能:(7,4)系统循环码编码器%%%编程时间:2013-11-29%%%该系统循环码编码器的生成多项式是g(x) = x^3 + x + 1;% %%系统循环码编码的原理是,首先用x^r乘以信息码字多项式m(x),这里r = 3;然后用x^r*m(x)除以生成多项式g(x),% %%得余式r(x);最后得系统循环码多项式c(x) = x^r*m(x) + r(x)function [code_out,code_in_L] = coder(code_in)%%code_in:输入信息码字%%code_out:输出编码后的码字%%L:输入的信息码元的长度n=7;%%每个码字长度k=4;%%每个码字中信息码元长度code_in_L=length(code_in);a=rem(code_in_L,k);%信息码元的长度除以k后的余数if a~=0 %%%信息码元长度不是k的整数倍,则补0array_0=zeros(1,k-a);%%%补零个数code_in=[code_in ,array_0];endcode_in_4=(reshape(code_in,k,length(code_in)/k))';%%%将补零后的码元变成length(code_in)/4行,4列矩阵for loop=1:length(code_in)/kmes_code = [code_in_4(loop,:),zeros(1,3)]; % 在信息码字后面补上三个零,相当于乘上x^rgen = [1 0 1 1]; % 生成多项式向量% 在二元域进行运算,必须把信息码字多项式向量和生成多项式向量转到二元域GF(2)上% 函数gf(X,M)用于从向量X生成GF(2^M)上对应的向量mes_g = gf(mes_code,1);gen_g = gf(gen,1);% 用x^r*m(x)除以生成多项式g(x)[Q,rem_g] = deconv(mes_g,gen_g); % 多项式除法其实就是解卷积运算,得到除法的商式Q,余式rem_g%%相应的,多项式乘法其实是系数的卷积code_rem = rem_g.x; % rem_g.x表示二元域向量rem_g的一个属性,即多项式的系数。
实验6 BCH循环码的编码与译码的matlab实现

实验6 BCH循环码的编码与译码一、实验内容用VC或Matlab软件编写循环BCH码的编码与译码程序。
利用程序对教科书的例题做一个测试。
二、实验环境1.计算机2.Windows 2000 或以上3.Microsoft Visual C++ 6.0 或以上4.Matlab 6.0或以上三、实验目的1.通过BCH循环码的编码与译码程序的编写,彻底了解并掌握循环BCH的编码与译码原理2.通过循环BCH码的编码与译码程序的编写,提高编程能力。
四、实验要求1.提前预习实验,认真阅读实验原理以及相应的参考书。
2.对不同信道的进行误码率分析。
特别是对称信道,画出误码性能图。
即信道误码率与循环汉明码之间的关系。
3.认真填写实验报告。
五、实验原理1.循环BCH的编码与译码原理(略)2.循环BCH的程序实现。
六、实验步骤bch_en_decode.m文件function bch_en_decode()code=bch155code=code+randerr(5,15,1:3);code=rem(code,2);code=gf(code) %随机产生1-3位错误decode=debch155(code)endfunction decode=debch155(code)code=gf(code);M=4;code = gf(code.x,M);[m , n]=size(code);decode=[];code1=[];for i=1:m ;code1=code(i,:);M=code1.m;T2=6;N=15;S = code1* ((gf(2,M,code1.prim_poly)).^([N-1:-1:0]'*([1:T2])));LambdaX = gf([1 zeros(1,T2)],M,code1.prim_poly);Tx = [0 1 zeros(1,T2-1)];L=0;for k = 1:T2;LambdaXTemp = LambdaX;Delta = S(k) - LambdaXTemp(1+[1:L])*(S(k-[1:L]))';if Delta.x;LambdaX = LambdaXTemp - Delta*Tx;if 2*L < k;L = k-L;Tx = LambdaXTemp/Delta;end;end;Tx = [0 Tx(1:T2)];end;LambdaXValue = LambdaX.x;LambdaX = gf(LambdaXValue(1:max(find(LambdaXValue))), M, code1.prim_poly);errLoc_int = roots(LambdaX);errLoc = log(errLoc_int);for i = 1:length(errLoc);errorMag = 1;code1(N-errLoc(i)) = code1(N-errLoc(i)) - errorMag;end;decode=[decode;code1]; end;ccode = gf(decode.x);decoded = ccode(:,1:5);endfunction [yout]=bch155(x) %定义函数k=5; %信息码位,BCH(15,5)if nargin<1x2=randint(5,k);n=5;msg=x2 %判断输入信息 ,若未输入,系统自动产生5组信息码,并显示出信息位elseif rem(length(x),k)==0;n=length(x)/k;x2=[]; %判断msg是否为K的整数倍,并把输入码员分组for i=0:n-1x2=[x2;x(i*k+1) x(i*k+2) x(i*k+3) x(i*k+4) x(i*k+5)];endif rem(length(x),k)>0 %把输入码员补零并分组x=[x,zeros(size(1:k-rem(length(x),k)))];n=length(x)/k;x2=[];for i=0:n-1x2=[x2;x(i*k+1) x(i*k+2) x(i*k+3) x(i*k+4) x(i*k+5)];endendendik=[eye(5) zeros(5,10)]; %输入信息码扩展x3=x2*ik;yout=[];for i=1:ng=[1 0 1 0 0 1 1 0 1 1 1];[w,yo]=deconv(x3(i,:),g); %产生余式yo=abs(rem(yo,2));yout=[yout;yo];endyout=yout+x3; %产生信息码end运行结果:msg =1 1 0 1 00 1 1 0 10 1 0 0 01 1 1 0 10 0 1 0 0code =1 1 0 1 0 1 1 0 0 1 0 0 0 1 10 1 1 0 1 1 1 0 0 0 0 1 0 1 00 1 0 0 0 1 1 1 1 0 1 0 1 1 01 1 1 0 1 0 1 1 0 0 1 0 0 0 10 0 1 0 0 0 1 1 1 1 0 1 0 1 1 code = GF(2) array.Array elements =1 1 0 1 0 1 0 1 0 1 0 0 0 1 10 1 1 1 1 1 1 0 0 0 0 1 01 00 0 0 0 0 1 1 1 1 0 0 0 11 01 1 0 0 1 0 1 1 1 0 1 0 0 0 10 0 1 1 0 0 1 1 1 1 0 1 01 1decode = GF(2^4) array. Primitive polynomial = D^4+D+1 (19 decimal)Array elements =1 1 0 1 0 1 1 0 0 1 0 0 0 1 10 1 1 0 1 1 1 0 0 0 0 1 01 00 1 0 0 0 1 1 1 1 0 1 0 11 01 1 1 0 1 0 1 1 0 0 1 0 0 0 10 0 1 0 0 0 1 1 1 1 0 1 01 1。
(7,3)循环码编译码软件设计(DOC)

摘要本课程设计介绍了(7,3)循环码的编译与译码原理,用C语言编程实现其编码与译码功能。
通过C语言平台运用所编写的程序,输入任意的数字信息序列,得出了编码结果。
着重在无差错和部分差错的情况下进行了译码,并对译码结果进行分析。
关键词:循环码、C语言、编译码目录一、计算机通信 (1)1.1通信的概念 (1)1.2计算机通信介绍 (1)二、系统设计 (2)2.1循环码 (2)2.2 编码原理 (5)2.3译码原理 (6)2.4循环码译码的设计 (6)2.5纠错码 (7)三、设计结果及分析 (9)3.1程序运行结果 (9)3.2运行结果理论分析 (11)3.3软件可行性分析 (12)四、总结 (13)参考文献....................................................... 错误!未定义书签。
附:程序清单. (14)一、计算机通信1.1通信的概念通信就是克服距离上的障碍,从一地向另一地传递和交换消息。
消息是信息源所产生的,是信息的物理表现,例如,语音、文字、数据、图形和图像等都是消息(Message)。
消息由模拟消息(如语音、图像等)以及数字消息(如数据、文字等)之分。
所有消息必须在转换成电信号(通常简称为信号)后才能在通信系统中传输。
所以,信号(Signal)是传输消息的手段,信号是消息的物资载体。
相应的信号可以分为模拟信号和数字信号,模拟信号的自变量可以是连续的或离散的,但幅度是连续的,如电话机、电视摄像机输出的信号就是模拟信号。
数字信号的自变量可以是连续的或离散的,但幅度是离散的,如计算机等各种数字终端设备输出的信号就是数字信号。
通信的目的是传送消息,但对受信者有用的是消息中包含的有效内容,即信息(Information)。
消息是具体的、表面的,而信息是抽象的、本质的,且消息中包含的信息的多少可以用信息量来度量。
通信技术,特别是数字通信技术近年来发展非常迅速,它的应用越来越广泛。
循环码的编译码方法..

循环码的编译码方法..***************** 实践教学****************** 兰州理工大学计算机与通信学院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)线性分组码与循环码的区别线性分组码是同时具有分组特性和线性特性的纠错码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六循环码的软件编、译码实验一、实验目的(1)通过实验了解循环码的工作原理。
(2)了解生成多项式g(x)与编码、译码的关系。
(3)了解码距d与纠、检错能力之间的关系。
(4)分析(7.3)循环码的纠错能力。
二、实验要求用你熟悉的某种计算机高级语言或单片机汇编语言,编制一(7,3)循环码的编、译码程序,并改变接受序列R(x)和错误图样E(x),考查纠错能力情况。
设(7,3)循环码的生成多项式为:g(x)=x4+x3+x2+1 对应(11101)(1)按编、译码计算程序框图编写编、译码程序(2)计算出所有的码字集合,可纠的错误图样E(x)表和对应的错误伴随式表。
(3)考查和分析该码检、纠一、二位错误的能力情况。
(4)整理好所有的程序清单,变量名尽量用程序框图所给名称,并作注释。
(5) 出示软件报告.三、实验设计原理循环码是一类很重要的线性分组码纠错码类,循环码的主要优点是编、译码器较简单,编码和译码能用同样的反馈移存器重构,在多余度相同的条件下检测能力较强,不检测的错误概率随多余度增加按指数下降。
另外由于循环码具有特殊的代数结构,使得循环码的编、译码电路易于在微机上通过算法软件实现。
1、循环码编码原理设有一(n,k)循环码,码字C=[C n-1…C r C r-1…C0],其中r=n-k。
码字多项式为:C (x ) = C n-1x n-1+ C n-2x n-2+… +C1x+C0。
码字的生成多项式为: g(x)= g r-1x r-1+g r-2x r-2+…+g1x+g0待编码的信息多项式为:m(x)=m K-1x K-1+…+m0x n-k.m(x)=C n-1x n-1+…+C n-K x n-K对于系统码有:C n-1=m K-1,C n-2=m K-2,…C n-K=C r=m0设监督多项式为:r(x)=C r-1X r-1+…+C1x+C0根据循环码的定义,则有C(x)=x n-K m(x)+r(x)=q(x).g(x)X n-K m(x)=q(x).g(x)+r(x)r(x)=Rg(x)[x n-K m(x)]即监督多项式是将多项式x n-K m(x)除以g(x)所得的余式。
编码过程就是如何根据生成多项式完成除法运算求取监督多项式的过程。
设循环码(7.3)码的字多项式为:C(x)=C6x6+C5x5+C4x4+C3x3+C2x2+C1x+C0 (n=7)生成多项式为: g(x)=x4+x2+x+1信息多项式为: m(x)=m2x2+m1x+m0 (k=3),设: m(x)=x2+x监督多项式为: r(x)= C r-1X r-1+…+C1x+C0根据循环码的定义:生成多项式的倍式均是码字,编码实际上是做x n-K m(x)除以g(x)所得的余式运算求得r(x)。
编码程序框图见图1,二进制多项式除法示意图见图2图1 编码计算程序框图111 ...商数┌─────g(x): 10111 | 1100000 .............x r m(x) + 10111 ................第一步─────11110+ 10111 ...............第二步────10010+ 10111 ...........第三步────101 ..........余式:x2+1图2 二进制多项式除法示意图编码步骤:(1)n-k=r=7-3=4,用x4乘m(x)•的运算实际上相当于在信息码110后附上4个0,变为1100000(2)用x r m(x)=x4(x2+x)=x6+x5除以g(x),如图1所示,得到监督余式r(x)=x2+1。
(3)编出相应的发送码字为:C(x)=x r m(x)+r(x)C=1100000+101=1100101(4)按上述步骤,将得到下述码表:2、译码原理设R(x)为接收码字多项式,E(x)为错误图样多项式,S(x)为伴随式,则根据循环码的性质有:S(x)=Rg(x)[R(x)]=Rg(x)[E(x)]当R(x)=C(x)时,有E(x)=0,S(x)=0当R(x)不等于C(x)时,有E(x)为非0,S(x)为非0译码过程如下:计算每一种可能被纠的错误图样E(x)的伴随式,S i(x)=Rg(x)[E(x)]将其作作为本地数据表存储好。
根据已接收码字多项式R(x),计算相应的伴随式:S(x)=Rg(x)[R(x)]将实际接收码字求出的S(x)与本地存储的各S i(x)相比较,查出两者相等的那个唯一匹配的S i(x),找出并得到相应的错误图样E(x)。
纠错:C(x)=R(x)+E(x)否则由S(x)找不出唯一匹配的S i(x),则报出错信息,表示出现不可纠错的错误图样,即码元出错的个数超出该循环码的纠错能力。
译码流程图3所示:图3 译码程序流程图四、实验代码/*循环码编译码的实现(7,3) */#include<stdio.h>#include<string.h>#include<iostream>#define n 7#define k 3#define g 23 //10111using namespace std;int m,d,G,c,B,r;int E[20],S[20];int code() //编码{int i,len,re;char str[32];printf("请输入待编码的三位码字:(以二进制的形式,中间无空格!)\n"); scanf("%s",str);len=strlen(str);m=0;for(i=0;i<len;i++)m+=(str[i]-'0')*(1<<(len-1-i));c=(m<<(n-k));d=c;G=(g<<(k-1));B=n-1;while(B>=(n-k)){if((c&(1<<B))==(1<<B))c=(c^G);G=(G>>1);B--;}d=d^c;printf("编码后的输出码字为:\n");for(i=6;i>=0;i--)if((d&(1<<i))==(1<<i))printf("1");else printf("0");printf("\n");return d;}void decode( ) //译码{int i,j,flag;int len;char str[32];/*打错误图样和其伴随式的对照表*/ for(i=0;i<n;i++){E[i]=(1<<i);//printf("E[i]=%d\n",E[i]);G=(g<<(k-1));B=n-1;c=E[i];while(B>=(n-k)){if((c&(1<<B))==(1<<B))c=(c^G);G=(G>>1);B--;}S[i]=c;}/*输出这个表*/printf("\n\n打出的对照表如下:\n\n");printf("错误图样E(x)\t伴随式S[x]\n");for(i=0;i<n;i++){for(j=6;j>=0;j--)if((E[i]&(1<<j))==(1<<j)) printf("1");else printf("0");printf("\t\t");for(j=6;j>=0;j--)if((S[i]&(1<<j))==(1<<j)) printf("1");else printf("0");printf("\n");}/*下面正式译码*/printf("\n请输入待译码的七位码字:(以二进制的形式,中间无空格!)\n"); scanf("%s",str);len=strlen(str);m=0;for(i=0;i<len;i++)m+=(str[i]-'0')*(1<<(len-1-i));G=(g<<(k-1));c=m;while(B>=(n-k)){if((c&(1<<B))==(1<<B))c=(c^G);G=(G>>1);B--;}flag=0;if(c==0) flag=1;else{for(i=0;i<n;i++)if(c==S[i]) {m=m^E[i];flag=1; break;}}if(flag==0) printf("遇到了不能纠正的错误!\n"); else{printf("译码后的输出是:\n");for(j=6;j>=4;j--)if((m&(1<<j))==(1<<j)) printf("1");else printf("0");printf("\n");}}int main(){code();decode( );system("pause"); return 0;}五、实验结果。