实验四-香农编码 下载本文

内容发布更新时间 : 2024/5/19 22:37:38星期一 下面是文章的全部内容请认真阅读。

海南大学信息科学技术学院信息安全专业

《信息论与编码》实验报告

姓名 学号 香农编码 专业班级 信息安全 成绩 实验报告题目 教师评语

一、 实验目的:

了解掌握香农编码

二、 实验环境: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 #include void main() {

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

五、 实验结果:

将累加概率转换成二进制数