信息论与编码实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<string.h>
#include<stdlib.h>
using namespace std;
#define MAXVALUE 10000
#define MAXLEAF 30
#define MAXNODE MAXLEAF*2-1
#define MAXBIT 50
typedef struct node
{
temp1=a[i].num;
a[i].num=a[j].nuFra Baidu bibliotek;
a[j].num=temp1;
temp2=a[i].s;
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;
{
cout<<"X["<<i+1<<"]=";cin>>X[i];
}
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
if(X[i]<X[j])
{ double temp=X[i];X[i]=X[j];X[j]=temp;}
int *K=new int[N];
for(i=0;i<N;i++)
void input()
{
double l,sum=0;
int n,i;
char L;
cout<<"请输入信源个数:";
cin>>n;
for(i=0;i<n;i++)
{
cout<<"请输入一个字符的信源符号:" <<endl;cin>>L;
cout<<"请输入概率:" <<endl;cin>>l;
p->Xi=L;
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<2*n-1;i++)
{
HuffNode[i].letter=0;
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';}
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<=2)//z=0,i<1表示只有一个概率了
本科生实验报告
实验课程信息论与编码
学院名称信息科学与技术学院
专业名称通信工程
学生姓名
学生学号
指导教师谢振东
实验地点6C601
实验成绩
二〇 一五 年 十一 月 二〇 一五 年 十一月
实验一:
一、
掌握通过计算机实现香农编码的方法。

对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。
三、实验
给定某个信源符号的概率分布,通过以下的步骤进行香农编码
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)地址
{
cout<<"************费诺编码************"<<endl;
input();
cout<<endl<<endl<<"\t\t\t\t\t\t\t"<<endl;
}
五、
六、实验内容:
1、对给定信源 进行二进制费诺编码,编码结果如下所示:
2、对给定信源 进行二进制费诺编码,编码结果如下所示:
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;
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;
cout<<"对输入信源排序结果如下:"<<endl;
{
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;
1、将信源消息符号按其出现的概率大小排列
2、确定满足下列不等式的整数码长Ki;
3、为了编成唯一可译码,计算第i个消息的累加概率
4、将累加概率Pi变换成二进制数。
5、取
四、源程序:
#include<math.h>
#include<iostream>
#include<iomanip>
#include<conio.h>
for(i=0;i<N;i++)
for(j=0;j<N;j++){
double temp=Pa[i]*2;
if(temp>=1){
code[i]+="1";
Pa[i]=Pa[i]*2-1;
}
else
code[i]+="0";
Pa[i]*= 2;
}
}
for(i=0;i<N;i++)
code[i]= code[i].substr(0,K[i]);
#include<string>
using namespace std;
int main()
{ int N;
cout<<"请输入信源符号个数:";cin>>N;
cout<<"请输入各符号的概率:"<<endl;
double *X=new double[N]; //离散无记忆信源
int i,j;
for(i=0;i<N;i++)
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()
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<=o;i++)
{
if(pp->next==NULL) break;
l=l+pp->PXi;
3、自已选择一个例子进行费诺编码选择的例子为
,编码结果如下所示:
实验

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

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

霍夫曼编码的步骤:
1、把信源符号按概率大小顺序排列,并设法按逆次序分配码字的长度。
2、在分配码字长度时,首先将出现概率最小的两个符号的概率相加合成一个概率
{
cout<<head1->Xi<<":"<<head1->key<<endl;
break;
}
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)
for(p=HEAD;p->next!=NULL;p=p->next)
cout<<p->Xi<<":"<<p->PXi<<endl;
cout<<"对输入信源编码结果如下:"<<endl;
encoding(HEAD);
}
/***********************编码************************/
cout<<setw(12)<<"信源"<<setw(12)<<"概率p(x)"<<setw(12)<<"累加概率Pa(x)"<<setw(8)<<"码长K"<<setw(8)<<"码字"<<endl;
for(i=0;i<N;i++)cout<<setw(12)<<i+1<<setw(12)<<X[i]<<setw(12)<<Pa[i]<<setw(8)<<K[i]<<setw(8)<<code[i]<<endl;
3、把这个合成概率看成是一个新组合符号地概率,重复上述做法直到最后只剩下两个符号概率为止。
4、完成以上概率顺序排列后,再反过来逐步向前进行编码,每一次有二个分支各赋予一个二进制码,可以对概率大的赋为0,概率小的赋为1。
四、源程序:
#include<stdio.h>
#include<conio.h>
#include<iostream>
{
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<N;i++)
Pa[i]=Pa[i-1]+X[i-1];
string *code=new string[N];

费诺编码的步骤:
1、将概率按从大到小的顺序排列;
2、按编码进制数将概率分组,使每组概率和尽可能接近或相等;
3、给每组分配一位码元;
4、将每一分组再按同样原则划分,重复2和3,直到概率不再可分为止。
四、源程序:
#include<iostream>
#include<cmath>
using namespace std;
retuen书写错误,应改为return。
七、实验内容:
1、对给定信源 进行二进制香农编码,编码结果如下所示:
2、对给定信源 进行二进制香农编码,编码结果如下所示:
3、自已选择一个例子进行香农编码,选择的例子为 ,编码结果如下所示:
实验

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

对于给定的信源的概率分布,按照费诺编码的方法进行计算机实现。
delete []X;
delete []Pa;
delete []K;
delete []code;
getchar();
return 0;
}
六、调试过程中出现的错误:
1、在源代码的基础上添加:
#include<math.h>
#include<iostream>
#include<iomanip>
#include<conio.h>
HuffNode[i].weight=0;
HuffNode[i].parent=-1;
HuffNode[i].lchild=-1;
HuffNode[i].rchild=-1;
}
for (i=0;i<n-1;i++)
for (j=i+1;j<n-1;j++)
if (a[j].num>a[i].num)
#include<string>
using namespace std;
2、出现错误的语句
double*Pa=new double[N];pa[0]=0.0,pa[i]=pa[i-1]+X[i-1];红色部分应该改为和前面绿色的格式一样,不然编译程序时会出现红色部分为定义
3、出现错误的语句:retuen 0;
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,请重新输入"<<endl;
input();
}
T=sort(head);
相关文档
最新文档