实现香农编码、费诺编码杨兴勃0808060121

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
char data;
float P;
}Fano[MAX+1];//需要编码的结构体
3.2、算法基本原理
1)将概率按从大到小的顺序排列;
2)按编码进制数将概率分组,使每组概率和尽可能接近或相等;
3)给每组分配一位码元;
4)将每一分组再按同样原则划分,重复2)和3),直到概率不再可分为止。
四、费诺编码流程图:
{
double s=pa[i];
for(int j=0;j<k[i];j++)
{
s=2*s;
if(s>=1)
{
str[i]+="1";
s=s-1;
}
else str[i]+="0";
}
}
}
void main()
{
int n;
cout<<"信源符号个数n=";
cin>>n;
double *p=new double[n];
六、费诺编码测试结果截图:
七、总结:
八、参考文献:
香农编码
一、课题描述:
对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。

(1)进一步熟悉香农编码算法;
(2)掌握程序设计和调试技术中数值的进制转换、数值愈字符串之间的转换等技术。

(1)输入:信源符号个数 、信源的概率分布 ;
(2)输出:每一个信源符号对应的香农编码码字。
code(k,pa,str,n);
cout<<setw(10)<<"p(ai)"<<setw(10)<<"Pa(aj)"<<setw(10)<<"Ki"<<setw(10)
<<"码字"<<endl;
for(i=0;i<n;i++)
{
cout<<setw(10)<<p[i]<<setw(10)<<pa[i]<<setw(10)<<k[i]<<setw(10)<<str[i] <<endl;
{
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(p[i]<p[j])
{
double temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
}
}
void leijia(double *p,double *pa,int n)//累加概率
{
double sum=0.0;
《信息论课程设计》
———实现香农编码、费诺编码
信计0801班
杨兴勃
01
香农编码
一、课题描述:
二、课程设计目的:
三、课程设计要求:
四、算法分析:
五、香农编码流程图:
六、程序设计代码:
七、实验结果:
八、总结:
九、参考文献:
费诺编码
一、问题描述:
二、实习目的:
三、算法分析:
四、费诺编码流程图:
五、费诺编码源程序代码:
k[i]=j;
}
double I=-log(p[i])/log(2);
int temp=int(I);
if(I-temp==0) k[i]=temp;
else k[i]=temp+1;
}
}
void code(int *k,double *p来自百度文库,string *str,int n)//求编码
{
for(int i=0;i<n;i++)
2.《C/C++语言程序设计》龚尚福主编,中国矿业大学出版社
费诺编码
一、问题描述
对于给定的信源的概率分布,按照费诺编码的方法进行计算机实现。
二、实习目的
掌握通过计算机实现费诺编码。
三、算法分析
3.1、数据结构
本程序采用一个结构体的数据类型来存储费诺编码的相关信息,具体的数据结构如下:
typedef struct
4)将累加和用二进制表示,并取小数点后码字的长度的码。
五、香农编码流程图:

#include<iostream>
#include<math.h>
#include<string>
#include<iomanip>
using namespace std;
void bubble(double *p,int n)//排序
}
}
七、实验结果:
八、总结:
通过本次上机,我对香农编码有了进一步的了解,掌握了其具体过程的实现方法,也对新源编码这一概念有了更加深刻的理解,在编码的过程中,是我对C以及C++语言的基础知识掌握更加牢固,特别是巩固了对输出流格式控制的相关知识,总而言之,这次课程设计实践让我受益匪浅。
九、参考文献:
1.《信息论与编码》(第二版)曹雪虹张宗橙编著,清华大学出版社
for(int i=0;i<n;i++)
{
pa[i]=sum;
sum+=p[i];
}
}
void length(double *p,int *k,int n)//码字的长度
{
for(int i=0;i<n;i++)
{
for(int j=0;j<20;j++)
{
if(j<1-log(p[i])/log(2) && j>=-log(p[i])/log(2) )
cout<<"信源符号的概率依次为:";
for(int i=0;i<n;i++)
{
cin>>p[i];
}
bubble(p,n);
double *pa=new double[n];
leijia(p,pa,n);
int *k=new int[n];
length(p,k,n);
string *str=new string[n];
{
if((b-a)>=1)//判断该组中符号个数是否大于2
{
double sum=0;
for(int i=a;i<=b;i++)
sum+=p[i];//计算该组概率累加和
double s1=0,*s=new double[10];
for(i=a;i<=b;i++)
{
s1+=p[i];s[i]=fabs(2*s1-sum)/sum;
五、费诺编码源程序代码:
#include<iostream>
#include<math.h>
#include<string>
#include<iomanip>
using namespace std;
//全局变量定义
int n;
string *sign;
double *p;
string *code;
void fano(int a,int b)//费诺编码函数

2.1、数据结构
分别用数组p、q、k存放输入的概率,累加概率、码字长度;
2.2、算法基本原理
给定某个信源符号的概率分布,通过以下的步骤进行香农编码:
1)信源符号按概率从大到小排列;
2)对信源符号求累加和,表达式: Pi=Pi-1+p(xi);
3)求自信息量,确定码字长度。自信息量I(xi)=-log(p(xi));码字长度取大于等于自信息量的最小整数;
相关文档
最新文档