logo资料库

信息论与编码.doc

第1页 / 共47页
第2页 / 共47页
第3页 / 共47页
第4页 / 共47页
第5页 / 共47页
第6页 / 共47页
第7页 / 共47页
第8页 / 共47页
资料共47页,剩余部分请下载后查看
1 实验一:香农(Shannon)编码 一、 实验目的 掌握通过计算机实现香农编码的方法。 二、实验要求 对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。 三、实验基本原理 给定某个信源符号的概率分布,通过以下的步骤进行香农编码 1. 将信源消息符号按其出现的概率大小排列 ( xp 1 )  ( xp 2 )    ( nxp ) 2.确定满足下列不等式的整数码长 Ki ; ( xp i ( xp i log log    2 2 ) K i 1)  3.为了编成唯一可译码,计算第 i 个消息的累加概率 p i  i 1  k 1  ( xp k ) 4.将累加概率 Pi 变换成二进制数。 5.取 Pi 二进制数的小数点后 K i 位即为该消息符号的二进制码。 四 实验内容 1. 对给定信源 X ( Xq       ) x x 2 1 19.02.0    x 3 18.0 x 4 17.0 x 5 15.0 x x  6 7  01.01.0  进行二进 制香农编码。 2. 对给定信源 X ( Xq       ) x 1 25.0    x 2 25.0 x 3 20.0 x 4 15.0 x 5 10.0 x 6 05.0    进行二进制 香农编码。 3. 自已选择一个例子进行香农编码。 五、实验设备 PC 计算机 ,C++ 六、实验报告要求
2 1、画出程序设计的流程图, 2、写出程序代码, 3、写出在调试过程中出现的问题 , 4、对实验的结果进行分析。 七、参考程序(仅供参考) //香农(Shannon)编码参考程序 int main() { int N; cout<<”请输入信源符号个数:”;cin>>N; cout<<”请输入各符号的概率:”<>X[i]; } //由小到大排序 for(i=0;i
3 //累加概率 double *Pa=new double[N];pa[0]=0.0; for(i=1;i=1) //累加概率乘 2 大于 1,对应码字加 1,累加概率自身取余 { code[i]+=”1”; Pa[i]=Pa[i]*2-1; } else { //累加概率乘 2 小于 1 时,对应码字加 0,累加概率自身取余 code[i]+=”0”; Pa[i]*= 2; } } for(i=0;i
4 delete []X; delete []Pa; delete []K; delete []code; getch(); retuen 0; }
5 实验二 费诺编码 一、实验目的 掌握通过计算机实现费诺编码。 二、实验要求 对于给定的信源的概率分布,按照费诺编码的方法进行计算机实现。 三、实验基本原理 费诺编码的步骤: 1. 将概率按从大到小的顺序排列; 2. 按编码进制数将概率分组,使每组概率和尽可能接近或相等; 3. 给每组分配一位码元; 4. 将每一分组再按同样原则划分,重复 2 和 3,直到概率不再可分为止。 四 实验内容 1. 对给定信源 X ( Xq       ) x x 2 1 19.02.0    x 3 18.0 x 4 17.0 x 5 15.0 x x  6 7  01.01.0  进行二进 制费诺编码。 2. 对给定信源 X ( Xq       ) x 1 25.0    x 2 25.0 x 3 20.0 x 4 15.0 x 5 10.0 x 6 05.0    进行二进制 费诺编码。 3. 自已选择一个例子进行费诺编码。 五、 实验设备 PC 计算机 ,C++ 六、实验报告要求 1、画出程序设计的流程图, 2、写出程序代码, 3、写出在调试过程中出现的问题 , 4、对实验的结果进行分析。
6 七、参考程序(仅供参考) //********费诺编码参考程序 1**** //全局变量定义 int n; string *sign; double *p; string *code; void fano(int a,int b) { //费诺编码函数 if((b-a)>=1) { //判断该组中符号个数是否大于 2 double sum=0; for(int i=a;i<=b;i++) sum+=p[i]; //计算该组概率累加和 double s1=0, *s=new double[10]; for(int i=a;i<=b;i++) { s1+=p[i];s[i]=fabs(2*s1-sum)/sum; } double min=s[a]; int c; for(int i=a;i<=b;i++) if(s[i]<=min) { min=s[i]; c=i; } for(int i=a;i<=b;i++) { //定位使两组概率和尽可能相近或相等的位置 c if(i<=c) code[i]+=”0”; else code[i]+=”1”; //码字加“0” //码字加“1”
7 } //判断分组点位置,进而分情况自身调用 if(c==a) fano(c+1,b); else if(c==b-1) fano(a,c); else { fano(a,c);fano(c+1,b); } } } void main() { cout<<””请输入信源符号个数 n:”; cin>>n; p=new double[n]; sign=new string[n]; code=new string[n]; cout<<”请输入信源符号:” ; for(int i=0;i>sign[i]; cout<<”请输入信源符号的概率:” ; for(int i=0;i>p[i]; for(int i=0;i
8 //费诺编码 fano(0,n-1); cout< #include using namespace std; class DATA//数据类,采用双向表 { public://初始化 PXi=1 是为了在排序迭代时方便 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;//排序函数用
分享到:
收藏