信息论循环码报告DOC.docx
《信息论循环码报告DOC.docx》由会员分享,可在线阅读,更多相关《信息论循环码报告DOC.docx(17页珍藏版)》请在冰豆网上搜索。
信息论循环码报告DOC
三级项目报告
课程名称:
信息论与编码__________
课程设计题目:
循环码的编码和译码程序设计______
合作者
完成时间:
2012年5月18日至5月21日
成绩:
评阅人:
摘要
循环码是线性分组码中一个重要的子类,具有检错纠错能力强,实现方便等特点。
它具有严密的代数学理论,封闭性与循环性。
(n,k)循环码表示信息位为k位,监督位为(n-k)位。
本次设计实验首先分析了(7,4)循环码的编码与译码原理,然后,用C语言实现其编码与译码功能。
通过C语言平台运行所编写的程序,观察了在输入信息码情况下输出对应的编码结果以及相反的译码功能。
通过多组的对比验证了该(7,4)循环码的编译码程序的正确性。
最后,在程序运行的过程中进一步分析循环码的编译码原理,并通过比较仿真模型与理论计算的性能,证明了仿真模型的可行性。
关键词:
循环码,编码与译码,C程序。
⏹循环码的原理与特点
循环码是线性分组码的一种,所以它具有线性分组码的一般特性,此外还具有循环性。
循环码的编码和解码设备都不太复杂,且检(纠)错能力强。
它不但可以检测随机的错误,还可以检错突发的错误。
(n,k)循环码可以检测长为n-k或更短的任何突发错误,包括首尾相接突发错误。
循环码是一种无权码,循环码编排的特点是相邻两个数码之间符合卡诺图中的邻接条件,即相邻两个数码之间只有一位码元不同,码元就是组成数码的单元。
符合这个特点的有多种方案,但循环码只能是表中的那种。
循环码的优点是没有瞬时错误,因为在数码变换过程中,在速度上会有快有慢,中间经过其它一些数码形式,称它们为瞬时错误。
这在某些数字系统中是不允许的,为此希望相邻两个数码之间仅有一位码元不同,即满足邻接条件,这样就不会产生瞬时错误。
循环码就是这样一种编码,它可以在卡诺图中依次循环得到。
循环码又称格雷码(GreyCode)。
循环码最大的特点就是码字的循环特性,所谓循环特性是指:
循环码中任一许用码组经过循环移位后,所得到的码组仍然是许用码组。
若(
…
)为一循环码组,则(
…
)、(
…
)、……还是许用码组。
也就是说,不论是左移还是右移,也不论移多少位,仍然是许用的循环码组。
循环码编码原理
(1)有信息码构成信息多项式m(x)=
+……+
其中高幂次为k-1;
(2)用
乘以信息多项式m(x),得到的
m(x)最高幂次为n-1,该过程相当于把信息吗(
,
,……,
,
)移位到了码字德前k个信息位,其后是r个全为零的监督位;
(3)用g(x)除
m(x)得到余式r(x),其次数必小于g(x)的次数,即小于(n-k),将此r(x)加于信息位后做监督位,即将r(x)于
m(x)相加,得到的多项式必为一码多项式。
根据上面的讨论,可得到在(7,4)循环码编码的程序框图如图1所下图示:
图2编码程序框图
循环码的译码原理
纠错码的译码是该编码能否得到实际应用的关键所在。
译码器往往比编码较难实现,对于纠错能力强的纠错码更复杂。
根据不同的纠错或检错目的,循环码译码器可分为用于纠错目的和用于检错目的的循环码译码器。
通常,将接收到的循环码组进行除法运算,如果除尽,则说明正确传输;如果未除尽,则在寄存器中的内容就是错误图样,根据错误图样可以确定一种逻辑,来确定差错的位置,从而达到纠错的目的。
用于纠错目的的循环码的译码算法比较复杂,感兴趣的话可以参考一些参考书。
而用于检错目的循环码,一般使用ARQ通信方式。
检测过程也是将接受到的码组进行除法运算,如果除尽,则说明传输无误;如果未除尽,则表明传输出现差错,要求发送端重发。
用于这种目的的循环码经常被成为循环冗余校验码,即CRC校验码。
CRC校验码由于编码电路、检错电路简单且易于实现,因此得到广泛的应用。
在通过MODEM传输文件的协议如ZMODEM、XMODEM协议中均用到了CRC校验技术。
在磁盘、光盘介质存储技术中也使用该方法。
在SystemView中没有提供专用的CRC循环冗余校验码编码器,读者可根据有关参考书设计一个相应的仿真电路。
如果不想亲自动手设计,可以在CDMA库(IS95)中找到一个现成的专用的CRC编码器和译码器。
该图符(FrameQ)是的接入信道的数据帧品质指示编码器,其中使用了多种不同比特率的数据模型,通过CRC校验来判断接入信道的质量好坏。
其中规定每一帧的长度为20ms的数据。
一个典型IS-95-A标准规定的9600信道的CRC测试码的长度为192比特,其中信息位172位、校验位12比特、尾部全零8比特。
感兴趣的读者可以加入一个速率为860bps(192bit/0.2ms=860)的PN数据,然后观察经过CRC编码后的波形。
并可用对应的译码器译码观察输出波形是否与输入的PN码一致。
当码字c通过噪声信道传送时,会受到干扰而产生错误。
如果信道产生的错误图样是e,译码器收到的n重接受矢量是y,则表示为:
y=c+e(13)
上式也可以写成多项式形式:
y(x)=c(x)+e(x)(14)
译码器的任务就是从y(x)中得到
,然后求的估值码字
=y(x)+
(15)
并从中得到信息组
。
循环码译码可按以下三个步骤进行:
(1)有接收到的y(x)计算伴随式s(x);
(2)根据伴随式s(x)找出对应的估值错误图样
;
(3)计算
=y(x)+
,得到估计码字
。
若
=c(x),则译码正确,否则,若
c(x),则译码错误。
由于g(x)的次数为n-k次,g(x)除E(x)后得余式(即伴随式)的最高次数为n-k-1次,故S(x)共有2n-k个可能的表达式,每一个表达式对应一个错误格式。
可以知道(7,4)循环码的S(x)共有2(7-4)=8个可能的表达式,可根据错误图样表来纠正(7,4)循环码中的一位错误,其伴随式如表1所示。
BCH(7,4)循环码错误图样表:
错误图样
错误图样码字
伴随式S(x)
伴随式
E6(x)=x6
1000000
x2
100
E5(x)=x5
0100000
x2+x
110
E4(x)=x4
0010000
x2+x+1
111
E3(x)=x3
0001000
x+1
011
E2(x)=x2
0000100
x2+1
101
E1(x)=x1
0000010
x
010
E0(x)=x0
0000001
1
001
E(x)=0
0000000
0
000
表1BCH(7,4)循环码错误图样表
上式指出了系统循环码的译码方法:
将收到的码字R(x)用g(x)去除,如果除尽则无错;否则有错。
如果有错,可由余式S(x)一一找出对应图样,然后将错误图样E(x)与R(x)模2和,即为所求码字C(x),从而实现纠错目的。
根据前面的讨论,可得(7,4)循环码译码的程序框图如图2所示
是
否
否
图2译码程序框图
基于C语言程序编写
就74循环码的编码与译码程序如附录所示:
运行及分析
运行结果理论分析
由循环码性质我们可以知道,对于(7,4)循环码来说,最小码距d0=4,可以检测出3位错误,纠正1位错误,编码效率为47×100%=57.1%。
设传输信道的误码率为p,据此设定信道模型存在如下关系:
传输正确概率为(1−p)n,信息帧传输错误概率为Pe=1-(1-p)n,每帧仅发生1位错误的概率为Pe=Cn1p(1-p)n-1=np(1-p)n-1,则1位错误帧在总的错误帧中的概率为
表2为其Pe,Pe1,R的模拟结果
P
Pe
Pe1
R/%
10-1
0.521703
0.372009
71.30
10-2
0.0679347
0.0659036
97.01
10-3
0.00697903
0.0069581
99.70
10-4
0.00069979
0.00069958
99.97
10-5
0.000069979
0.00069958
99.97
表2Pe,Pe1,R的模拟结果(n=7)
综合表2的模拟结果和理论分析可知,通信系统的帧传输具有下列性质:
(1)在n一定的条件下,信息帧错误概率随着比特误码率p的增加而增加,最坏条件下帧错误概率几乎为100%,此时系统失去通信能力。
(2)在典型的通信环境下(p为10-3~10-55,帧长n=128~1024,np<1),当p→0时,R→1,表明当比特误码率p足够小的情况下,绝大多数信息帧错误是每帧1位错误,因此纠正每帧1位错误有实际应用价值。
程序运行结果
1.初始化界面
图3
2.正确编码界面
图4
3.正确译码界面
图5
4.信息位有一位错误时的译码界面
图6
5.信息位有二位错误时的译码界面
图7
6.信息位有三位错误时的译码界面
图8
RS码在现代通信系统中的应用
几乎所有的现代化通信系统都把纠错编码作为一个基本组成部分,RS码由于具有强有力的纠错功能,已经被NASA、ESA、CCSDS等空间组织接受,用于空间信道纠错。
RS循环码在车载无线通信、M元扩频通信系统中的应用以及QAM系统等方面都有很广泛的应用,可以说它已经成为无线通信系统中不可或缺的一部分。
实验过程遇到的问题及解决方法
本次实验让我感觉非常棘手,一方面的原因是自己对信道编码的不熟悉,之前做的实验都是对信源进行编码,现在是对信道进行编码;另一方面是书本对于此部分的介绍内容相对较少,要自己在网上找资料学习,网上知识点太泛滥而且很多都是太学术化,不容易理解,因此要自己编程那是难上加难。
此次实验的C程序我也是参考网上其中的一份并在其基础上根据自己的需要加上了自己的部分代码,网上对于这方面的资源真的蛮少,也许是自己找的还不够彻底吧,总的来说,这次实验收获不多,对于这方面还没掌握,我会继续努力。
参考文献
[1]潘新民主编.《计算机通信技术》(第2版).北京.电子工业出版社.2006
[2]孙丽华谢仲华陈荣伶编《信息论与纠错编码》.北京.电子工业出版社.2005
[3]樊昌信著.《通信原理》[M].国防工业出版社.1999.10
[4]宋祖顺著。
《现代通信原理》[M].电子工业出版社.2001.2
[5]黄新亚米央编著《信息编码技术及其应运大全》[M]电子工业出版社1994.8
附录
/*(7,4)循环码的编译及纠检错实现*/
#include
#include
#include
/*函数声明*/
voidBegin();
voidCode();
voidDecoding();
/*主函数*/
main()
{
printf("\nThissoftwaremainfunctioniscarriesonthecodeandthedecodingto(7,3)cycliccode.\n");
Begin();
}
/*进行编码*/
voidCode()
{
intInput[4];
intOutput[7];
intreg[3]={0,0,0};
inttemp,i,j,t;
printf("Pleaseinputtheinformationcode:
");
for(i=0;i<4;i++)
scanf("%d",&Input[i]);/*输入4位信息码*/
for(i=0;i<4;i++)/*进行除法操作*/
{temp=reg[2]+Input[i];/*生成多项式为g(x)=x^3+x^2+1*/
if(temp==2)temp=0;
reg[2]=reg[1]+temp;
if(reg[2]==2)reg[2]=0;
reg[1]=reg[0];
reg[0]=temp;
}
for(i=0;i<4;i++)Output[i]=Input[i];
/*进行编码操作*/
for(i=4;i<7;i++)
{
temp=reg[2];
for(j=2;j>0;j--)
reg[j]=reg[j-1];
reg[0]=0;
Output[i]=temp;
}
printf("________________________________________");
printf("\n");
printf("Theinformationcodeoutputis:
\n");
for(i=0;i<7;i++)
printf("%d",Output[i]);/*输出编码结果*/
printf("\n");
printf("________________________________________");
printf("\n");
Begin();
}
/*译码并进行纠检错*/
voidDecoding()
{intInput[7],Output[7];
intreg[3]={0,0,0};
inttemp,i,d,x,p;
printf("\ninputtheinformationcodeofbit7:
");
for(i=0;i<7;i++)
scanf("%d",&Input[i]);/*输入接受码组*/
for(i=0;i<7;i++)/*进入除法电路*/
{temp=reg[2];/*计算伴随式S(x)*/
reg[2]=reg[1]+temp;
if(reg[2]==2)reg[2]=0;
reg[1]=reg[0];
reg[0]=temp+Input[i];
if(reg[0]==2)reg[0]=0;
}
p=reg[2]+2*reg[1]+4*reg[0];
if(p!
=1&&p!
=2&&p!
=3&&p!
=7&&p!
=8&&p!
=13&&p!
=14&&p!
=0)
{/*输入错误位数大于2位*/
printf("\"Theerror>=2\"\n");
getchar();
exit(0);
}
printf("___________________________________________\n");
printf("s(x)=");
for(i=2;i>=0;i--)
printf("%d",reg[i]);
printf("\n");
for(i=0;i<7;i++)/*纠正一位错误*/
{d=reg[2]*reg[1]*(!
reg[0]);
Output[i]=d+Input[i];
if(Output[i]==2)Output[i]=0;
temp=reg[2];
x=0;/*S(x)进行自发运算以求得错误位数*/
reg[2]=temp+reg[1];
if(reg[2]==2)reg[2]=0;
reg[1]=reg[0];
reg[0]=temp+x;
}/*输出4位信息源*/
printf("Thedecodingbit4is:
");
for(i=0;i<4;i++)
printf("%d",Output[i]);
printf("\n");
printf("TheDecodingbit7is:
");/*输出7位译码结果*/
for(i=0;i<7;i++)
printf("%d",Output[i]);
printf("\n");
printf("___________________________________________\n");
Begin();
}
/*选择操作*/
voidBegin()
{
fflush(stdin);
charch;
printf("-----------------------------------------------------------------");
printf("\n");
printf("--input'c'tocarryonthecode--");
printf("\n");
printf("--input'd'tocarryonthedecodingcode--");
printf("\n");
printf("--input'e'toexitpleaseto--");
printf("\n");
printf("-----------------------------------------------------------------");
printf("\n");
ch=getchar();
if(ch=='c')Code();
elseif(ch=='d')Decoding();
elseif(ch=='\n')Begin();
elseif(ch=='e')exit(0);
else{printf("\"inputerror\"\n");fflush(stdin);Begin();}/*输入错误提示*/
}