实验六循环码的软件编、译码实验一、实验目的(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;}五、实验结果。