ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:125.15KB ,
资源ID:11126990      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11126990.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(信息论课程设计.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

信息论课程设计.docx

1、信息论课程设计信息论课程设计 专业:信息安全班级:1001学号:3100604017姓名:段惠文报告日期:2012年6月18一、任务说明1、判定唯一可译码输入:任意的一个码(即已知码字个数及每个具体的码字)输出:判决结果(是/不是)输入文件:in1.txt,含至少2组码,每组的结尾为”$”符输出文件:out1.txt,对每组码的判断结果说明:为了简化设计,可以假定码字为0,1串参考算法伪代码:For all do if是的前缀 then将相应的后缀作为一个尾随后缀放入集合中End ifEnd forLoopFor all do For all doif是的前缀 then将相应的后缀作为一个尾随

2、后缀放入集合中Elseif 是的前缀 then将相应的后缀作为一个尾随后缀放入集合中End ifEnd for End forIf thenReturn falseElse if F 中未出现新的元素 thenReturn trueEnd if/能走到这里,说明F中有新的元素出现,需继续End loop2、Shannon编码输入:信源符号个数q,信源的概率分布P输出:每个信源符号对应的Shannon编码的码字输入文件:in2.txt,含至少两组输入,每组包含信源符号个数q和q个信源的概率分布值输出文件:out2.txt,对每组输入的编码结果参考算法伪代码:降序排列For I = 1 to q将

3、累加概率(十进制小数)变换成二进制小数取小数点后个二进制数字作为第i个消息的码字End for3.循环码的编码与译码:要求:(7,4)非系统循环码,其中,g(x)= x3+x+1,先编码(多项式乘法),再译码输入文件:in6.txt,包括至少两组待编码的信息元序列输出文件:out6.txt,对每组信息元的编码和再译码结果二、问题分析、实现原理1、判定唯一可译码根据唯一可译码的判别方法,利用数据结构所学的知识,定义字符串数据类型并利用指针进行编程来实现算法。算法:1、考察C 中所有的码字,若Wi是 Wj的前缀,则将对应的后缀作为一个尾随后缀码放入集合Fi+1中; 2、考察C和Fi俩个集合,若Wi

4、 C是 WjF的前缀或Wi F是 WjC的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中; 3、F=Fi即为码C的尾随后缀集合; 4、若F中出现了C中的元素,算法终止,返回假(C不是唯一可译码);否则若F中没有出现新的元素,则返回真。2、Shannon编码信源符号按概率从大到小顺序排列对信源符号求累加和,表达式:Pi=Pi-1+P(Xi)求自信息量来确定码字长度,自信息量I(xi)=-log(p(xi),码字长度取大于等于自信息量得最下整数。将累加和用二进制数表示,并取小数点后对应码长度的数做为码字3.循环码的编码与译码1.编码过程在编码时,首先需要根据给定循环码的参数确定生成多项式g(

5、x),也就是从的因子中选一个(n-k)次多项式作为g(x);然后,利用循环码的编码特点,即所有循环码多项式A(x)都可以被g(x)整除,来定义生成多项式g(x)。 根据上述原理可以得到一个较简单的系统:设要产生(n,k)循环码,m(x)表示信息多项式,循环码编码方法则其次数必小于k,而m(x)的次数必小于n,用m(x)除以g(x),可得余数r(x),r(x)的次数必小于(n-k),将r(x)加到信息位后作监督位,就得到了系统循环码。下面就将以上各步处理加以解释。(1)用乘m(x)。这一运算实际上是把信息码后附加上(n-k)个“0”。例如,信息码为110,它相当于m(x)+x。当n-k7-34时

6、,m(x)+,它相当于1100000。而希望的到得系统循环码多项式应当是A(x) = m(x) + r(x)。(2)求r(x)。由于循环码多项式A(x)都可以被g(x)整除,也就是: 因此,用m(x)除以g(x),就得到商Q(x)和余式r(x),即 这样就得到了r(x)。(3)编码输出系统循环码多项式A(x)为:2.译码过程对于接收端译码的要求通常有两个:检错与纠错。达到检错目的的译码十分简单,可以由式(8-37),通过判断接收到的码组多项式B(x)是否能被生成多项式g(x)整除作为依据。当传输中未发生错误时,也就是接收的码组与发送的码组相同,即A(x)=B(x),则接收的码组B(x)必能被g

7、(x)整除;若传输中发生了错误,则A(x)B(x),B(x)不能被g(x)整除。因此,可以根据余项是否为零来判断码组中有无错码。需要指出的是,有错码的接收码组也有可能被g(x)整除,这时的错码就不能检出了。这种错误被称为不可检错误,不可检错误中的错码数必将超过这种编码的检错能力。在接收端为纠错而采用的译码方法自然比检错要复杂许多,因此,对纠错码的研究大都集中在译码算法上。我们知道,校正子与错误图样之间存在某种对应关系。如同其它线性分组码,循环编码和译码可以分三步进行:(1)由接收到的码多项式B(x)计算校正子(伴随式)多项式S(x);(2)由校正子S(x)确定错误图样E(x);(3)将错误图样

8、E(x)与B(x)相加,纠正错误。上述第(1)步运算和检错译码类似,也就是求解B(x)整除g(x)的余式,第(3)步也很简单。因此,纠错码译码器的复杂性主要取决于译码过程的第(2)步。基于错误图样识别的译码器称为梅吉特译码器,它的原理图如图8-7所示。错误图样识别器是一个具有(n-k)个输入端的逻辑电路,原则上可以采用查表的方法,根据校正子找到错误图样,利用循环码的上述特性可以简化识三实现源码1、判定唯一可译码#include #include #include struct stringschar *string;struct strings *next;struct strings Fst

9、r, *Fh, *FP;/输出当前集合Void outputstr(strings *str) do coutstringnext; while(str); coutb?b:a; int MAX(int a, int b) return ab?a:b; #define length_a (strlen(CP)#define length_b (strlen(tempPtr)/判断一个码是否在一个码集合中,在则返回0,不在返回1int comparing(strings *st_string,char *code) while(st_string-next) st_string=st_strin

10、g-next; if(!strcmp(st_string-string,code) return 0; return 1;/判断两个码字是否一个是另一个的前缀,如果是则生成后缀码Void houzhui(char *CP,char *tempPtr) if (!strcmp(CP,tempPtr) cout集合C和集合F中有相同码字:endl CPendl 不是唯一可译码码组!next=NULL; cp_temp-string=new charabs(length_a-length_b)+1; char *longstr; longstr=(length_alength_b ? CP : te

11、mpPtr);/将长度长的码赋给longstr/取出后缀 for (int k=MIN(length_a,length_b); kstringk - MIN(length_a,length_b)=longstrk; cp_temp-stringabs(length_a-length_b)=NULL; /判断新生成的后缀码是否已在集合F里,不在则加入F集合 if(comparing(Fh,cp_temp-string) FP-next=cp_temp; FP=FP-next; void main()/功能提示和程序初始化准备 couttt唯一可译码的判断!nstring=new charstrl

12、en(c);strcpy(Ch-string, c); Ch-next=NULL;char f=F :;Fh-string=new charstrlen(f);strcpy(Fh-string, f);Fh-next=NULL;/输入待检测码的个数 Int Cnum; coutCnum; cout输入待检测码endl; for(inti=0; iCnum; i+) couti+1tempstr; CP-next=new (struct strings); CP=CP-next; CP-string=new charstrlen(tempstr) ; strcpy(CP-string, temp

13、str); CP-next = NULL; outputstr(Ch); CP=Ch;while(CP-next-next) CP=CP-next; tempPtr=CP; do tempPtr=tempPtr-next; houzhui(CP-string,tempPtr-string); while(tempPtr-next); outputstr(Fh); struct strings *Fbegin,*Fend; Fend=Fh;while(1) if(Fend = FP) cout是唯一可译码码组!next) CP=CP-next; tempPtr=Fbegin; for(;) te

14、mpPtr=tempPtr-next; houzhui(CP-string,tempPtr-string); if(tempPtr = Fend) break; outputstr(Fh);/输出F集合中全部元素 2、Shannon编码#include#include#include#define max_CL 10 /*maxsize of length of code*/#define max_PN 6 /*输入序列的个数*/typedeffloat datatype;typedefstruct SHNODE datatype pb; /*第i个消息符号出现的概率*/ datatype p

15、_sum; /*第i个消息符号累加概率*/int kl; /*第i个消息符号对应的码长*/int codemax_CL; /*第i个消息符号的码字*/struct SHNODE *next; shnolist;datatype sym_arrymax_PN; /*序列的概率*/void pb_scan(); /*得到序列概率*/void pb_sort(); /*序列概率排序*/void valuelist(shnolist *L); /*计算累加概率,码长,码字*/void codedisp(shnolist *L);void pb_scan() int i; datatype sum=0;

16、 printf(input %d possible!n,max_PN);for(i=0;i); scanf(%f,&sym_arryi); sum=sum+sym_arryi; /*判断序列的概率之和是否等于,在实现这块模块时,scanf()对float数的缺陷,故只要满足.99sum1.0001|sum0.99) printf(sum=%f,sum must (0.999sum1.0001),sum); pb_scan(); /*选择法排序*/void pb_sort() int i,j,pos; datatype max;for(i=0;imax_PN-1;i+) max=sym_arry

17、i; pos=i;for(j=i+1;jmax) max=sym_arryj; pos=j; sym_arrypos=sym_arryi; sym_arryi=max; void codedisp(shnolist *L) int i,j; shnolist *p; datatype hx=0,KL=0; /*hx存放序列的熵的结果,KL存放序列编码后的平均码字的结果*/ p=L-next; printf(numtgailvtsumt-lb(p(ai)tlenthtcoden); printf(n);for(i=0;ipb,p-p_sum,-3.332*log10(p-pb),p-kl); j

18、=0;for(j=0;jkl;j+) printf(%d,p-codej); printf(n); hx=hx-p-pb*3.332*log10(p-pb); /*计算消息序列的熵*/ KL=KL+p-kl*p-pb; /*计算平均码字*/ p=p-next; printf(H(x)=%ftKL=%fnR=%fbit/code,hx,KL,hx/KL); /*计算编码效率*/shnolist *setnull() shnolist *head; head=(shnolist *)malloc(sizeof(shnolist); head-next=NULL;return(head);shnol

19、ist *my_creat(datatype a,int n) shnolist *head,*p,*r;int i; head=setnull(); r=head;for(i=0;ipb=ai; p-next=NULL; r-next=p; r=p; return(head);void valuelist(shnolist *L) shnolist *head,*p;int j=0;int i; datatype temp,s; head=L; p=head-next; temp=0;while(jp_sum=temp; temp=temp+p-pb; p-kl=-3.322*log10(p

20、-pb)+1;/*编码,*/ s=p-p_sum;for(i=0;ikl;i+) p-codei=0;for(i=0;ikl;i+) p-codei=2*s;if(2*s=1) s=2*s-1;else if(2*s=0)break;else s=2*s; j+; p=p-next; int main(void) shnolist *head; system(cls); pb_scan(); pb_sort(); head=my_creat(sym_arry,max_PN); valuelist(head); codedisp(head); system(pause); 3.循环码的编码与译码

21、#include#include#includevoid main() int aa10000; int i; int N; int b47=1,0,0,0,1,0,1,0,1,0,0,1,1,1,0,0,1,0,1,1,0,0,0,0,1,0,1,1;/定义生成矩阵int y=0,s=0; int j,k,m; int a4,q7,rr10000/4*7; int p,D=0; int cc2500,dd2500; int e87=1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0, 0,0,0,0,0,

22、1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0;/定义错误图样int w10000/4*7; int H73=1,0,1,1,1,1,1,1,0,0,1,1,1,0,0,0,1,0,0,0,1;int A=0,M=0,L=8; int f3; int ww10000/4*7;printf(循环码的编码与译码程序:n);printf(请输入你想产生的二进制个数:);scanf(%d,&N); /输入想产生的信源的个数while(N4) printf(输入无效,请重新输入 ); printf(请输入你想产生的二进制个数:); scanf(%d,&N); printf(随机产生的二进

23、制序列为:n); srand( (unsigned)time( NULL ) ); /产生一个随机序列,并把它放入a中 for(i=0;iN;i+) aai=rand()%2; printf(%d,aai); printf(n); printf(编码后变为:n);/编码生成码字 for(m=0;mN/4;m+) for(i=y;i(y+4);i+) ai-y=aai; /取出位出来 for (j=0;j7;j+) qj=0; for(k=0;k4;k+) qj+=ak*bkj;/与生成矩阵相乘 for(i=s;i(s+7);i+) rri=0; rri=qi-s%2; printf(%d,rr

24、i);/将生成的放入rr中 y=y+4;/向后移动位 s=s+7;/向后移动位 printf(n); printf(经过信道后变为:n);srand( (unsigned)time( NULL ) );for(j=0;jN/4;j+) ccj=rand()%100;/产生一个99的随机数if(ccj9)/当随机数小于时,一个码字产生个错误for(i=D;i=9)&(ccj=30)/当随机数在30时,一个码字产生一个错误 ddj=rand()%7; p=ddj; /随机产生一个6的数,以确定是码字一个错误的位置 for(i=D;i(D+7);i+) wi=0; wi=(rri+epi-D)%2; printf(%d,wi);else/当随机数在99时,不发生错误 for(i=D;i(D+7);i+) wi=0; wi=rri; printf(%d,wi); D=D+7;/向后移动位printf(%6d,ccj);/进行跟踪,以确定码字

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1