《信息论与编码实验报告(共34页).doc》由会员分享,可在线阅读,更多相关《信息论与编码实验报告(共34页).doc(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上本科生实验报告实验课程 信息论与编码 学院名称 信息科学与技术学院 专业名称 通信工程 学生姓名 学生学号 指导教师 谢振东 实验地点 6C601 实验成绩 二 一五 年 十一 月 二 一五 年 十一月实验一:香农(Shannon)编码一、实验目的掌握通过计算机实现香农编码的方法。二、实验要求对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。三、实验基本原理 给定某个信源符号的概率分布,通过以下的步骤进行香农编码1、将信源消息符号按其出现的概率大小排列 2、确定满足下列不等式的整数码长Ki ; 3、为了编成唯一可译码,计算第i个消息的累加概率4、将累加概率P
2、i变换成二进制数。5、取Pi二进制数的小数点后K i 位即为该消息符号的二进制码。四、源程序: #include#include#include#include#includeusing namespace std;int main() int N; coutN; cout请输入各符号的概率:endl; double *X=new doubleN; /离散无记忆信源 int i,j; for(i=0;iN;i+) coutXi+1Xi; for(i=0;iN;i+) for(j=i+1;jN;j+) if(XiXj) double temp=Xi;Xi=Xj;Xj=temp; int *K=n
3、ew intN; for(i=0;iN;i+) Ki=int(-(log(Xi)/log(2)+1; if(Ki=(-(log(Xi)/log(2)+1) double *Pa=new doubleN; Pa0=0.0; for(i=1;iN;i+) Pai=Pai-1+Xi-1; string *code=new stringN; for(i=0;iN;i+) for(j=0;j=1) codei+=1; Pai=Pai*2-1; else codei+=0; Pai*= 2; for(i=0;iN;i+) codei= codei.substr(0,Ki); coutsetw(12)信源s
4、etw(12)概率p(x)setw(12)累加概率 Pa(x)setw(8)码长 Ksetw(8)码字endl; for(i=0;iN;i+)coutsetw(12)i+1setw(12)Xisetw(12)Paisetw(8)Kisetw(8)codeiendl; delete X; delete Pa; delete K; delete code; getchar(); return 0;开始五、程序设计的流程图输入信源符号的个数 输出累加概率,码长,码字,自信息量,平均码长,编码,编码效率结束将累加概率转化为二进制码字计算累加概率判断概率和s是否等于1输出错误概率计算自信息量计算编码效率
5、计算平均码长按概率大小对信源排序计算平均码长NY六、调试过程中出现的错误:1、在源代码的基础上添加:#include#include#include#include#includeusing namespace std;2、出现错误的语句double *Pa=new doubleN;pa0=0.0,pai=pai-1+Xi-1;红色部分应该改为和前面绿色的格式一样,不然编译程序时会出现红色部分为定义3、出现错误的语句: retuen 0;retuen书写错误,应改为return。七、实验内容:1、对给定信源进行二进制香农编码,编码结果如下所示: 2、对给定信源进行二进制香农编码,编码结果如下所
6、示: 3、自已选择一个例子进行香农编码,选择的例子为,编码结果如下所示:实验二:费诺编码一、实验目的掌握通过计算机实现费诺编码。二、实验要求对于给定的信源的概率分布,按照费诺编码的方法进行计算机实现。三、实验基本原理 费诺编码的步骤: 1、将概率按从大到小的顺序排列;2、按编码进制数将概率分组,使每组概率和尽可能接近或相等;3、给每组分配一位码元;4、将每一分组再按同样原则划分,重复2和3,直到概率不再可分为止。四、源程序:#include#includeusing namespace std;class DATA/public:DATA()next=NULL;pre=NULL;r=NULL;
7、PXi=1;key0=0;key1=0;key2=0;key3=0;key4=0;key5=0;key6=0;key7=0;key8=0;key9=0;key10=0; char Xi; double PXi; char key11; DATA *next,*pre,*r;DATA *head=new DATA,*p=head;int k=(-1);void encoding(DATA * pp);DATA * sort(DATA * pp);DATA *HEAD=new DATA,*tt=HEAD,*T;void input() double l,sum=0; int n,i; char L
8、; coutn; for(i=0;in;i+)cout请输入一个字符的信源符号: L; cout请输入概率: l; p-Xi=L; p-PXi=l; sum=sum+p-PXi; p-next=new DATA; p-next-pre=p;/ p-r=p-next; p=p-next; if(sum!=1)cout所输入的概率之和是sum不为1,请重新输入next=T; tt-next-pre=tt; tt=tt-next; tt-next=new DATA;tt-next-pre=tt; tt=tt-next; HEAD-next-next-pre=NULL; HEAD=HEAD-next-
9、next; cout对输入信源排序结果如下:next!=NULL;p=p-next)coutXi:PXiendl;cout对输入信源编码结果如下:endl;encoding(HEAD);/*编码*/void encoding(DATA * pp)/double y=1; k+; DATA *head1=pp,*head2; int o=1;while(1)double l=0,z=0; for(int i=1;inext=NULL) break; l=l+pp-PXi; pp=pp-next; head2=pp-pre; for(;pp-next!=NULL;pp=pp-next) z=z+p
10、p-PXi; if(yfabs(l-z)/y=fabs(l-z); pp=head1; o+; continue; else if(z=0&i=2)/z=0,i1表示只有一个概率了coutXi:keynext!=head2-next;u=u-next) u-keyk=0; for(DATA * h=head2;h-next!=NULL;h=h-next) h-keyk=1; head2-pre-next=new DATA; head2-pre-next-pre=head2-pre; encoding(head1); encoding(head2); break;k-;DATA * sort(D
11、ATA * pp)/函数递归后头变到HEAD-next-next.返回值得到最后个head2没有与tt相连,需另设得不到结尾为空的(next=MULL)地址DATA *head1=pp,*head2=pp;if(pp-next=NULL) return pp; for(;pp-next!=NULL;pp=pp-next)if(1-pp-PXi=1-head2-PXi) head2=pp; if(head2-pre=NULL)head2-next-pre=NULL; head1=head1-next;else head2-pre-next=head2-next; head2-next-pre=h
12、ead2-pre; tt-next=sort(head1); tt-next-pre=tt; tt=tt-next; return head2;void main()cout*费诺编码*endl;input(); coutendlendlttttttt2?Y通过求累加和确定分组后每组概率累加和尽可能相等或相近分组点为新分组的第一个编号,其他依次.第一组的信源码字加0,第二组的码字加1分组点为新分组的最后一个编号,其他编号不变Y分组点即第一个编号?NY分组点为该组的第二个?N以分组点为断点,重新编号分为两组输出信源符号,概率,码字,码长结束六、实验内容:1、对给定信源进行二进制费诺编码,编码结果
13、如下所示: 2、对给定信源进行二进制费诺编码,编码结果如下所示:3、自已选择一个例子进行费诺编码选择的例子为,编码结果如下所示:实验三 霍夫曼编码一、实验目的掌握通过计算机实现霍夫曼编码 二、实验要求对于给定的信源的概率分布,按照霍夫曼编码的方法进行计算机实现。三、实验基本原理 霍夫曼编码的步骤:1、 把信源符号按概率大小顺序排列, 并设法按逆次序分配码字的长度。2、 在分配码字长度时,首先将出现概率 最小的两个符号的概率相加合成一个概率3、把这个合成概率看成是一个新组合符号地概率,重复上述做法直到最后只剩下两个符号概率为止。4、完成以上概率顺序排列后,再反过来逐步向前进行编码,每一次有二个分
14、支各赋予一个二进制码,可以对概率大的赋为0,概率小的赋为1。四、源程序:#include#include#include#include#includeusing namespace std;#define MAXVALUE 10000 #define MAXLEAF 30 #define MAXNODE MAXLEAF*2-1 #define MAXBIT 50 typedef struct node char letter; int weight; int parent; int lchild; int rchild;HNodeType;typedef struct char letter
15、; int bitMAXBIT; int start;HCodeType;typedef struct char s; int num;lable;void HuffmanTree(HNodeType HuffNode,int n,lable a) int i,j,m1,m2,x1,x2,temp1; char temp2; for (i=0;i2*n-1;i+) HuffNodei.letter=0; HuffNodei.weight=0; HuffNodei.parent=-1; HuffNodei.lchild=-1; HuffNodei.rchild=-1; for (i=0;in-1
16、;i+) for (j=i+1;jai.num) temp1=ai.num; ai.num=aj.num; aj.num=temp1; temp2=ai.s; ai.s=aj.s; aj.s=temp2; for (i=0;in;i+) HuffNodei.weight=ai.num; HuffNodei.letter=ai.s; for (i=0;in-1;i+) m1=m2=MAXVALUE; x1=x2=0; for (j=0;jn+i;j+) if (HuffNodej.parent=-1&HuffNodej.weightm1) m2=m1; x2=x1; m1=HuffNodej.w
17、eight; x1=j; else if (HuffNodej.parent=-1&HuffNodej.weightm2) m2=HuffNodej.weight; x2=j; HuffNodex1.parent=n+i; HuffNodex2.parent=n+i; HuffNoden+i.weight=HuffNodex1.weight+HuffNodex2.weight; HuffNoden+i.lchild=x1; HuffNoden+i.rchild=x2; void HuffmanCode(int n,lable a) HNodeType HuffNodeMAXNODE; HCod
18、eType HuffCodeMAXLEAF,cd; int i,j,c,p; HuffmanTree(HuffNode,n,a); for (i=0;in;i+) cd.start=n-1; c=i; p=HuffNodec.parent; while (p!=-1) if (HuffNodep.lchild=c) cd.bitcd.start=0; else cd.bitcd.start=1; cd.start-; c=p; p=HuffNodec.parent; for (j=cd.start+1;jn;j+) HuffCodei.bitj=cd.bitj; HuffCodei.start
19、=cd.start; for (i=0;in;i+) HuffCodei.letter=HuffNodei.letter; printf( %c ,HuffCodei.letter); for (j=HuffCodei.start+1;jn;j+) printf(%d,HuffCodei.bitj); printf(n); int main() lable data30; char s100,*p; int i,count=0; for (;) cout / 求哈夫曼编码,直到输入为end结束! /endl; printf( Input some letters:); scanf(%s,s);
20、 if (!strcmp(s,end) exit(0); for (i=0;i30;i+) datai.s=0; datai.num=0; p=s; while (*p) for (i=0;i=count+1;i+) if (datai.s=0) datai.s=*p; datai.num+; count+; break; else if (datai.s=*p) datai.num+; break; p+; printf(n); printf( different letters:%dn,count); for (i=0;icount;i+) printf( %c ,datai.s); pr
21、intf(weight:%dn,datai.num); HuffmanCode(count,data); count=0; return 0;五、程序设计的流程图开始Cd.start=0.stari=numTp.lchild=c?否是Cd.start=1Cd.start=0是i0。 ; 置迭代序号k+1k,转向; 输出的结果; 结束。可以证明,平均互信息具有收敛性,即,所以迭代算法最终能求出任意精度的解。算法的收敛速度与信源初始概率分布的选择有很大的关系,初始分布选择越接近最佳分布,则收敛的速度越快,若初始分布选的正好是最佳分布,则一步就可以求得信道容量。四、源程序:#include #inc
22、lude #include void main() int num_in,num_out; int i,j; cout输入符号的个数为:num_in; cout输出符号的个数为:num_out; cout输入概率为:endl; float *P_in; P_in=new floatnum_in; float *P_out; P_out=new floatnum_out; for (i=0;inum_in;i+) P_ini=1.0/(float)num_in; coutP_ini ; coutendl; cout输入转移概率:endl; float *p_ji; p_ji=new float
23、*num_in; for (i=0;inum_in;i+) p_jii=new floatnum_out; for (i=0;inum_in;i+) for (j=0;jp_jiij; for (i=0;inum_in;i+) float validate=0.0; for (j=0;j1.|validate0.) cout输入数据有误,请检查后再次输入。endl; exit(-1); float *p_ij; p_ij=new float *num_in; for (i=0;inum_in;i+) p_iji=new floatnum_out; float C_Pre,C; C=10.0;
24、double Pe=0.; int r=0; float *p_up; p_up=new floatnum_in; float p_down; do r+; for (j=0;jnum_out;j+) P_outj=0.0; for (i=0;i=0.) for (i=0;inum_in;i+) p_ijij=P_ini*p_jiij/P_outj; else for (i=0;inum_in;i+) p_ijij=0.0; p_down=0.0; for (i=0;inum_in;i+) p_upi=0.0; for (j=0;j=0.) p_upi+=p_jiij*log(p_ijij)/
25、log(2.0); p_upi=pow(2.0,p_upi); p_down+=p_upi; for (i=0;inum_in;i+) P_ini=p_upi/p_down; C_Pre=C; C=log(p_down)/log(2.0); cout第r次的容量为:CPe); cout迭代的次数为:rendl;五、程序设计的流程图输入:否是输出C结束六、实验内容:1、信道转移矩阵为,求信道容量及最佳的概率分布,运行结果如下所示: 2、信道转移矩阵为,求信道容量及最佳的概率分布,运行结果如下所示:3、信道转移矩阵为,求信道容量及最佳的概率分布,运行结果如下所示: 4、自己选择一个例子求信道容量及
26、最佳的概率分布,选择的例子为:,运行结果如下所示:实验五:循环码编码一、实验目的:掌握通过计算机实现系统循环码编码 二、实验要求: 对于给定的消息序列,按照循环码编码的方法进行计算机实现. 三、实验基本原理循环码的编码步骤: 循环码的系统码构造的步骤为: 1)消息多项式乘x n-k 2) x n-km(x)/g(x)=q(x) +r(x)/g(x) 其中:q(x)是商,r(x)是余数 3)C(x)= xn-km(x)+r(x) 四、源程序:#include stdio.h #include #define N 10 void X(int gN,int cN,int r,int n) int d
27、egg,degc,i,k,t,j,e,u,sum=0; int dN2*N=0,CN,RN,aN2*N,qN; degg=r; for(i=0;i=n-r-1;i+) if(ci!=0) degc=n-i-1; break; for(i=0;iN;i+) qi=gi; Ri=ci; k=degc-degg; e=k; for(j=0;jN;j+) for(i=0;i=e;i-) t=qi;qi=qi-e;qi-e=t; for(i=0;i=n-1;i+) ci=(ci+qn-1-i)%2; for(i=0;i=n-1;i+) if(ci!=0) degc=n-i-1; break; e=deg
28、c-degg; u=j; if(e0)break; for(i=0;i=n-1;i+) Ci=(Ri+ci)%2; printf(系统编码的结果为:n); printf(t); for(j=0;j=n-1;j+) printf(%d ,Cj); printf(n); void UX(int gN,int cN,int r,int n) int aN2*N,xN; int i,j,k,sum=0; for(j=0;j=n-r-1;j+) for(i=0;ij;i+) aji=0; for(i=0;i=n-1;i+) aji+j=cj*gi; for(k=i+j;k=2*n-r-2;k+) ajk=0; for(j=0;j=2*n-r-2;j+) sum=0; for(i=0;i