香农编码用matlab实验报告,香农编码实验报告.doc

这是一份中南大学《信息论与编码》实验报告,重点介绍了如何使用香农编码算法。实验目标包括熟悉香农编码算法和掌握C语言编程技术。报告详细阐述了实验要求、编码算法、调试过程及实验总结。在调试过程中,解决了关于Unix头文件的错误。
摘要由CSDN通过智能技术生成

中南大学

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

题 目 信源编码实验 指导教师 学 院专业班级 姓名 学号 日期

目录

一、香农编码……………………………………….....3

实验目的.................................................................................3

实验要求.................................................................................3

编码算法.................................................................................3

调试过程.................................................................................3

参考代码.................................................................................4

调试验证.................................................................................7

实验总结.................................................................................7

二、哈夫曼编码……………………………………….8

实验目的.................................................................................8

实验原理................................

1、问题背景: 1949年香农在《有噪声时的通信》一文中提出了信道容量的概念和信道编码定理,为信道编码奠定了理论基础。无噪信道编码定理(又称香农第一定理)指出,码字的平均长度只能大于或等于信源的熵。有噪信道编码定理(又称香农第二定理)则是编码存在定理。它指出只要信息传输速率小于信道容量,就存在一类编码,使信息传输的错误概率可以任意小。随着计算技术和数字通信的发展,纠错编码和密码学得到迅速的发展。 2、课题分析: 运用matlab编写程序求解任给信源符号概率的香农编码。给定一组信源符号概率,通过所编写的程序对信源符号概率编码,求出此信源符号概率对应的香农编码。 3、编程方法: 据课本上的介绍编码香农码的方法。 首先,给定信源符号概率,要先判断信源符号概率是否满足概率分布,即各概率之和是否为1,如果不为1就没有继续进行编码的必要,虽然任可以正常编码,但编码失去了意义。 其次,对信源符号概率进行从小到大的排序,以便进行下一步。从第一步就知道信源符号的个数n,于是构造一个nx4的零矩阵D,以便储存接下来运算的结果。把排好序的信源符号概率以列的形式赋给D的第一列。 再次,做编码的第二步,求信源符号概率的累加概率(方法见程序),用来编写码字。 接着求各信源符号概率对应的自信息量,用于求解码长k。 然后,我们对刚求的自信息量对无穷方向取最小正整数,得到的最小正整数就是该信源符号所对应编码的码长k,有了码长,接下来就可以求解码字。 最后,对所求到的累加概率求其二进制,取其小数点后的数,所取位数由该信源符号对应的码长决定,所用的步骤结束,依次得到各信源符号的香农编码
仙农编码实验报告 一、实验目的 实验仙农编码算法 二、实验步骤 1、输入信源个数n 2、输入n个信源的概率 3、由大到小重新排列信源 4、实现信源概率的叠加 5、计算码长l 6、编码 7、计算平均码长pl、信源熵Hx以及编码效率q 三、源程序: #include<iostream> #include<math.h> #include<string> using namespace std; void input(int n,float *g){//输入信源概率 for(int i=0;i<n;i++){ cout<<"请输入第"<<i+1<<"个信源的概率: "; cin>>g[i]; } } void rank(int n,float *g){//重新排列 float templ; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(g[i]<g[j]){ templ=g[i]; g[i]=g[j]; g[j]=templ; } } } } void output(int n,float *g){ cout<<endl; cout<<"**********从大到小重新排列后的信源**********"; cout<<endl; for(int i=0;i<n;i++){ cout<<"第"<<i+1<<"个信源的概率是:"<<g[i]<<endl; } cout<<endl; } void add(int n,float *g,float *a){ //a[i]为累加概率的数组 cout<<"**********累加概率***********"<<endl; a[0]=0.00; //令累加概率的第一个值为0 for(int i=1;i<n;i++){ a[i]=a[i-1]+g[i-1]; } for(i=0;i<n;i++){ cout<<"第"<<i+1<<"个累加概率为 "<<a[i]<<endl; } } void length(int n,float *g,int *k){//求码字的长度k[i] cout<<endl; cout<<"**********计算码长**********"<<endl; for(int i=0;i<n;i++){ for(int j=0;j<10;j++){ if(j<1-log(g[i])/log(2) && j>=-log(g[i])/log(2) ) k[i]=j; } float l=-log(g[i])/log(2); int temp=int(l); if(l-temp==0) k[i]=temp; else k[i]=temp+1; cout<<"第"<<i+1<<"个信源的码长为: "<<k[i]<<endl; } } void XN_Code(int n,float *a,int *k,string *Str){//编码 cout<<endl; cout<<"**********编码**********"<<endl; for(int i=0;i<n;i++){ float s=a[i]; for(int j=0;j<k[i];j++){ //k[i]为码长 s=s*2; if(s>=1){ Str[i]+="1"; s=s-1; } else Str[i]+="0"; } } for(i=0;i<n;i++){ cout<<"第"<<i+1<<"个信源的码字为: "<<Str[i]<<endl; } } void main(){ int n,k[10]; float p[10],pa[10],pl=0,Hx=0,q;//pl为平均码长 string Str[10]; cout<<"请输入信源的个数:(小于等于10)"<<endl; cin>>n; input(n,p); //输入信源的概率 rank(n,p); //从小到大重新排列输入的概率 output(n,p); //输出重新排列的概率 add(n,p,pa); //累加概率 length(n,p,k);//求码长 XN_Code(n,pa,k,Str);//编码 for(int i=0;i<n;i++){ //求平均码长 pl+=p[i]*k[i]; Hx=Hx-p[i]*(log(p[i])/log(2)); } q=Hx/pl*100; cout<<"平均码长为: "<<pl<<"比特/符号"<<endl; cout<<"该信源的信源熵为: "<<Hx<<"比特/符号"<<endl; cout<<"编码效率为:"<<q<<"%"<<endl; } 四、运行结果: ----------------------- 香农编码实验报告(1)全文共7页,当前为第1页。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值