信息论与编码实验报告

本科生实验报告

实验课程 信息论与编码

学院名称 信息科学与技术学院

专业名称 通信工程

学生姓名 学生学号

指导教师 谢振东

实验地点 6C601 实验成绩

二〇 一五 年 十一 月二〇 一五 年 十一月

实验一:香农(Shannon )编码

一、实验目的

掌握通过计算机实现香农编码的方法。

二、实验要求

对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。

三、实验基本原理

给定某个信源符号的概率分布,通过以下的步骤进行香农编码 1、将信源消息符号按其出现的概率大小排列

p (x 1) ≥p (x 2) ≥ ≥p (x n )

2、确定满足下列不等式的整数码长K i ;

-l o g 2p (x i ) ≤K i

i -1

3、为了编成唯一可译码,计算第i 个消息的累加概率

p i =

k =1

p (x k )

4、将累加概率P i 变换成二进制数。

5、取P i 二进制数的小数点后K i 位即为该消息符号的二进制码。

四、源程序:

#include

#include #include #include #include using namespace std; int main() { int N;

cout>N; cout

double *X=new double[N]; //离散无记忆信源

int i,j;

for(i=0;i

cout>X[i]; }

for(i=0;i

{ double temp=X[i];X[i]=X[j];X[j]=temp;} int *K=new int[N]; for(i=0;i

K[i]=int(-(log(X[i])/log(2)))+1; if(K[i]==(-(log(X[i])/log(2)))+1) }

double *Pa=new double[N]; Pa[0]=0.0;

for(i=1;i

Pa[i]=Pa[i-1]+X[i-1]; string *code=new string[N]; for(i=0;i

for(j=0;j=1) { code[i]+="1"; Pa[i]=Pa[i]*2-1; }

else

code[i]+="0"; Pa[i]*= 2; } }

for(i=0;i

code[i]= code[i].substr(0,K[i]);

cout

cout

六、调试过程中出现的错误:

1、在源代码的基础上添加: #include #include #include #include #include using namespace std; 2、出现错误的语句

double *Pa =new double[N];[0]=0.0,[i]=[i-1]+X[i-1];红色部分应该改为和前面绿色的格式一样,不然编译程序时会出现红色部分为定义

3、出现错误的语句: retuen 0; retuen 书写错误,应改为return 。

七、实验内容:

x 2x 3x 4x 5x 6x 7⎤⎡X ⎤⎡x 1

1、对给定信源⎢⎥=⎢0. 20. 190. 180. 170. 150. 10. 01⎥进行二进q (X ) ⎣⎦⎣⎦制香农编码,编码结果如下所示:

x 2x 3x 4x 5x 6⎤⎡X ⎤⎡x 1

2、对给定信源⎢=⎥⎢0. 250. 250. 200. 150. 100. 05⎥进行二进制香农q (X ) ⎣⎦⎣⎦编码,编码结果如下所示:

3、自已选择一个例子进行香农编码,选择的例子为

⎡ X ⎤⎡ x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8⎤

⎢q (X )⎥=⎢0. 2 0. 15 0. 15 0. 1 0. 1 0. 1 0. 1 0. 1⎥,编码结果如下所示:

⎣⎦⎣⎦

实验二:费诺编码

一、实验目的

掌握通过计算机实现费诺编码。

二、实验要求

对于给定的信源的概率分布, 按照费诺编码的方法进行计算机实现。

三、实验基本原理

费诺编码的步骤:

1、将概率按从大到小的顺序排列;

2、按编码进制数将概率分组,使每组概率和尽可能接近或相等; 3、给每组分配一位码元;

4、将每一分组再按同样原则划分,重复2和3,直到概率不再可分为止。

四、源程序:

#include #include

using namespace std; class DATA/ {

public:DATA(){next=NULL;pre=NULL;r=NULL;PXi=1;key[0]='\0';key[1]='\0';key[2]='\0';key[3]='\0';key[4]='\0';key[5]='\0';

key[6]='\0';key[7]='\0';key[8]='\0';key[9]='\0';key[10]='\0';} char Xi; double PXi; char key[11];

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;

cout>n;

for(i=0;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

T=sort(head); tt->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->next;

coutnext!=NULL;p=p->next) coutXiPXi

cout

/***********************编码************************/ 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;i

if(pp->next==NULL) break; l=l+pp->PXi; pp=pp->next; }

head2=pp->pre;

for(;pp->next!=NULL;pp=pp->next) z=z+pp->PXi;

if(y>fabs(l-z))/ {

y=fabs(l-z);

pp=head1; o++; continue; }

else if(z==0&&i

coutXikey

for(DATA * u=head1;u->next!=head2->next;u=u->next) u->key[k]='0';

for(DATA * h=head2;h->next!=NULL;h=h->next) h->key[k]='1';

head2->pre->next=new DATA;

head2->pre->next->pre=head2->pre;

encoding(head1); encoding(head2); break; } k--; }

DATA * sort(DATA * 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=head2->pre; }

tt->next=sort(head1); tt->next->pre=tt; tt=tt->next; return head2; }

void main() {

cout

cout

五、程序设计的流程图

六、实验内容:

x 2x 3x 4x 5x 6x 7⎤⎡X ⎤⎡x 1

1、对给定信源⎢⎥=⎢0. 20. 190. 180. 170. 150. 10. 01⎥进行二进q (X ) ⎣⎦⎣⎦

制费诺编码,编码结果如下所示:

x 2x 3x 4x 5x 6⎤⎡X ⎤⎡x 1

2、对给定信源⎢进行二进制费诺=⎥⎢⎥

⎣q (X ) ⎦⎣0. 250. 250. 200. 150. 100. 05⎦编码,编码结果如下所示:

3、自已选择一个例子进行费诺编码选择的例子为

⎡ X ⎤⎡ x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10⎤

⎢q (X )⎥=⎢0. 16 0. 14 0. 13 0. 12 0. 1 0. 09 0. 08 0. 07 0. 06 0. 05⎥,编码⎣⎦⎣⎦结果如下所示:

实验三 霍夫曼编码

一、实验目的

掌握通过计算机实现霍夫曼编码

二、实验要求

对于给定的信源的概率分布,按照霍夫曼编码的方法进行计算机实现。

三、实验基本原理

霍夫曼编码的步骤:

1、 把信源符号按概率大小顺序排列, 并设法按逆次序分配码字的长度。 2、 在分配码字长度时,首先将出现概率 最小的两个符号的概率相加合成一个概率

3、把这个合成概率看成是一个新组合符号地概率,重复上述做法直到最后只剩下两个符号概率为止。

4、完成以上概率顺序排列后,再反过来逐步向前进行编码,每一次有二个分支各赋予一个二进制码,可以对概率大的赋为0,概率小的赋为1。

四、源程序:

#include #include #include #include #include using 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;

int bit[MAXBIT]; 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;i

HuffNode[i].letter=0; HuffNode[i].weight=0; HuffNode[i].parent=-1; HuffNode[i].lchild=-1; HuffNode[i].rchild=-1; }

for (i=0;i

for (j=i+1;j

if (a[j].num>a[i].num) {

temp1=a[i].num; a[i].num=a[j].num; a[j].num=temp1; temp2=a[i].s; a[i].s=a[j].s; a[j].s=temp2; }

for (i=0;i

HuffNode[i].weight=a[i].num; HuffNode[i].letter=a[i].s; }

for (i=0;i

m1=m2=MAXVALUE; x1=x2=0;

for (j=0;j

{

if (HuffNode[j].parent==-1&&HuffNode[j].weight

m2=m1; x2=x1;

m1=HuffNode[j].weight; x1=j; }

else if (HuffNode[j].parent==-1&&HuffNode[j].weight

m2=HuffNode[j].weight; x2=j; } }

HuffNode[x1].parent=n+i; HuffNode[x2].parent=n+i;

HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight; HuffNode[n+i].lchild=x1; HuffNode[n+i].rchild=x2; } }

void HuffmanCode(int n,lable a[]) {

HNodeType HuffNode[MAXNODE]; HCodeType HuffCode[MAXLEAF],cd; int i,j,c,p;

HuffmanTree(HuffNode,n,a); for (i=0;i

cd.start=n-1; c=i;

p=HuffNode[c].parent; while (p!=-1) {

if (HuffNode[p].lchild==c) cd.bit[cd.start]=0; else cd.bit[cd.start]=1; cd.start--; c=p;

p=HuffNode[c].parent; }

for (j=cd.start+1;j

for (i=0;i

{

HuffCode[i].letter=HuffNode[i].letter;

printf(" %c ",HuffCode[i].letter);

for (j=HuffCode[i].start+1;j

int main() {

lable data[30]; char s[100],*p; int i,count=0; for (;;) {

cout

if (!strcmp(s,"end")) exit(0);

for (i=0;i

data[i].s=0; data[i].num=0; } p=s;

while (*p) {

for (i=0;i

if (data[i].s==0) {

data[i].s=*p; data[i].num++; count++; break; }

else if (data[i].s==*p) {

data[i].num++; break; } } p++; }

/"

printf("\n");

printf(" different letters:%d\n",count); for (i=0;i

printf(" %c ",data[i].s); printf("weight:%d\n",data[i].num); }

HuffmanCode(count,data); count=0; }

return 0; }

五、程序设计的流程图

六、实验内容:

x 2x 3x 4x 5x 6x 7⎤⎡X ⎤⎡x 1

1、对给定信源⎢=⎥⎢0. 20. 190. 180. 170. 150. 10. 01⎥进行二进q (X ) ⎣⎦⎣⎦制霍夫曼编码,编码结果如下所示:

x 2x 3x 4x 5x 6⎤⎡X ⎤⎡x 1

2、对给定信源⎢=⎥⎢0. 250. 250. 200. 150. 100. 05⎥进行二进制霍夫曼q (X ) ⎣⎦⎣⎦编码,编码结果如下所示:

3、自已选择一个例子进行霍夫曼编码,例子为

⎡ X ⎤⎡ x 1 x 2 x 3 x 4 x 5 ⎤

⎢q (X )⎥=⎢0. 4 0. 2 0. 2 0. 1 0. 1⎥,编码结果如下所示:

⎣⎦⎣⎦

实验四:信道容量的迭代算法

一、实验目的

1、进一步熟悉信道容量的迭代算法。

2、通过该实验,掌握通过计算机实验信道容量的计算方法,学习如何将复杂的公式转化为程序。

3、掌握C 或C++语言数值计算的设计和调试技术。

二、实验要求

已知信源符号个数,信道符号个数,信道转移概率矩阵,用C 语言或C++设计程序,实现最佳信源分布时,求出信道容量C 。

三、实验基本原理

一般离散信道容量的计算步骤如下:

(1) 由∑p (y j /x i ) βj =∑p (y j /x i ) log 2p (y j /x i ), 求βj ;

j =1

j =1

m

m

⎛m βj (2) 由C =log 2 ∑2

⎝j =1(3) 由p (y j ) =2

βj -C

⎪, 求C ; ⎪⎭

, 求p (y j ) ;

(4) 由p (y j ) =∑p (x i ) p (y j /x i ), 求p (x i ) 。

i =1

n

需要指出的是,在第(2)步信道容量C 被求出后,计算并没有结束。必须解出相应的p (x i ) ,并确认所以的

p (x i ) 都大于等于零时(i=1,2,…n ),

所求的C 才存在。因为我们在对I (X , Y ) 求偏导时,仅限制

∑p (x ) =1,

i

i =1

n

并没有限制p (x i ) ≥0,所以求出的p (x i ) 可能为负值,此时的C 就不存在,必须对p (x i ) 进行调整,再从新求解C 。一般要通过迭代算法来实现。

用迭代算法计算信道容量C 的步骤如下:

记p (y j /x i ) =p ij , p (x i ) =p i , p (x i /y j ) =ϕji

算法:

i =1, 2, , r ; j =1, 2, , s

① 初始化信源分布p

(0)

=(p 1, p 2, p i , p r ) (一般初始化为均

匀分布)置迭代计算器k =0,设置信道容量相对误差门限为δ,δ>0。

ϕ(ji k ) =

p ij p i (k )

p ij p i (k )

i

⎡⎤(k ) exp ⎢∑p ij ln ϕji ⎥⎣j ⎦(k +1)

p =③ i ⎧⎫⎤⎪⎡⎪(k )

⎨exp ⎢∑p ij ln ϕji ⎥⎬∑i ⎪⎦⎪⎩⎣j ⎭⎧⎤⎫⎪⎡(k +1) (k ) ⎪=ln ∑⎨exp ⎢∑p ij ln ϕji ⎥⎬ ④ C

i ⎪⎦⎪⎩⎣j ⎭

⑤ 如果∆C

(k +1)

C (k +1) -C (k ) =≤δ, 转向⑦; (k +1)

C

⑥ 置迭代序号k+1→k,转向②; ⑦ 输出p (x i ) ⑧ 结束。

可以证明,平均互信息I [p (x i ), p (x i y j )]具有收敛性,即

(k +1)

和C (k +1) 的结果;

lim C (k +1) -C (k ) =0,所以迭代算法最终能求出任意精度的解。算法的收敛速

k →∞

度与信源初始概率分布的选择有很大的关系,初始分布选择越接近最佳分布,则收敛的速度越快,若初始分布选的正好是最佳分布,则一步就可以求得信道容量。

四、源程序:

#include #include #include void main() {

int num_in,num_out; int i,j;

cout>num_in;

cout

cin>>num_out;

cout

P_in=new float[num_in]; float *P_out;

P_out=new float[num_out]; for (i=0;i

P_in[i]=1.0/(float)num_in; cout

cout

cout

p_ji[i]=new float[num_out]; }

for (i=0;i

for (j=0;j

cin>>p_ji[i][j]; } }

for (i=0;i

float validate=0.0;

for (j=0;j

validate+=p_ji[i][j]; }

if (validate>1.000001||validate

cout

float **p_ij;

p_ij=new float *[num_in]; for (i=0;i

p_ij[i]=new float[num_out]; }

float C_Pre,C;

C=10.0;

double Pe=0.000001;

int r=0;

float *p_up;

p_up=new float[num_in];

float p_down;

do

{

r++;

for (j=0;j

{

P_out[j]=0.0;

for (i=0;i

{

P_out[j]+=p_ji[i][j]*P_in[i]; //

}

if (P_out[j]>=0.000001)

{

for (i=0;i

{

p_ij[i][j]=P_in[i]*p_ji[i][j]/P_out[j];

}

}

else

{

for (i=0;i

{

p_ij[i][j]=0.0;

}

}

}

p_down=0.0;

for (i=0;i

{

p_up[i]=0.0;

for (j=0;j

{

if (p_ij[i][j]>=0.000001)

{

p_up[i]+=p_ji[i][j]*log(p_ij[i][j])/log(2.0);

}

}

p_up[i]=pow(2.0,p_up[i]);

p_down+=p_up[i];

}

for (i=0;i

{

P_in[i]=p_up[i]/p_down;

}

C_Pre=C;

C=log(p_down)/log(2.0);

cout

}

while (fabs(C-C_Pre)/C>Pe);

cout

}

五、程序设计的流程图

六、实验内容:

⎡0. 980. 02⎤1、信道转移矩阵为p =⎢⎥,求信道容量及最佳的概率分布,运行0. 050. 95⎣⎦

结果如下所示:

⎡0. 790. 160. 05⎤ 2、信道转移矩阵为p =⎢,求信道容量及最佳的概率分布,⎥⎣0. 050. 150. 8⎦

运行结果如下所示:

⎡1⎢3、信道转移矩阵为p =⎢31⎢⎣6

行结果如下所示: 161313161⎤6⎥,求信道容量及最佳的概率分布,运1⎥⎥3⎦

4、自己选择一个例子求信道容量及最佳的概率分布,选择的例子为:

⎡0.3 0.7⎤,运行结果如下所示:

P =⎢⎥⎣0.5 0.5 ⎦

实验五:循环码编码

一、实验目的:

掌握通过计算机实现系统循环码编码

二、实验要求:

对于给定的消息序列, 按照循环码编码的方法进行计算机实现.

三、实验基本原理

循环码的编码步骤:

循环码的系统码构造的步骤为:

1)消息多项式乘x

2) x m (x )/g(x )=q (x ) +r (x )/g(x )

其中:q (x ) 是商,r (x ) 是余数

3)C(x )= x m (x )+r (x ) n-k n-k n-k

四、源程序:

#include "stdio.h"

#include

#define N 10

void X(int g[N],int c[N],int r,int n)

{int degg,degc,i,k,t,j,e,u,sum=0;

int d[N][2*N]={0},C[N],R[N],a[N][2*N],q[N];

degg=r;

for(i=0;i

{if(c[i]!=0)

{degc=n-i-1;

break; }

}

for(i=0;i

{q[i]=g[i];

R[i]=c[i];}

k=degc-degg;

e=k;

for(j=0;j

{for(i=0;i

{q[i]=g[i];

}

for(i=n-1;i>=e;i--)

{t=q[i];q[i]=q[i-e];q[i-e]=t;

}

for(i=0;i

{c[i]=(c[i]+q[n-1-i])%2;

}

for(i=0;i

{if(c[i]!=0)

{degc=n-i-1;

break; }

}

e=degc-degg;

u=j;

if(e

}

for(i=0;i

{C[i]=(R[i]+c[i])%2;

}

printf("系统编码的结果为:\n");

printf("\t");

for(j=0;j

printf("%d ",C[j]);

printf("\n");

}

void UX(int g[N],int c[N],int r,int n)

{int a[N][2*N],x[N];

int i,j,k,sum=0;

for(j=0;j

{for(i=0;i

a[j][i]=0;

for(i=0;i

a[j][i+j]=c[j]*g[i];

for(k=i+j;k

a[j][k]=0;

}

for(j=0;j

{sum=0;

for(i=0;i

sum=(a[i][j]+sum)%2;

x[j]=sum;

}

printf("非系统编码的结果:\n");

printf("\t");

for(j=0;j

printf("%d ",x[j]);

printf("\n");

}

void main()

{int i,n,m,t,r;

int g[N]={0},c[N]={0};

printf("****循环码编码方法(码长n

printf("\t输入码长n:");

scanf("%d",&m);

n=m;

switch(n)

{case 1 :printf("输入校验位r

scanf("%d",&r);

switch(r)

{case 0:g[0]=1;break;

} break;

case 2 :printf("输入校验位r

scanf("%d",&r);

switch(r)

{case 0:g[0]=1;break;

case 1:g[0]=1;g[1]=1;break;

} break;

case 3 :printf("输入校验位r

scanf("%d",&r);

switch(r)

{case 0:g[0]=1;break;

case 1:g[0]=1;g[1]=1;break;

case 2:g[0]=1;g[1]=1;g[2]=1;break;

} break;

case 4 :printf("输入校验位r

scanf("%d",&r);

switch(r)

{case 0:g[0]=1;break;

case 1:g[0]=1;g[1]=1;break;

case 2:g[0]=1;g[1]=0;g[2]=1;break;

case 3:g[0]=1;g[1]=1;g[2]=1;g[3]=1;break;

} break;

case 5 :printf("输入校验位r=0,1,4:");

scanf("%d",&r);

switch(r)

{case 0:g[0]=1;break;

case 1:g[0]=1;g[1]=1;break;

case 4:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;break;

} break;

case 6 :printf("输入校验位r

scanf("%d",&r);

switch(r)

{case 0:g[0]=1;break;

case 1:g[0]=1;g[1]=1;break;

case 2:g[0]=1;g[1]=1;g[2]=1;break;

case 3:g[0]=1;g[1]=0;g[2]=0;g[3]=1;break;

case 4:g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;break;

case 5:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;break;

} break;

case 7 :printf("输入校验位r=0,1,3,4,6:");

scanf("%d",&r);

switch(r)

{case 0 :g[0]=1;break;

case 1 :g[0]=1;g[1]=1;break;

case 3 :g[0]=1;g[1]=1;g[2]=0;g[3]=1;break;

case 4 :g[0]=1;g[1]=1;g[2]=1;g[3]=0;g[4]=1;break;

case 6 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1; g[6]=1;break; } break;

case 8 :printf("输入校验位r

scanf("%d",&r);

switch(r)

{case 0 :g[0]=1;break;

case 1 :g[0]=1;g[1]=1;break;

case 2 :g[0]=1;g[1]=0;g[2]=1;break;

case 3 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;break;

case 4 :g[0]=1;g[1]=0;g[2]=0;g[3]=0;g[4]=1;break;

case 5 :g[0]=1;g[1]=1;g[2]=0;g[3]=0;g[4]=1;g[5]=1;break;

case 6 :g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;g[5]=0; g[6]=1;break; case7:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=1;

g[7]=1;break;

} break;

case 9 :printf("输入校验位r

scanf("%d",&r);

switch(r)

{case 0 :g[0]=1;break;

case 1 :g[0]=1;g[1]=1;break;

case 2 :g[0]=1;g[1]=0;g[2]=1;break;

case 3 :g[0]=1;g[1]=0;g[2]=0;g[3]=1;break;

case 4 :g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;break;

case 5 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;break;

case 6 :g[0]=1;g[1]=1;g[2]=0;g[3]=1;g[4]=0;g[5]=1; g[6]=1;break;

case7:g[0]=1;g[1]=0;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=0;g[7]=1;break; case8:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=1;g[7]=1; g[8]=1;break;

} break;

case 10 :printf("输入校验位r=0,1,2,4,5,6,8,9:");

scanf("%d",&r);

switch(r)

{case 0 :g[0]=1;break;

case 1 :g[0]=1;g[1]=1;break;

case 2 :g[0]=1;g[1]=0;g[2]=1;break;

case 4 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;break;

case 5 :g[0]=1;g[1]=0;g[2]=0;g[3]=0;g[4]=0;g[5]=1;break;

case 6 :g[0]=1;g[1]=1;g[2]=0;g[3]=0;g[4]=0; g[5]=1;g[6]=1;break; case8:g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;g[5]=0;g[6]=1;g[7]=0; g[8]=1;break;

case9:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=1;g[7]=1

;g[8]=1;g[9]=1;break; } break;

}

printf("生成多项式系数矩阵为(幂次从低到高):\n");

for(i=0;i

printf("%d ",g[i]);

printf("\n");

printf("输入信源信息向量c(%d位) :\n",n-r);

for(i=0;i

scanf("%d",&c[i]);

while(1)

{ printf("\t*****选择编码方式及命令*****\n");

printf("\t 1:系统编码\n");

printf("\t 2:非系统编码\n");

printf("\t 3:退出程序!!!\n");

printf("\t***************************\n");

scanf("%d",&t);

switch(t)

{case 1 :X(g,c,r,n);break;

case 2 :UX(g,c,r,n);break;

case 3 :printf("退出程序〉〉〉");exit(0);break; }

printf("\n"); } }

五、程序设计的流程图

六、实验内容:

1、GF(2)中(7,4)循环码,生成多项式g(x)=x3+x+1,对信息组(1101)进行编码,运行结果如下所示:

2、自己选择一个例子进行编码,例子为:GF(2)中(7,3)循环码,生成多项式g (x )=x 4+x 2+x +1,对信息组(100)进行编码,运行结果如下所示:

本科生实验报告

实验课程 信息论与编码

学院名称 信息科学与技术学院

专业名称 通信工程

学生姓名 学生学号

指导教师 谢振东

实验地点 6C601 实验成绩

二〇 一五 年 十一 月二〇 一五 年 十一月

实验一:香农(Shannon )编码

一、实验目的

掌握通过计算机实现香农编码的方法。

二、实验要求

对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。

三、实验基本原理

给定某个信源符号的概率分布,通过以下的步骤进行香农编码 1、将信源消息符号按其出现的概率大小排列

p (x 1) ≥p (x 2) ≥ ≥p (x n )

2、确定满足下列不等式的整数码长K i ;

-l o g 2p (x i ) ≤K i

i -1

3、为了编成唯一可译码,计算第i 个消息的累加概率

p i =

k =1

p (x k )

4、将累加概率P i 变换成二进制数。

5、取P i 二进制数的小数点后K i 位即为该消息符号的二进制码。

四、源程序:

#include

#include #include #include #include using namespace std; int main() { int N;

cout>N; cout

double *X=new double[N]; //离散无记忆信源

int i,j;

for(i=0;i

cout>X[i]; }

for(i=0;i

{ double temp=X[i];X[i]=X[j];X[j]=temp;} int *K=new int[N]; for(i=0;i

K[i]=int(-(log(X[i])/log(2)))+1; if(K[i]==(-(log(X[i])/log(2)))+1) }

double *Pa=new double[N]; Pa[0]=0.0;

for(i=1;i

Pa[i]=Pa[i-1]+X[i-1]; string *code=new string[N]; for(i=0;i

for(j=0;j=1) { code[i]+="1"; Pa[i]=Pa[i]*2-1; }

else

code[i]+="0"; Pa[i]*= 2; } }

for(i=0;i

code[i]= code[i].substr(0,K[i]);

cout

cout

六、调试过程中出现的错误:

1、在源代码的基础上添加: #include #include #include #include #include using namespace std; 2、出现错误的语句

double *Pa =new double[N];[0]=0.0,[i]=[i-1]+X[i-1];红色部分应该改为和前面绿色的格式一样,不然编译程序时会出现红色部分为定义

3、出现错误的语句: retuen 0; retuen 书写错误,应改为return 。

七、实验内容:

x 2x 3x 4x 5x 6x 7⎤⎡X ⎤⎡x 1

1、对给定信源⎢⎥=⎢0. 20. 190. 180. 170. 150. 10. 01⎥进行二进q (X ) ⎣⎦⎣⎦制香农编码,编码结果如下所示:

x 2x 3x 4x 5x 6⎤⎡X ⎤⎡x 1

2、对给定信源⎢=⎥⎢0. 250. 250. 200. 150. 100. 05⎥进行二进制香农q (X ) ⎣⎦⎣⎦编码,编码结果如下所示:

3、自已选择一个例子进行香农编码,选择的例子为

⎡ X ⎤⎡ x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8⎤

⎢q (X )⎥=⎢0. 2 0. 15 0. 15 0. 1 0. 1 0. 1 0. 1 0. 1⎥,编码结果如下所示:

⎣⎦⎣⎦

实验二:费诺编码

一、实验目的

掌握通过计算机实现费诺编码。

二、实验要求

对于给定的信源的概率分布, 按照费诺编码的方法进行计算机实现。

三、实验基本原理

费诺编码的步骤:

1、将概率按从大到小的顺序排列;

2、按编码进制数将概率分组,使每组概率和尽可能接近或相等; 3、给每组分配一位码元;

4、将每一分组再按同样原则划分,重复2和3,直到概率不再可分为止。

四、源程序:

#include #include

using namespace std; class DATA/ {

public:DATA(){next=NULL;pre=NULL;r=NULL;PXi=1;key[0]='\0';key[1]='\0';key[2]='\0';key[3]='\0';key[4]='\0';key[5]='\0';

key[6]='\0';key[7]='\0';key[8]='\0';key[9]='\0';key[10]='\0';} char Xi; double PXi; char key[11];

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;

cout>n;

for(i=0;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

T=sort(head); tt->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->next;

coutnext!=NULL;p=p->next) coutXiPXi

cout

/***********************编码************************/ 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;i

if(pp->next==NULL) break; l=l+pp->PXi; pp=pp->next; }

head2=pp->pre;

for(;pp->next!=NULL;pp=pp->next) z=z+pp->PXi;

if(y>fabs(l-z))/ {

y=fabs(l-z);

pp=head1; o++; continue; }

else if(z==0&&i

coutXikey

for(DATA * u=head1;u->next!=head2->next;u=u->next) u->key[k]='0';

for(DATA * h=head2;h->next!=NULL;h=h->next) h->key[k]='1';

head2->pre->next=new DATA;

head2->pre->next->pre=head2->pre;

encoding(head1); encoding(head2); break; } k--; }

DATA * sort(DATA * 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=head2->pre; }

tt->next=sort(head1); tt->next->pre=tt; tt=tt->next; return head2; }

void main() {

cout

cout

五、程序设计的流程图

六、实验内容:

x 2x 3x 4x 5x 6x 7⎤⎡X ⎤⎡x 1

1、对给定信源⎢⎥=⎢0. 20. 190. 180. 170. 150. 10. 01⎥进行二进q (X ) ⎣⎦⎣⎦

制费诺编码,编码结果如下所示:

x 2x 3x 4x 5x 6⎤⎡X ⎤⎡x 1

2、对给定信源⎢进行二进制费诺=⎥⎢⎥

⎣q (X ) ⎦⎣0. 250. 250. 200. 150. 100. 05⎦编码,编码结果如下所示:

3、自已选择一个例子进行费诺编码选择的例子为

⎡ X ⎤⎡ x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10⎤

⎢q (X )⎥=⎢0. 16 0. 14 0. 13 0. 12 0. 1 0. 09 0. 08 0. 07 0. 06 0. 05⎥,编码⎣⎦⎣⎦结果如下所示:

实验三 霍夫曼编码

一、实验目的

掌握通过计算机实现霍夫曼编码

二、实验要求

对于给定的信源的概率分布,按照霍夫曼编码的方法进行计算机实现。

三、实验基本原理

霍夫曼编码的步骤:

1、 把信源符号按概率大小顺序排列, 并设法按逆次序分配码字的长度。 2、 在分配码字长度时,首先将出现概率 最小的两个符号的概率相加合成一个概率

3、把这个合成概率看成是一个新组合符号地概率,重复上述做法直到最后只剩下两个符号概率为止。

4、完成以上概率顺序排列后,再反过来逐步向前进行编码,每一次有二个分支各赋予一个二进制码,可以对概率大的赋为0,概率小的赋为1。

四、源程序:

#include #include #include #include #include using 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;

int bit[MAXBIT]; 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;i

HuffNode[i].letter=0; HuffNode[i].weight=0; HuffNode[i].parent=-1; HuffNode[i].lchild=-1; HuffNode[i].rchild=-1; }

for (i=0;i

for (j=i+1;j

if (a[j].num>a[i].num) {

temp1=a[i].num; a[i].num=a[j].num; a[j].num=temp1; temp2=a[i].s; a[i].s=a[j].s; a[j].s=temp2; }

for (i=0;i

HuffNode[i].weight=a[i].num; HuffNode[i].letter=a[i].s; }

for (i=0;i

m1=m2=MAXVALUE; x1=x2=0;

for (j=0;j

{

if (HuffNode[j].parent==-1&&HuffNode[j].weight

m2=m1; x2=x1;

m1=HuffNode[j].weight; x1=j; }

else if (HuffNode[j].parent==-1&&HuffNode[j].weight

m2=HuffNode[j].weight; x2=j; } }

HuffNode[x1].parent=n+i; HuffNode[x2].parent=n+i;

HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight; HuffNode[n+i].lchild=x1; HuffNode[n+i].rchild=x2; } }

void HuffmanCode(int n,lable a[]) {

HNodeType HuffNode[MAXNODE]; HCodeType HuffCode[MAXLEAF],cd; int i,j,c,p;

HuffmanTree(HuffNode,n,a); for (i=0;i

cd.start=n-1; c=i;

p=HuffNode[c].parent; while (p!=-1) {

if (HuffNode[p].lchild==c) cd.bit[cd.start]=0; else cd.bit[cd.start]=1; cd.start--; c=p;

p=HuffNode[c].parent; }

for (j=cd.start+1;j

for (i=0;i

{

HuffCode[i].letter=HuffNode[i].letter;

printf(" %c ",HuffCode[i].letter);

for (j=HuffCode[i].start+1;j

int main() {

lable data[30]; char s[100],*p; int i,count=0; for (;;) {

cout

if (!strcmp(s,"end")) exit(0);

for (i=0;i

data[i].s=0; data[i].num=0; } p=s;

while (*p) {

for (i=0;i

if (data[i].s==0) {

data[i].s=*p; data[i].num++; count++; break; }

else if (data[i].s==*p) {

data[i].num++; break; } } p++; }

/"

printf("\n");

printf(" different letters:%d\n",count); for (i=0;i

printf(" %c ",data[i].s); printf("weight:%d\n",data[i].num); }

HuffmanCode(count,data); count=0; }

return 0; }

五、程序设计的流程图

六、实验内容:

x 2x 3x 4x 5x 6x 7⎤⎡X ⎤⎡x 1

1、对给定信源⎢=⎥⎢0. 20. 190. 180. 170. 150. 10. 01⎥进行二进q (X ) ⎣⎦⎣⎦制霍夫曼编码,编码结果如下所示:

x 2x 3x 4x 5x 6⎤⎡X ⎤⎡x 1

2、对给定信源⎢=⎥⎢0. 250. 250. 200. 150. 100. 05⎥进行二进制霍夫曼q (X ) ⎣⎦⎣⎦编码,编码结果如下所示:

3、自已选择一个例子进行霍夫曼编码,例子为

⎡ X ⎤⎡ x 1 x 2 x 3 x 4 x 5 ⎤

⎢q (X )⎥=⎢0. 4 0. 2 0. 2 0. 1 0. 1⎥,编码结果如下所示:

⎣⎦⎣⎦

实验四:信道容量的迭代算法

一、实验目的

1、进一步熟悉信道容量的迭代算法。

2、通过该实验,掌握通过计算机实验信道容量的计算方法,学习如何将复杂的公式转化为程序。

3、掌握C 或C++语言数值计算的设计和调试技术。

二、实验要求

已知信源符号个数,信道符号个数,信道转移概率矩阵,用C 语言或C++设计程序,实现最佳信源分布时,求出信道容量C 。

三、实验基本原理

一般离散信道容量的计算步骤如下:

(1) 由∑p (y j /x i ) βj =∑p (y j /x i ) log 2p (y j /x i ), 求βj ;

j =1

j =1

m

m

⎛m βj (2) 由C =log 2 ∑2

⎝j =1(3) 由p (y j ) =2

βj -C

⎪, 求C ; ⎪⎭

, 求p (y j ) ;

(4) 由p (y j ) =∑p (x i ) p (y j /x i ), 求p (x i ) 。

i =1

n

需要指出的是,在第(2)步信道容量C 被求出后,计算并没有结束。必须解出相应的p (x i ) ,并确认所以的

p (x i ) 都大于等于零时(i=1,2,…n ),

所求的C 才存在。因为我们在对I (X , Y ) 求偏导时,仅限制

∑p (x ) =1,

i

i =1

n

并没有限制p (x i ) ≥0,所以求出的p (x i ) 可能为负值,此时的C 就不存在,必须对p (x i ) 进行调整,再从新求解C 。一般要通过迭代算法来实现。

用迭代算法计算信道容量C 的步骤如下:

记p (y j /x i ) =p ij , p (x i ) =p i , p (x i /y j ) =ϕji

算法:

i =1, 2, , r ; j =1, 2, , s

① 初始化信源分布p

(0)

=(p 1, p 2, p i , p r ) (一般初始化为均

匀分布)置迭代计算器k =0,设置信道容量相对误差门限为δ,δ>0。

ϕ(ji k ) =

p ij p i (k )

p ij p i (k )

i

⎡⎤(k ) exp ⎢∑p ij ln ϕji ⎥⎣j ⎦(k +1)

p =③ i ⎧⎫⎤⎪⎡⎪(k )

⎨exp ⎢∑p ij ln ϕji ⎥⎬∑i ⎪⎦⎪⎩⎣j ⎭⎧⎤⎫⎪⎡(k +1) (k ) ⎪=ln ∑⎨exp ⎢∑p ij ln ϕji ⎥⎬ ④ C

i ⎪⎦⎪⎩⎣j ⎭

⑤ 如果∆C

(k +1)

C (k +1) -C (k ) =≤δ, 转向⑦; (k +1)

C

⑥ 置迭代序号k+1→k,转向②; ⑦ 输出p (x i ) ⑧ 结束。

可以证明,平均互信息I [p (x i ), p (x i y j )]具有收敛性,即

(k +1)

和C (k +1) 的结果;

lim C (k +1) -C (k ) =0,所以迭代算法最终能求出任意精度的解。算法的收敛速

k →∞

度与信源初始概率分布的选择有很大的关系,初始分布选择越接近最佳分布,则收敛的速度越快,若初始分布选的正好是最佳分布,则一步就可以求得信道容量。

四、源程序:

#include #include #include void main() {

int num_in,num_out; int i,j;

cout>num_in;

cout

cin>>num_out;

cout

P_in=new float[num_in]; float *P_out;

P_out=new float[num_out]; for (i=0;i

P_in[i]=1.0/(float)num_in; cout

cout

cout

p_ji[i]=new float[num_out]; }

for (i=0;i

for (j=0;j

cin>>p_ji[i][j]; } }

for (i=0;i

float validate=0.0;

for (j=0;j

validate+=p_ji[i][j]; }

if (validate>1.000001||validate

cout

float **p_ij;

p_ij=new float *[num_in]; for (i=0;i

p_ij[i]=new float[num_out]; }

float C_Pre,C;

C=10.0;

double Pe=0.000001;

int r=0;

float *p_up;

p_up=new float[num_in];

float p_down;

do

{

r++;

for (j=0;j

{

P_out[j]=0.0;

for (i=0;i

{

P_out[j]+=p_ji[i][j]*P_in[i]; //

}

if (P_out[j]>=0.000001)

{

for (i=0;i

{

p_ij[i][j]=P_in[i]*p_ji[i][j]/P_out[j];

}

}

else

{

for (i=0;i

{

p_ij[i][j]=0.0;

}

}

}

p_down=0.0;

for (i=0;i

{

p_up[i]=0.0;

for (j=0;j

{

if (p_ij[i][j]>=0.000001)

{

p_up[i]+=p_ji[i][j]*log(p_ij[i][j])/log(2.0);

}

}

p_up[i]=pow(2.0,p_up[i]);

p_down+=p_up[i];

}

for (i=0;i

{

P_in[i]=p_up[i]/p_down;

}

C_Pre=C;

C=log(p_down)/log(2.0);

cout

}

while (fabs(C-C_Pre)/C>Pe);

cout

}

五、程序设计的流程图

六、实验内容:

⎡0. 980. 02⎤1、信道转移矩阵为p =⎢⎥,求信道容量及最佳的概率分布,运行0. 050. 95⎣⎦

结果如下所示:

⎡0. 790. 160. 05⎤ 2、信道转移矩阵为p =⎢,求信道容量及最佳的概率分布,⎥⎣0. 050. 150. 8⎦

运行结果如下所示:

⎡1⎢3、信道转移矩阵为p =⎢31⎢⎣6

行结果如下所示: 161313161⎤6⎥,求信道容量及最佳的概率分布,运1⎥⎥3⎦

4、自己选择一个例子求信道容量及最佳的概率分布,选择的例子为:

⎡0.3 0.7⎤,运行结果如下所示:

P =⎢⎥⎣0.5 0.5 ⎦

实验五:循环码编码

一、实验目的:

掌握通过计算机实现系统循环码编码

二、实验要求:

对于给定的消息序列, 按照循环码编码的方法进行计算机实现.

三、实验基本原理

循环码的编码步骤:

循环码的系统码构造的步骤为:

1)消息多项式乘x

2) x m (x )/g(x )=q (x ) +r (x )/g(x )

其中:q (x ) 是商,r (x ) 是余数

3)C(x )= x m (x )+r (x ) n-k n-k n-k

四、源程序:

#include "stdio.h"

#include

#define N 10

void X(int g[N],int c[N],int r,int n)

{int degg,degc,i,k,t,j,e,u,sum=0;

int d[N][2*N]={0},C[N],R[N],a[N][2*N],q[N];

degg=r;

for(i=0;i

{if(c[i]!=0)

{degc=n-i-1;

break; }

}

for(i=0;i

{q[i]=g[i];

R[i]=c[i];}

k=degc-degg;

e=k;

for(j=0;j

{for(i=0;i

{q[i]=g[i];

}

for(i=n-1;i>=e;i--)

{t=q[i];q[i]=q[i-e];q[i-e]=t;

}

for(i=0;i

{c[i]=(c[i]+q[n-1-i])%2;

}

for(i=0;i

{if(c[i]!=0)

{degc=n-i-1;

break; }

}

e=degc-degg;

u=j;

if(e

}

for(i=0;i

{C[i]=(R[i]+c[i])%2;

}

printf("系统编码的结果为:\n");

printf("\t");

for(j=0;j

printf("%d ",C[j]);

printf("\n");

}

void UX(int g[N],int c[N],int r,int n)

{int a[N][2*N],x[N];

int i,j,k,sum=0;

for(j=0;j

{for(i=0;i

a[j][i]=0;

for(i=0;i

a[j][i+j]=c[j]*g[i];

for(k=i+j;k

a[j][k]=0;

}

for(j=0;j

{sum=0;

for(i=0;i

sum=(a[i][j]+sum)%2;

x[j]=sum;

}

printf("非系统编码的结果:\n");

printf("\t");

for(j=0;j

printf("%d ",x[j]);

printf("\n");

}

void main()

{int i,n,m,t,r;

int g[N]={0},c[N]={0};

printf("****循环码编码方法(码长n

printf("\t输入码长n:");

scanf("%d",&m);

n=m;

switch(n)

{case 1 :printf("输入校验位r

scanf("%d",&r);

switch(r)

{case 0:g[0]=1;break;

} break;

case 2 :printf("输入校验位r

scanf("%d",&r);

switch(r)

{case 0:g[0]=1;break;

case 1:g[0]=1;g[1]=1;break;

} break;

case 3 :printf("输入校验位r

scanf("%d",&r);

switch(r)

{case 0:g[0]=1;break;

case 1:g[0]=1;g[1]=1;break;

case 2:g[0]=1;g[1]=1;g[2]=1;break;

} break;

case 4 :printf("输入校验位r

scanf("%d",&r);

switch(r)

{case 0:g[0]=1;break;

case 1:g[0]=1;g[1]=1;break;

case 2:g[0]=1;g[1]=0;g[2]=1;break;

case 3:g[0]=1;g[1]=1;g[2]=1;g[3]=1;break;

} break;

case 5 :printf("输入校验位r=0,1,4:");

scanf("%d",&r);

switch(r)

{case 0:g[0]=1;break;

case 1:g[0]=1;g[1]=1;break;

case 4:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;break;

} break;

case 6 :printf("输入校验位r

scanf("%d",&r);

switch(r)

{case 0:g[0]=1;break;

case 1:g[0]=1;g[1]=1;break;

case 2:g[0]=1;g[1]=1;g[2]=1;break;

case 3:g[0]=1;g[1]=0;g[2]=0;g[3]=1;break;

case 4:g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;break;

case 5:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;break;

} break;

case 7 :printf("输入校验位r=0,1,3,4,6:");

scanf("%d",&r);

switch(r)

{case 0 :g[0]=1;break;

case 1 :g[0]=1;g[1]=1;break;

case 3 :g[0]=1;g[1]=1;g[2]=0;g[3]=1;break;

case 4 :g[0]=1;g[1]=1;g[2]=1;g[3]=0;g[4]=1;break;

case 6 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1; g[6]=1;break; } break;

case 8 :printf("输入校验位r

scanf("%d",&r);

switch(r)

{case 0 :g[0]=1;break;

case 1 :g[0]=1;g[1]=1;break;

case 2 :g[0]=1;g[1]=0;g[2]=1;break;

case 3 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;break;

case 4 :g[0]=1;g[1]=0;g[2]=0;g[3]=0;g[4]=1;break;

case 5 :g[0]=1;g[1]=1;g[2]=0;g[3]=0;g[4]=1;g[5]=1;break;

case 6 :g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;g[5]=0; g[6]=1;break; case7:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=1;

g[7]=1;break;

} break;

case 9 :printf("输入校验位r

scanf("%d",&r);

switch(r)

{case 0 :g[0]=1;break;

case 1 :g[0]=1;g[1]=1;break;

case 2 :g[0]=1;g[1]=0;g[2]=1;break;

case 3 :g[0]=1;g[1]=0;g[2]=0;g[3]=1;break;

case 4 :g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;break;

case 5 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;break;

case 6 :g[0]=1;g[1]=1;g[2]=0;g[3]=1;g[4]=0;g[5]=1; g[6]=1;break;

case7:g[0]=1;g[1]=0;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=0;g[7]=1;break; case8:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=1;g[7]=1; g[8]=1;break;

} break;

case 10 :printf("输入校验位r=0,1,2,4,5,6,8,9:");

scanf("%d",&r);

switch(r)

{case 0 :g[0]=1;break;

case 1 :g[0]=1;g[1]=1;break;

case 2 :g[0]=1;g[1]=0;g[2]=1;break;

case 4 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;break;

case 5 :g[0]=1;g[1]=0;g[2]=0;g[3]=0;g[4]=0;g[5]=1;break;

case 6 :g[0]=1;g[1]=1;g[2]=0;g[3]=0;g[4]=0; g[5]=1;g[6]=1;break; case8:g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;g[5]=0;g[6]=1;g[7]=0; g[8]=1;break;

case9:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=1;g[7]=1

;g[8]=1;g[9]=1;break; } break;

}

printf("生成多项式系数矩阵为(幂次从低到高):\n");

for(i=0;i

printf("%d ",g[i]);

printf("\n");

printf("输入信源信息向量c(%d位) :\n",n-r);

for(i=0;i

scanf("%d",&c[i]);

while(1)

{ printf("\t*****选择编码方式及命令*****\n");

printf("\t 1:系统编码\n");

printf("\t 2:非系统编码\n");

printf("\t 3:退出程序!!!\n");

printf("\t***************************\n");

scanf("%d",&t);

switch(t)

{case 1 :X(g,c,r,n);break;

case 2 :UX(g,c,r,n);break;

case 3 :printf("退出程序〉〉〉");exit(0);break; }

printf("\n"); } }

五、程序设计的流程图

六、实验内容:

1、GF(2)中(7,4)循环码,生成多项式g(x)=x3+x+1,对信息组(1101)进行编码,运行结果如下所示:

2、自己选择一个例子进行编码,例子为:GF(2)中(7,3)循环码,生成多项式g (x )=x 4+x 2+x +1,对信息组(100)进行编码,运行结果如下所示:


相关文章

  • 北邮期中信息论附加题实验报告
  • 信息论实验报告 3. Matlab 仿真实验:掷骰子游戏,每次同时抛掷两枚骰子,将两枚骰子点数的和作为游戏结果,重复抛掷 1000 次(视为 1000 次信源符号输出).要求: (1) 对 1000 次游戏结果进行逐符号二进制定长编码和译码 ...查看


  • 多媒体技术实验报告
  • 多媒体技术及应用实验报告 班级: 姓名:学号:电信1301秦行U201313480 实验一:Huffman编码 一.实验内容 1.了解BMP图像的格式,实现BMP图片格式的数据域及文件头的分离 2.熟悉Huffman编码原理 3.用C语言使 ...查看


  • 软件工程实验报告模板3--实验4编码及测试
  • 实 验 报 告 课程名称 软件工程 实验项目 实验4 编码及测试 系 别___ 计算机学院 _ ______ 专 业____ 网络工程 _ ___ 班级/学号________网工1101_______ 组长姓名 __薛又蜚 20110113 ...查看


  • 认知心理学平时作业答案集(2015)
  • 认知心理学 1:[多选题]把拼图的过程比作知觉的假设检验过程,通过比较几片形状不一样的拼图从而知道某一片拼图是什么,这是: A:自上而下加工 B:自下而上加工 C:概念驱动过程 D:数据驱动过程 E:整体加工 参考答案:BD 2:[论述题] ...查看


  • 搜索引擎-第二次实验报告
  • 实验二:实验 一.实验目的: 根据网络爬虫的基本原理,实现一个简易网络爬虫,需要达到以下指标: 1.种子URL 为: 2.至少抓取10000个页面: 3.至少完成3轮抓取,每轮给出更新的URL 及其数量: 4.实现URL判重,列出每轮爬去时 ...查看


  • 会计电算化实验报告
  • 实验报告 课程名称: 会计电算化 学院名称: 专业班级: 姓 名: 学 号: 指导教师: 实验内容: 新建帐套实验 实验地点: 7号教学楼C区502 实验日期: 2012年5月至6月 一.会计电算化及其实验目的.意义 (一) 会计电算化 & ...查看


  • 通信原理课程实验指导书
  • 开发平台介绍 实验箱名称:LTE-TX-02E通信原理综合实验系统: 实验平台的开发单位:湖北武汉凌特电子技术有限公司 地址:武汉市洪山区卓刀南路3-21号 联系电话:027-87800788 实验箱为模块化结构,外形图如图1所示: 图1 ...查看


  • 光纤通信实验报告
  • 福建农林大学金山学院 课程名称:姓 名:系:专 业:年 级:学 号:指导教师:职 称:信息工程类 实验报告 光纤通信 信息与机电工程系 电子信息工程 2011 2014年 12月29日 实验项目列表 福建农林大学金山学院信息工程类实验报告 ...查看


  • 通信原理课程设计模板-课程设计报告格式(空白)new
  • 程 设 计 报 课程名称 系 别: 专业班级: 学 号: 姓 名: 课程题目: 完成日期: 指导老师: 年 月 日 课 告 附件: 课程设计论文撰写的内容和要求 课程设计论文要求每个人写一份,字数要求3000-5000字. 涉及到计算机软件 ...查看


热门内容