实验6 循环码的软件编译码实验.docx

上传人:b****6 文档编号:16716345 上传时间:2023-07-16 格式:DOCX 页数:11 大小:81.71KB
下载 相关 举报
实验6 循环码的软件编译码实验.docx_第1页
第1页 / 共11页
实验6 循环码的软件编译码实验.docx_第2页
第2页 / 共11页
实验6 循环码的软件编译码实验.docx_第3页
第3页 / 共11页
实验6 循环码的软件编译码实验.docx_第4页
第4页 / 共11页
实验6 循环码的软件编译码实验.docx_第5页
第5页 / 共11页
实验6 循环码的软件编译码实验.docx_第6页
第6页 / 共11页
实验6 循环码的软件编译码实验.docx_第7页
第7页 / 共11页
实验6 循环码的软件编译码实验.docx_第8页
第8页 / 共11页
实验6 循环码的软件编译码实验.docx_第9页
第9页 / 共11页
实验6 循环码的软件编译码实验.docx_第10页
第10页 / 共11页
实验6 循环码的软件编译码实验.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验6 循环码的软件编译码实验.docx

《实验6 循环码的软件编译码实验.docx》由会员分享,可在线阅读,更多相关《实验6 循环码的软件编译码实验.docx(11页珍藏版)》请在冰点文库上搜索。

实验6 循环码的软件编译码实验.docx

实验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;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<

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;i

m+=(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;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<

elseprintf("0");

printf("\n");

}

}

intmain()

{

r=n-k;

code();

decode();

system("pause");

return0;

}

五、实验结果

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2