当前位置:文档之家› 香农编码实验报告

香农编码实验报告

if(temp==0)
C[i]=strcat(C[i],"0");
else
C[i]=strcat(C[i],"1");
}
}
/*显示编码结果*/
fprintf(stdout,"The output coding is :\n");
for(i=0;i<n;i++)
fprintf(stdout,"%s",C[i]);
for(i=0;i<n;i++)
fscanf(stdin,"%f",&p_i[i]);
/*确认输入的数据*/
sum=0.0;
for(i=0;i<n;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<n;i++)
{
p=(float)(-(log(p_i[i])))/log(2.0);
l_i[i]=(int)ceil(p);
}
/*为码字分配内存地址*/
/*将概率和转变为二进制编码*/
for(i=0;i<n;i++)
{
for(j=0;j<l_i[i];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*/
C=(char **)calloc(n,sizeof(char *));
for(i=0;i<n;i++)
{
C[i]=(char *)calloc(l_i[i]+1,sizeof(char));
C[i][0]='\0';
}
/*计算概率累加和*/
P_i[0]=0.0;
for(i=1;i<n;i++)
P_i[i]=P_i[i-1]+p_i[i-1];
香农编码是码符号概率大的用短码表示,概率小的是用长码表示,程序中对概率排序,最后求得的码字就依次与排序后的符号概率对应。
原因:l_i(int *)calloc(n,sizeof(int)); l_i后缺少赋值符号使之不能通过编译
纠错:添加上赋值符号
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、参考代码
湖南大学
信息科学与工程学院
实验报告
实验名称
香农编码
课程名称
信息论与编码
1、实验目的
(1)进一步熟悉Shannon编码算法;
(2)掌握C语言程序设计和调试过程中数值的进制转换、数值与字符串之间的转换等技术。
2、实验要求
(1)输入:信源符号个数q、信源的概率分布p;
(2)输出:每个信源符号对应的Shannon编码的码字。
int j=1;/*内层循环变量*/
int finish=0;/*结束标志*/
float temp;/*中间变量*/
while(i<m&&!finish)
{
finish=1;
for(j=0;j<m-i;j++)
{
/*将小的数后移*/
if(k[j]<k[j+1])
{
temp=k[j];
k[j]=k[j+1];
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));
/*存储信道传输的概率*/
# include<stdio.h>
# include<math.h>
# include<stdlib.h>
# include<string.h>
# define DELTA 0.000001/*精度*/
void sort(float*,int);/*排序*/
int main(void)
{
register int i,j;
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
fprintf(stdout,"\n\n");
/*释放内存空间*/
for(i=n-1;i>=0;i--)
free(C[i]);
free(C);
free(p_i);
free(P_i);
free(l_i);
exit(0);
}
/*冒泡排序法*/
void sort(float *k,int m)
{
int i=1;/*外层循环变量*/
int n; /*符号个数*/
int temp;/*中间变量*/
float *p_i; /*符号的概率*/
float *P_i; /*累加概率*/
int *l_i; /*码长*/
char * *C; /*码集合*/
/*用sum来检验数据,用p来缓存了中间数据*/
float sum,p;
/*输入符号数*/
k[j+1]=k[j];
finish=0;
}
i++;
}
}
}
6、调试验证:
程序结果:
7、实验总结
1949年香农在《有噪声时的通信》一文中提出了信道容量的概念和信道编码定理,为信道编码奠定了理论基础。无噪信道编码定理(又称香农第一定理)指出,码字的平均长度只能大于或等于信源的熵。有噪信道编码定理(又称香农第二定理)则是编码存在定理。它指出只要信息传输速率小于信道容量,就存在一类编码,使信息传输的错误概率可以任意小。随着计算技术和数字通信的发展,纠错编码和密码学得到迅速的发展。香农编码定理虽然指出了理想编码器的存在性,但是并没有给出实用码的结构及构造方法,编码理论正是为了解决这一问题而发展起来的科学理论。编码的目的是为了优化通信系统。
3、Shannon编码算法
1:procedure SHANNON(q,{ })
2: 降序排列{ }
3: for i=1 q do
4: F( )
5:
6:将累加概率F( )(十进制小数)变换成二进制小数。
7:取小数点后 个二进制数字作为第i个消息的码字。
8ห้องสมุดไป่ตู้end for
9:end procedure
------------------------------------------------------------------------------------------------------------------
相关主题