实验6 循环码的软件编译码实验.docx
《实验6 循环码的软件编译码实验.docx》由会员分享,可在线阅读,更多相关《实验6 循环码的软件编译码实验.docx(11页珍藏版)》请在冰豆网上搜索。
实验6循环码的软件编译码实验
实验六循环码的软件编、译码实验
一、实验目的
(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=[Cn-1…CrCr-1…C0],其中r=n-k。
码字多项式为:
C(x)=Cn-1xn-1+Cn-2xn-2+…+C1x+C0。
码字的生成多项式为:
g(x)=gr-1xr-1+gr-2xr-2+…+g1x+g0
待编码的信息多项式为:
m(x)=mK-1xK-1+…+m0
xn-k.m(x)=Cn-1xn-1+…+Cn-Kxn-K
对于系统码有:
Cn-1=mK-1,Cn-2=mK-2,…Cn-K=Cr=m0
设监督多项式为:
r(x)=Cr-1Xr-1+…+C1x+C0
根据循环码的定义,则有C(x)=xn-Km(x)+r(x)=q(x).g(x)
Xn-Km(x)=q(x).g(x)+r(x)
r(x)=Rg(x)[xn-Km(x)]
即监督多项式是将多项式xn-Km(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)=Cr-1Xr-1+…+C1x+C0
根据循环码的定义:
生成多项式的倍式均是码字,编码实际上是做xn-Km(x)除以g(x)所得的余式运算求得r(x)。
编码程序框图见图1,二进制多项式除法示意图见图2
图1
编码计算程序框图
111...商数
┌─────
g(x):
10111|1100000.............xrm(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)用xrm(x)=x4(x2+x)=x6+x5除以g(x),如图1所示,得到监督余式r(x)=x2+1。
(3)编出相应的发送码字为:
C(x)=xrm(x)+r(x)
C=1100000+101=1100101
(4)按上述步骤,将得到下述码表:
信息位
监督位
1
000
0000
2
101
0111
3
010
1110
4
011
1001
5
100
1011
6
101
1100
7
110
0101
8
111
0010
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)的伴随式,
Si(x)=Rg(x)[E(x)]
将其作作为本地数据表存储好。
根据已接收码字多项式R(x),计算相应的伴随式:
S(x)=Rg(x)[R(x)]
将实际接收码字求出的S(x)与本地存储的各Si(x)相比较,查出两者相等的那个唯一匹配的Si(x),找出并得到相应的错误图样E(x)。
纠错:
C(x)=R(x)+E(x)
否则由S(x)找不出唯一匹配的Si(x),则报出错信息,表示出现不可纠错的错误图样,即码元出错的个数超出该循环码的纠错能力。
译码流程图3所示:
四、实验代码
/*循环码编译码的实现(7,3)*/
#include
#include
#include
#definen7
#definek3
#defineg23//10111
usingnamespacestd;
intm,d,G,c,B,r;
intE[20],S[20];
intcode()//编码
{
inti,len,re;
charstr[32];
printf("请输入待编码的三位码字:
(以二进制的形式,中间无空格!
)\n");
scanf("%s",str);
len=strlen(str);
m=0;
for(i=0;im+=(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<
c=(c^G);
G=(G>>1);
B--;
}
d=d^c;
printf("编码后的输出码字为:
\n");
for(i=6;i>=0;i--)
if((d&(1<
printf("1");
elseprintf("0");
printf("\n");
returnd;
}
voiddecode()//译码
{
inti,j,flag;
intlen;
charstr[32];
/*打错误图样和其伴随式的对照表*/
for(i=0;i{
E[i]=(1<
//printf("E[i]=%d\n",E[i]);
G=(g<<(k-1));
B=n-1;
c=E[i];
while(B>=(n-k))
{
if((c&(1<
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{
for(j=6;j>=0;j--)
if((E[i]&(1<elseprintf("0");
printf("\t\t");
for(j=6;j>=0;j--)
if((S[i]&(1<elseprintf("0");
printf("\n");
}
/*下面正式译码*/
printf("\n请输入待译码的七位码字:
(以二进制的形式,中间无空格!
)\n");
scanf("%s",str);
len=strlen(str);
m=0;
for(i=0;im+=(str[i]-'0')*(1<<(len-1-i));
G=(g<<(k-1));
B=n-1;
c=m;
while(B>=(n-k))
{
if((c&(1<
c=(c^G);
G=(G>>1);
B--;
}
flag=0;
if(c==0)flag=1;
else
{
for(i=0;iif(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<elseprintf("0");
printf("\n");
}
}
intmain()
{
r=n-k;
code();
decode();
system("pause");
return0;
}
五、实验结果