实验一:信息量及信道容量的计算
实验目的:通过该实验,掌握通过计算机实验信息量和信道容量的计算方法
实验要求:对一个离散的无记忆信源,给定信源的输入概率分布,给定一个信道特性,计算各种信息量和熵,并计算信道容量。
实验原理:
n设输入X∈{x1,x2,…,xi,…,xn}
输出Y∈{y1,y2,…,yj,…,ym} ,信道的一般数学模型如下图:
在给定信源概率分布条件下,
各种熵的求解方法如下:
1)
信源熵
条件熵
联合熵
交互熵
信道容量
n一般离散信道容量对计算步骤总结如下:
实验设备:计算机 c++
五、实验报告要求
1、 画出程序设计的流程图,2、
3、 写出程序代码,4、
5、 写出在调试过程中出现的问题 ,6、
7、 对实验的结果进行分析。
实验二 香农编码
一 实验目的、掌握通过计算机实现香农编码
二实验要求
对于给定的信源的概率分布,按照香农编码的方法进行计算机实现.
三、实验原理
给定某个信源符号的概率分布,通过以下的步骤进行香农编码
信源符号按概率从大到小排列
对信源符号求累加和,表达式: Pi=Pi-1+p(xi)
求自信息量,确定码字长度。自信息量I(xi)=-log(p(xi));码字长度取大于等于自信息量的最小整数。
将累加和用二进制表示,并取小数点后码字的长度的码 。
四、实验设备 计算机 c++
五实验报告
1、画出程序设计的流程图,
2、写出程序代码,
3、写出在调试过程中出现的问题 ,
4、对实验的结果进行分析。
实验三 费诺编码
一 实验目的:掌握通过计算机实现费诺编码
二实验要求:
对于给定的信源的概率分布,按照费诺编码的方法进行计算机实现.
三实验原理
费诺编码的步骤:
A 将概率按从大到小的顺序排列
B 按编码进制数将概率分组,使每组概率和尽可能接近或相等。
C 给每组分配一位码元
D 将每一分组再按同样原则划分,重复b和c,直到概率不再可分为止
四 实验设备 计算机 c++
五实验报告
1、画出程序设计的流程图,
2、写出程序代码,
3、写出在调试过程中出现的问题 ,
4、对实验的结果进行分析。
#include<iostream.h>
#include<math.h>
#include<iomanip.h>
#include<stdlib.h>
class T
{
public:
T() {}
~T();
void Create();
void Coutpxj();
void Coutk();
void Coutz();
void Print();
protected:
int n;
double *p;
double *pxj;
int *k;
double *mz;
};
void T::Create()
{
cout<<"请输入信源符号个数:";
cin>>n;
p=new double[n];
cout<<"请分别输入这"<<n<<"个概率:\n";
for(int i=0;i<n;i++)
cin>>p;
pxj=new double[n];
k=new int[n];
mz=new double[n];
double sum=0.0;
for(i=0;i<n;i++)
sum+=p;
if(sum!=1.0)
throw 1;
else
{
for(i=0;i<n;i++)
{
int k=i;
for(int j=i+1;j<n;j++)
if(p[k]<p[j]) k=j;
double m=p;
p=p[k];
p[k]=m;
}
}
}
T::~T()
{
delete p;
delete pxj;
delete k;
delete mz;
}
void T::Coutpxj()
{
pxj[0]=0;
for(int i=1;i<n;i++)
{
pxj=0;
for(int j=0;j<i;j++)
pxj+=p[j];
}
}
void T::Coutk()
{
for(int i=0;i<n;i++)
{
double d=(-1)*(log(p)/log(2));
if(d-(int)d>0) k=(int)d+1;
else k=(int)d;
}
}
void T::Print()
{
cout<<"Xi"<<setw(8)<<"P(xi)"
<<setw(8)<<"Pa(xj)"
<<setw(8)<<"Ki"
<<setw(8)<<"码字"
<<endl;
for(int i=0;i<n;i++)
{ cout<<"X"<<i+1
<<setw(8)<<setprecision(2)<<p
<<setw(8)<<setprecision(2)<<pxj
<<setw(8)<<k<<" ";
mz=pxj;
for(int j=0;j<k;j++)
{
if(2*mz-1>=0)
{
cout<<1;
mz=2*mz-1;
}
else
{
cout<<0;
mz=2*mz;
}
}
cout<<endl;
}
double K=0.0,H=0.0,Y;
for(i=0;i<n;i++)
{
K+=(double)p*k;
H+=(-1)*p*(log10(p)/log10(2.0));
}
Y=H/K;
cout<<"平均码长:"<<K<<endl;
cout<<"信源熵:"<<H<<endl;
cout<<"编码效率:"<<Y<<endl;
}
void main()
{
T t;int e;
try
{
t.Create();
t.Coutpxj();
t.Coutk();
t.Print();
}
catch(int e)
{if(e==1) cout<<"输入错误,请重新运行";}
}
实验四 哈夫曼编码
一 实验目的:掌握通过计算机实现哈夫曼编码
二实验要求:
对于给定的信源的概率分布,按照哈夫曼编码的方法进行计算机实现.
三实验原理
哈夫曼编码的步骤:
(1). 把信源符号按概率大小顺序排列, 并设法按逆次序分配码字的长度。
(2). 在分配码字长度时,首先将出现概率 最小的两个符号的概率相加合成一个概率
(3). 把这个合成概率看成是一个新组合符号地概率,重复上述做法直到最后只剩下两个符号概率为止。
(4). 完成以上概率顺序排列后,再反过来逐步向前进行编码,每一次有二个分支各赋予一个二进制码,可以对概率大的赋为零,概率小的赋为1。
四实验设备 计算机 c++
五实验报告
1、画出程序设计的流程图,
2、写出程序代码,
3、写出在调试过程中出现的问题 ,
4、对实验的结果进行分析。
六 参考程序
哈夫曼编码:
根据二叉树思想,将二叉树的程序改编
#include<iostream>#include<string>using namespace std;typedef struct { int weight; int flag; int parent; int lchild; int rchild;}hnodetype;typedef struct { int bit[10]; int start; char leaf;}hcodetype;void huf(char cha[],int m[],int n){ int i,j,m1,m2,x1,x2,c,p; hnodetype *huffnode=new hnodetype[2*n-1]; hcodetype *huffcode=new hcodetype[n],cd; for(i=0;i<2*n-1;i++) { //初始化哈夫曼树 huffnode.weight=0; huffnode.parent=0; huffnode.flag=0; huffnode.lchild=-1; huffnode.rchild=-1; } for(i=0;i<n;i++) { //哈夫曼结点赋初值 huffnode.weight=m; huffcode.leaf=cha; } for(i=0;i<n-1;i++) { //对结点进行编码 m1=m2=10000000; x1=x2=0; for(j=0;j<n+i;j++) { if(huffnode[j].weight<=m1&&huffnode[j].flag==0) { m2=m1; x2=x1; m1=huffnode[j].weight; x1=j; } else if(huffnode[j].weight<=m2&&huffnode[j].flag==0) { m2=huffnode[j].weight; x2=j; } } huffnode[x1].parent=n+i; huffnode[x2].parent=n+i; huffnode[x1].flag=1; huffnode[x2].flag=1; huffnode[n+i].weight=huffnode[x1].weight+huffnode[x2].weight; huffnode[n+i].lchild=x1; huffnode[n+i].rchild=x2; } for(i=0;i<n;i++) { //生成哈夫曼树 cd.start=n-1; c=i; p=huffnode[c].parent; while(p!=0) { if(huffnode[p].lchild==c) cd.bit[cd.start]=0; else cd.bit[cd.start]=1; cd.start--; c=p; p=huffnode[c].parent; } cout<<huffcode.leaf<<":"; for(j=cd.start+1;j<n;j++) { huffcode.bit[j]=cd.bit[j]; cout<<cd.bit[j]; } cout<<endl; huffcode.start=cd.start; } delete[] huffcode; delete[] huffnode;}void main(){ int i=0; int m[10]={30,23,10,10,9,8,7,3}; char cha[10]="abcdefgh"; float f; cout<<"该字符串为:\t"; for (i=0;i<strlen(cha);i++) { cout<<cha<<"\t"; } cout<<"字符加权为:\t"; for (i=0;i<strlen(cha);i++) { f=(float)m/100; cout<<f<<"\t"; }
cout<<"各字符的哈夫曼码为:"<<endl; i=strlen(cha); huf(cha,m,i);
实验五 循环码编码
一 实验目的:掌握通过计算机实现系统循环码编码
二实验要求:
对于给定的消息序列,按照循环码编码的方法进行计算机实现.
三实验原理
循环码的编码步骤:
循环码的系统码构造的步骤为:
1)消息多项式乘x n-k
2) x n-km(x)/g(x)=q(x) +r(x)/g(x)
其中:q(x)是商,r(x)是余数
3)C(x)= x n-km(x)+r(x)
四实验设备
计算机 c++
五实验报告
1、画出程序设计的流程图,
2、写出程序代码,
3、写出在调试过程中出现的问题 ,
4、对实验的结果进行分析。
实验六 模p信道编码实验
一 实验目的:掌握通过计算机实现模p信道编码
二实验要求:
对于给定的消息序列,按照模p信道编码的方法进行计算机实现.
三实验原理
在实际生活中,有时侯“1”和“I”很相似。
p=37(符号的个数)
数字“0”-“9”和字母“A”-“Z”和空格共37种符号。
“0” 0
“1” 1
¨
“A” 10
“B” 11
设有某消息的符号序列为X=X1X2X3X4,
用下表的方式来求它们的和及累加和,然后加上适当的监督元,使累加和是模37的倍数。
四实验设备
计算机 c++
五实验报告
1、画出程序设计的流程图,
2、写出程序代码,
3、写出在调试过程中出现的问题 ,
4、对实验的结果进行分析。 |