海南大学信息科学技术学院信息安全专业
《信息论与编码》实验报告
姓名 学号 香农编码 专业班级 信息安全 成绩 实验报告题目 教师评语
一、 实验目的:
了解掌握香农编码
二、 实验环境:CodeBlocks
三、 实验要求
编程,对某一离散无记忆信源实现香农编码,输出消息符号及其对应的码字。
a2a3a4a5a6a7??X??a1?设离散无记忆信源???p(X)??0.200.190.180.170.150.100.01?,?????p(a)?1。二进制香农编码过程如下:
ii?1n1、将信源发出的N个消息符号按其概率的递减次序依次排列。 2、按下式计算第i个消息的二进制代码组的码长,并取整。 3、为了编成唯一可译码,首先计算第i个消息的累加概率 4、将累加概率Pi (为小数)变成二进制数
5、除去小数点,并根据码长li ,取小数点后li 位数作为第i个消息的码字。
四、 实验过程:
代码:
#include
int i,n, j,k; float sum=0;
float p[100]={0}; //无记忆信源X的概率分布
float m;
float Pa[100]={0}; //累加概率的数组 int l[100];
char c[100][100];
printf(\请输入信源X的个数:\scanf(\
printf(\请输入p[X]的概率分布\\n\for(i=0;i scanf(\ for(i=0;i<=n;i++) //判断概率和为1 sum=sum+p[i]; while(sum!=1) { printf(\错误输入,请重输\\n\ printf(\请输入x的个数\\n\ scanf(\ printf(\ printf(\请输入p[i]的概率分布\\n\ for(i=0;i scanf(\ for(i=0;i for(j=0;j m=p[i]; p[i]=p[i+1]; p[i+1]=m; } printf(\由大到小的顺序为\\n:\for(i=0;i printf(\printf(\Pa[0]=0; for(j=1;j Pa[j]=Pa[j-1]+p[j-1]; } printf(\累加和Pi为:\for(j=0;j printf(\ printf(\printf(\码长:\ for(i=0;i m=log(1/p[i])/log(2); if(m==(int)m) l[i]=(int)m; else l[i]=(int)(m+1); } for(i=0;i printf(\printf(\ for(i=0;i for(k=0;k Pa[i]=Pa[i]*2; if(Pa[i]>=1) { Pa[i]=Pa[i]-1; c[i][k]='1'; } else { c[i][k]='0'; } } } for(i=0;i for(k=0;k 五、 实验结果: 将累加概率转换成二进制数