admin 管理员组

文章数量: 1086019


2024年4月25日发(作者:导航菜单切换)

信息论与编码实验指导书

1 课程实验目的

本课程是一门实践性很强的专业课和核心课程,根据课程理论教学的需要安

排了6学时的配套实验教学,主要内容涉及信息度量的计算方法、典型信源编码

方法、典型信道容量计算方法和数据压缩方法四个实验,这四个实验的开设一方

面有助于学生消化、巩固课程理论教学的知识,另一方面又可培养学生实践动手

能力,同时为后续课程做好准备。

2 课程实验要求

2.1 课程实验准备要求

(1)课程实验主要为设计性实验,要求学生熟悉掌握在VC环境下编写和

调试C++程序的方法。

(2)要求学生在实验前复习实验所用到的预备知识。可以查阅教材或者相

关的参考资料,这需要学生有自主的学习意识和整理知识的能力。

(3)根据实验项目,设计相关的数据结构和算法,再转换为对应的书面程

序,并进行静态检查,尽量减少语法错误和逻辑错误。上机前的充分准备能高效

利用机时,在有限的时间内完成更多的实验内容。

2.2 课程实验过程要求

(1)生成源代码。将课前编写好的书面代码,利用VC自带的编辑器尽快

输入为转换为源代码;

(2)程序调试和软件测试。要求学生熟练掌握调试工具,调试正确后,认

真整理源程序和注释,给出带有完整注释且格式良好的源程序清单和结果。

(3)完成实验报告。根据实验内容和完成情况,按照附件1给定的格式完

成课程实验报告的编写。

2.3 课程实验报告要求

在每次课程实验后要及时进行总结和整理,并编写课程实验报告。报告格式

按江西蓝天学院实验报告纸格式填写。

实验一 二维随机变量信息熵的计算

[实验目的]

掌握二变量多种信息量的计算方法。

[实验学时]

2学时

[实验准备]

1.熟悉二变量多种信息量的计算方法,设计实验的数据结构和算法;

2.编写计算二维随机变量信息量的书面程序代码。

[实验内容及步骤]

离散二维随机变换熵的计算

说明:

(1)利用random函数和归一化方法构造一个二维离散随机变量(X,Y);

(2)分别计算X与Y的熵、联合熵、条件熵:H(X)、H(Y)、H(X,Y)

H(X|Y)、I(X|Y);

(3)对测试通过的程序进行规范和优化;

(4)编写本次实验的实验报告。

附实验一主要内容及源程序

实验一 离散二维随机变量信息熵的计算

1 实验内容

(1)利用random函数和归一化方法构造一个二维离散随机变量(X,Y);

(2)分别计算X与Y的熵、联合熵、条件熵:H(X)、H(Y)、H(X,Y)H(X|Y)、I(X|Y);

2 数据结构与算法描述

(1)函数的定义:函数的数据成员

1.随机生成函数的代码:

int k,n,t=0;

double a[4][4],b=0,c=0;

for(k=0;k<4;k++)

{

for(n=0;n<4;n++)

{

a[k][n]=rand()%100;

}

cout<<"从到间随机取得行列的random函数:"<

for(k=0;k<4;k++)

{

}

for(n=0;n<4;n++)

{

}

cout<

cout<

}

t+=a[k][n];

2.函数归一化代码:

cout<<"函数归一化:"<

for(k=0;k<4;k++)

{

}

for(n=0;n<4;n++)

{

}

cout<

cout<

3. H(Y)、 H(X)计算代码:

cout<<"H(Y)计算:"<

int e=1;

for(k=0;k<4;k++)

{

}

cout<<"H(Y)=-∑p(Y)log p(Y)="<

cout<<"H(X)=-∑p(X)log p(X)="<

double i=0,g=0;

for(n=0;n<4;n++)

{

}

cout<<"P(Y"<

++e;

b-=(i*log(i)/log(2.0));

c-=(g*log(g)/log(2.0));

i+=(a[k][n]/t);

g+=(a[n][k]/t);

4. 联合熵H(X,Y)计算代码:

cout<<"联合熵H(X,Y)计算:"<

b=0;

int r,u,h=0;

for(k=0;k<4;k++)

{

}

if(h==0)

cout<<"H(X,Y)=-∑∑p(X,Y)log p(X,Y)="<

else cout<<"P("<

for(n=0;n<4;n++)

{

}

if(a[k][n]!=0)

{

}

else

{

}

r=k,u=n;

h=1;

break;

b-=((a[k][n]/t)*log(a[k][n]/t)/log(2.0));

5. 条件熵H(X|Y)计算代码:

cout<<"条件熵H(X|Y)计算:"<

b=0,h=0;

for(k=0;k<4;k++)

{

}

if (h==0){cout<<"H(X|Y)=-∑∑P(X,Y)log(P(X,Y)/P(Y))="<

else cout<<"P("<

cout<<"I(X|Y)计算:"<

if(h==0)cout<<"I(X|Y)=H(X)-H(X|Y)="<

else cout<<"P("<

double i=0;

for(n=0;n<4;n++)

{

}

for(n=0;n<4;n++)

{

}

if(a[k][n]!=0)

{

}

else {h=1;break;}

b-=((a[k][n]/t)*log((a[k][n]/t)/i)/log(2.0));

i+=(a[k][n]/t);

(2)主函数main() 实现初始化操作,完成对子函数的调用

因为整个程序是写在main函数中,就不列出,会在下面源程序清单中给出程序。

3 实验数据与实验结果

这里设定函数为4行4列的随机矩阵。

然后函数归一化,即:把所有数字相加,再用每个数去除,就得到了归一化后的矩阵。

而H(X)、H(Y)、H(X,Y)H(X|Y)、I(X|Y)就根据课本上的公式,然后编程。

输出结果如下:

4 程序代码清单:

#include

#include

#include

#include

#include

using namespace std;

void main()

{

int k,n,t=0;

double a[4][4],b=0,c=0;

srand((unsigned)time(NULL));

{

for(n=0;n<4;n++)

{

a[k][n]=rand()%100;

t+=a[k][n];

for(k=0;k<4;k++)

}

cout<<"从0到100间随机取得行列的random函数:"<

for(k=0;k<4;k++)

{

}

cout<<"函数归一化:"<

for(k=0;k<4;k++)

{

}

cout<<"H(Y)计算:"<

int e=1;

for(k=0;k<4;k++)

{

}

cout<<"H(Y)=-∑p(Y)log p(Y)="<

cout<<"H(X)=-∑p(X)log p(X)="<

cout<<"联合熵H(X,Y)计算:"<

b=0;

int r,u,h=0;

for(k=0;k<4;k++)

{

for(n=0;n<4;n++)

{

double i=0,g=0;

for(n=0;n<4;n++)

{

}

cout<<"P(Y"<

++e;

b-=(i*log(i)/log(2.0));

c-=(g*log(g)/log(2.0));

i+=(a[k][n]/t);

g+=(a[n][k]/t);

for(n=0;n<4;n++)

{

}

cout<

cout<

for(n=0;n<4;n++)

{

}

cout<

cout<

}

}

}

if(h==0)

cout<<"H(X,Y)=-∑∑p(X,Y)log p(X,Y)="<

else cout<<"P("<

cout<<"条件熵H(X|Y)计算:"<

b=0,h=0;

for(k=0;k<4;k++)

{

}

if (h==0){cout<<"H(X|Y)=-∑∑P(X,Y)log(P(X,Y)/P(Y))="<

else cout<<"P("<

cout<<"I(X|Y)计算:"<

if(h==0)cout<<"I(X|Y)=H(X)-H(X|Y)="<

else cout<<"P("<

double i=0;

for(n=0;n<4;n++)

{

}

for(n=0;n<4;n++)

{

}

if(a[k][n]!=0)

{

}

else {h=1;break;}

b-=((a[k][n]/t)*log((a[k][n]/t)/i)/log(2.0));

i+=(a[k][n]/t);

}

if(a[k][n]!=0)

{

}

else

{

}

r=k,u=n;

h=1;

break;

b-=((a[k][n]/t)*log(a[k][n]/t)/log(2.0));

实验二 简单信源编码方法实现

[实验目的]

掌握Huffman编码方法。

[实验学时]

2学时

[实验准备]

1.熟悉离散信源的编码方法,重点是Huffman编码方法,设计Huffman编

码的数据结构和算法;

2.编写Huffman编码的书面程序代码。

[实验内容及步骤]

离散信源的Huffman编、译码方法

说明:

(1)利用random函数构造一个一维离散随机变量分布P(X);

(2)构造离散随机变量的概率压缩表;

(3)根据概率压缩表构造Huffman编码表,并实现Huffman编码;

(4)完成Huffman译码;

(4)编写本次实验的实验报告。

附实验二实验内容及程序源程序

实验二 离散信源的Huffman编、译码方法

1 实验内容

(1)利用random函数构造一个一维离散随机变量分布P(X);

(2)根据概率压缩表构造Huffman编码表,并实现Huffman编码;

(3)完成Huffman译码;

2 数据结构与算法描述

(1)函数的定义:函数的数据成员

1.随机生成归一化一维离散变量函数代码:

void aa(int n)

{

double w=0;

}

2.

Huffman

{

elem mp;stack s(n);

double *b;b=new double[n];for(int i=0;i

double *d;d=new double[n];for(int i=0;i

double *e;e=new double[n];for(int i=0;i

string t;

for(int m=n;m>=2;m--)

{

b[m-2]+=b[m-1];

mp.a2=d[m-2];mp.a3=d[m-1];

a=new double[n];

srand((unsigned)time(NULL));

cout<<"随机生成归一化一维离散变量:"<

for(int i=0;i

{

}

for(int i=0;i

{

}

double p;

for(int i=0;i

{

}

cout<<"P(X):";

for(int i=0;i

{

}

ion(3);

cout<

for(int j=n-2;j>=i;j--)

{

}

if(a[j]

{

}

p=a[j+1];

a[j+1]=a[j];

a[j]=p;

a[i]=a[i]/w;

a[i]=rand()%50;

w+=a[i];

译码函数代码:

void huffman(double *a,string *c,int n)

}

while(!y())

{

mp=();

for(int i=0;i

{

}

for(int i=0;i

{

}

if(mp.a2==e[i])

{

}

else if(mp.a3==e[i])

{

}

c[i]=t;

c[i]+="1";

c[i]=t;

c[i]+="0";

if(mp.a2==e[i])

{

}

t=c[i];

(mp);

double mp,mp1;

for(int i=0;i

{

}

cout<

for(int i=0;i

{

}

ion(3);

cout<

for(int j=n-2;j>=i;j--)

{

}

if(b[j]

{

}

mp=b[j+1]; mp1=d[j+1];

b[j+1]=b[j]; d[j+1]=d[j];

b[j]=mp;d[j]=mp1;

}

}

(2)主函数main() 实现初始化操作,完成对子函数的调用

void main()

{

}

int n;

cout<<"输入N:";

cin>>n;

c=new string[n];

aa(n);

huffman(a,c,n);

cout<

cout<

for(int i=0;i

{

}

ion(3);

cout<

ion(0);

cout<

cout<

3 实验数据与实验结果

测试数据:随机生成归一化离散变量,如下图数据,并计算出各项Huffman编码。

实验结果:

4 程序代码清单:

#include

#include

#include

#include

#include

#include

#include

using namespace std;

double *a;

string *c;

struct elem

{

};

class stack

{

};

void aa(int n)

{

double w=0;

a=new double[n];

srand((unsigned)time(NULL));

cout<<"随机生成归一化一维离散变量:"<

for(int i=0;i

{

}

for(int i=0;i

{

a[i]=rand()%50;

w+=a[i];

int size;

int top;

elem *list;

stack(const int sz=0){size=sz;top=0;list=new elem[sz];}

~stack(){delete []list;}

void clear(){top=0;}

void push(const elem& item){assert(top

elem pop(){assert(!isEmpty());return list[--top];}

elem topValue() const{assert(!isEmpty());return list[top-1];}

bool isEmpty() const{return top==0;}

double a2;

double a3;

public:

}

void huffman(double *a,string *c,int n)

{

elem mp;stack s(n);

double *b;b=new double[n];for(int i=0;i

double *d;d=new double[n];for(int i=0;i

double *e;e=new double[n];for(int i=0;i

string t;

for(int m=n;m>=2;m--)

{

b[m-2]+=b[m-1];

mp.a2=d[m-2];mp.a3=d[m-1];

(mp);

double mp,mp1;

for(int i=0;i

{

for(int j=n-2;j>=i;j--)

{

if(b[j]

{

mp=b[j+1]; mp1=d[j+1];

b[j+1]=b[j]; d[j+1]=d[j];

b[j]=mp;d[j]=mp1;

}

double p;

for(int i=0;i

{

}

cout<<"P(X):";

for(int i=0;i

{

}

ion(3);

cout<

for(int j=n-2;j>=i;j--)

{

}

if(a[j]

{

}

p=a[j+1];

a[j+1]=a[j];

a[j]=p;

a[i]=a[i]/w;

}

void main()

{

int n;

cout<<"输入N:";

cin>>n;

c=new string[n];

aa(n);

huffman(a,c,n);

cout<

}

while(!y())

{

}

mp=();

for(int i=0;i

{

}

for(int i=0;i

{

}

if(mp.a2==e[i])

{

}

else if(mp.a3==e[i])

{

}

c[i]=t;

c[i]+="1";

c[i]=t;

c[i]+="0";

if(mp.a2==e[i])

{

}

t=c[i];

}

cout<

for(int i=0;i

{

}

ion(3);

cout<

}

}

}

cout<

for(int i=0;i

{

}

ion(3);

cout<

ion(0);

cout<

cout<

实验三 典型信道容量计算

[实验目的]

掌握用递推算法计算典型信道的容量的方法。

[实验学时]

2学时

[实验准备]

1.熟悉二进信道的概率转移矩阵表示,掌握信道容量的递推算法,设计用

递推算法计算二进信道容量的数据结构和算法;

2.编写用递推算法计算二进信道容量的书面程序代码。

[实验内容及步骤]

用递推算法计算二进信道的容量

说明:

(1)构造各种二进信道的概率转移矩阵;

(2)用递推算法计算各种二进信道的容量;

(3)不断调整误差精度对系统进行测试,并进行对比分析;

(4)编写本次实验的实验报告。

附实验三内容及源程序

实验三 用递推算法计算二进信道的容量

1 实验内容

(1)构造各种二进信道的概率转移矩阵;

(2)用递推算法计算各种二进信道的容量;

(3)不断调整误差精度对系统进行测试,并进行对比分析;

2 数据结构与算法描述

(1)函数的定义:函数的数据成员

1.

随机生成二元对称信道函数代码:

void aa()

{

}

double e=0;

cout<<"随机生成二元对称信道为:"<

int i=0;

for(int j=0;j<2;j++)

{

}

for(int j=0;j<2;j++)

{

}

a[1][1]=a[0][0];a[1][0]=a[0][1];

for(int i=0;i<2;i++)

{

}

for(int j=0;j<2;j++)

{

}

cout<

cout<

a[0][j]=a[0][j]/e;

a[0][j]=rand()%100;

e+=a[0][j];

2

.

随机生成二元删除信道函数代码:

void cc()

{

double e=0;

}

cout<<"随机生成二元删除信道为:"<

for(int j=0;j<2;j++)

{

}

for(int j=0;j<2;j++)

{

}

b[0][2]=0;b[1][0]=0;

e=0;

for(int j=1;j<3;j++)

{

}

for(int j=1;j<3;j++)

{

}

for(int i=0;i<2;i++)

{

}

for(int j=0;j<3;j++)

{

}

cout<

cout<

b[1][j]=b[1][j]/e;

b[1][j]=rand()%100;

e+=b[1][j];

b[0][j]=b[0][j]/e;

b[0][j]=rand()%100;

e+=b[0][j];

3.求二元对称信道最大信道容量和最大容量时w的值的函数代码:

void bb()

{

tmp=((w*a[0][0]+((1-w)*a[0][1]))*(log(1/(w*a[0][0]+((1-w)*a[0][1])))/log(2.0)))+(((w*a[

0][1])+((1-w)*a[0][0]))*(log(1/((w*a[0][1])+((1-w)*a[0][0])))/log(2.0)))-(a[0][0]*(log(1/a[0

][0])/log(2.0))+(a[0][1]*(log(1/a[0][1])/log(2.0))));

}

if(e[0]

double w=0;

double e[2]={0,0};

for(w=0;w<=1;w+=0.01)

{

double tmp=0;

}

cout<<"最大信道容量为:"<

cout<

4. 求二元删除信道最大信道容量和最大容量时w的值的函数代码:

void dd()

{

}

double P[2][2];

P[1][0]=0;P[1][1]=1;

double temp[2]={0,1};

do{

double tmp1=0,tmp=0;

for(int i=0;i<2;i++)

{

}

double temp2[2][3];

for(int i=0;i<2;i++)

{

}

for(int j=0;j<3;j++){temp2[0][j]=temp2[0][j]+temp2[1][j];}

for(int j=0;j<3;j++)

{

}

tmp-=tmp1;

if(tmp>=temp[0]){temp[0]=tmp;temp[1]=P[1][0];}

P[1][0]+=0.01;P[1][1]-=0.01;

}while(P[1][0]<=1.00);

cout<<"最大信道容量为:"<

if(temp2[0][j]!=0){tmp-=temp2[0][j]*log(temp2[0][j])/log(2.0);}

for(int j=0;j<3;j++){temp2[i][j]=P[1][i]*b[i][j];}

for(int j=0;j<3;j++)

{

}

if(b[i][j]!=0){tmp1+=P[1][i]*b[i][j]*log(1.0/b[i][j])/log(2.0);}

(2)主函数main() 实现初始化操作,完成对子函数的调用

void main()

{

}

srand((unsigned)time(NULL));

aa();

bb();

cc();

dd();

3 实验数据与实验结果

测试数据:随机生成了2*2矩阵和2*3矩阵,并求得最大容量和w的值。

实验结果:

4 程序代码清单:

#include

#include

#include

#include

using namespace std;

double a[2][2];

double b[2][3];

void aa()

{

double e=0;

cout<<"随机生成二元对称信道为:"<

int i=0;

for(int j=0;j<2;j++)

{

}

for(int j=0;j<2;j++)

{

a[0][j]=rand()%100;

e+=a[0][j];

}

{

double w=0;

double e[2]={0,0};

for(w=0;w<=1;w+=0.01)

{

double tmp=0;

tmp=((w*a[0][0]+((1-w)*a[0][1]))*(log(1/(w*a[0][0]+((1-w)*a[0][1])))/log(2.0)))+(((w*a[

}

a[1][1]=a[0][0];a[1][0]=a[0][1];

for(int i=0;i<2;i++)

{

}

for(int j=0;j<2;j++)

{

}

cout<

cout<

a[0][j]=a[0][j]/e;

void bb()

0][1])+((1-w)*a[0][0]))*(log(1/((w*a[0][1])+((1-w)*a[0][0])))/log(2.0)))-(a[0][0]*(log(1/a[0

][0])/log(2.0))+(a[0][1]*(log(1/a[0][1])/log(2.0))));

}

void cc()

{

double e=0;

cout<<"随机生成二元删除信道为:"<

for(int j=0;j<2;j++)

{

}

for(int j=0;j<2;j++)

{

}

b[0][2]=0;b[1][0]=0;

e=0;

for(int j=1;j<3;j++)

{

b[0][j]=b[0][j]/e;

b[0][j]=rand()%100;

e+=b[0][j];

}

cout<<"最大信道容量为:"<

cout<

if(e[0]

}

void dd()

{

double P[2][2];

P[1][0]=0;P[1][1]=1;

double temp[2]={0,1};

do{

double tmp1=0,tmp=0;

for(int i=0;i<2;i++)

{

}

double temp2[2][3];

for(int i=0;i<2;i++)

{

}

for(int j=0;j<3;j++){temp2[0][j]=temp2[0][j]+temp2[1][j];}

for(int j=0;j<3;j++)

{

}

tmp-=tmp1;

if(tmp>=temp[0]){temp[0]=tmp;temp[1]=P[1][0];}

P[1][0]+=0.01;P[1][1]-=0.01;

}while(P[1][0]<=1.00);

if(temp2[0][j]!=0){tmp-=temp2[0][j]*log(temp2[0][j])/log(2.0);}

for(int j=0;j<3;j++){temp2[i][j]=P[1][i]*b[i][j];}

for(int j=0;j<3;j++)

{

}

if(b[i][j]!=0){tmp1+=P[1][i]*b[i][j]*log(1.0/b[i][j])/log(2.0);}

}

for(int j=1;j<3;j++)

{

}

for(int i=0;i<2;i++)

{

}

for(int j=0;j<3;j++)

{

}

cout<

cout<

b[1][j]=b[1][j]/e;

b[1][j]=rand()%100;

e+=b[1][j];

}

void main()

{

}

srand((unsigned)time(NULL));

aa();

bb();

cc();

dd();

cout<<"最大信道容量为:"<


本文标签: 实验 课程 函数 进行 信道