香农编码实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中南大学

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

目录

一、香农编码 (3)

实验目的 (3)

实验要求 (3)

编码算法 (3)

调试过程 (3)

参考代码 (4)

调试验证 (7)

实验总结 (7)

二、哈夫曼编码 (8)

实验目的 (8)

实验原理 (8)

数据记录 (9)

实验心得 (10)

一、香农编码

1、实验目的

(1)进一步熟悉Shannon 编码算法;

(2)掌握C 语言程序设计和调试过程中数值的进制转换、数值与字符串之间

的转换等技术。

2、实验要求

(1)输入:信源符号个数q 、信源的概率分布p ;

(2)输出:每个信源符号对应的Shannon 编码的码字。

3、Shannon 编码算法 1:procedure SHANNON(q,{Pi })

2: 降序排列{Pi } 3: for i=1 q do 4: F(i s ) 5:i l 2

[]log 1/()i p s 6:将累加概率F(i s )(十进制小数)变换成二进制小数。

7:取小数点后i l 个二进制数字作为第i 个消息的码字。

8:end for

9:end procedure

------------------------------------------------------------------------------------------------------------------

4、调试过程

1、fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory

fatal error C1083: Cannot open include file: 'values.h': No such file or directory

原因:unistd.h 和values.h 是Unix 操作系统下所使用的头文件

纠错:删去即可

2、error C2144: syntax error : missing ')' before type 'int'

error C2064: term does not evaluate to a function

原因:l_i(int *)calloc(n,sizeof(int)); l_i 后缺少赋值符号使之不能通过编译

纠错:添加上赋值符号

1

1

()i k k p s -=∑

3、error C2018: unknown character '0xa1'

原因:有不能被识别的符号

纠错:在错误处将不能识别的符号改为符合C语言规范的符号

4、error C2021: expected exponent value, not ' '

原因:if(fabs(sum-1.0)>DELTA); 这一行中DELTA宏定义不正确

纠错:# define DELTA 0.000001

5、error C2143: syntax error : missing ';' before '}'

原因:少写了“;”号

纠错:在对应位置添加上“;”号

5、参考代码

# include

# include

# include

# include

# define DELTA 0.000001/*精度*/

void sort(float*,int);/*排序*/

int main(void)

{

register int i,j;

int n; /*符号个数*/

int temp;/*中间变量*/

float *p_i; /*符号的概率*/

float *P_i; /*累加概率*/

int *l_i; /*码长*/

char * *C; /*码集合*/

/*用sum来检验数据,用p来缓存了中间数据*/

float sum,p;

/*输入符号数*/

fscanf(stdin,"%d",&n);

/*分配内存地址 */

p_i=(float *)calloc(n,sizeof(float));

P_i=(float *)calloc(n,sizeof(float));

l_i=(int *)calloc(n,sizeof(int));

/* 存储信道传输的概率*/

for(i=0;i

fscanf(stdin,"%f",&p_i[i]);

/*确认输入的数据*/

sum=0.0;

for(i=0;i

sum+=p_i[i];

if(fabs(sum-(1.0))>DELTA)

fprintf(stderr,"Invalid input data \n");

fprintf(stdout,"Starting…\n\n");

/*以降序排列概率*/

sort (p_i,n);

/*计算每个符号的码长*/

for(i=0;i

{

p=(float)(-(log(p_i[i])))/log(2.0);

l_i[i]=(int)ceil(p);

}

/*为码字分配内存地址*/

C=(char **)calloc(n,sizeof(char *));

for(i=0;i

{

C[i]=(char *)calloc(l_i[i]+1,sizeof(char));

C[i][0]='\0';

}

/*计算概率累加和*/

P_i[0]=0.0;

for(i=1;i

P_i[i]=P_i[i-1]+p_i[i-1];

/*将概率和转变为二进制编码*/

for(i=0;i

{

for(j=0;j

{

/*乘2后的整数部分即为这一位的二进制码元*/ P_i[i]=P_i[i]*2;

temp=(int)(P_i[i]);

P_i[i]=P_i[i]-temp;

/*整数部分大于0为1,等于0为0*/

if(temp==0)

C[i]=strcat(C[i],"0");

else

相关文档
最新文档