香农编码课程设计报告

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

信息论与编码课程设计

实验报告

课程题目:香农编码

*名:***

学号:************

班级:电信10-03班

指导老师:***

学院:电气工程与自动化学院

日期:2013年3月28日

一.设计任务与要求

熟悉运用香农编码,并能通过C语言进行编程,对任意输入消息概率,利用香农编码方法进行编码,并计算信源熵和编码效率。

二. 实验原理

原理:编码的目的是为了优化通信系统。香农编码属于不等长编码,通常将经常出现的消息编成短码,不常出现的消息编成长码。从而提高通信效率。

香农第一定理指出了平均码长与信源之间的关系,同时也指出了可以通过编码使平均码长达到极限值,这是一个很重要的极限定理。

香农第一定理指出,选择每个码字的长度Ki满足下式:

-log2 p(xi)≤Ki <1-log2 p(xi)

就可以得到这种码。这种编码方法称为香农编码。

二进制香农码的编码步骤如下:

⑴将信源符号按概率从大到小的顺序排列,

p(a1)≥p(a2)≥…≥p(an)

⑵确定满足下列不等式的整数Ki ,

-log2 p(ai)≤Ki <1-log2 p(ai)

⑶令p(a1)=0,用Pi表示第i个码字的累加概率,

⑷将Pi用二进制表示,并取小数点后Ki位作为符号ai的编码三.设计思路

二进制香农编码的步骤如下:(1)、将信源符号按概率从大到小的顺序排列(2)、对第j个前的概率进行累加得到pa(aj)(3)、由-logp(ai) ki<1-logp(ai)求得码字长度ki(4)、将pa(aj)用二进制表示,并取小数点后ki位作为符号ai的编码。

五. 程序及结果

香农编码源程序

#include

#include

#include

#include

class T

{

public:

T() {}

~T();

void Create();

void Coutpxj();

void Coutk();

void Coutz();

void Print();

protected:

int n;

double *p;

double *pxj;

int *k;

double *mz;

};

void T::Create()

{

cout<<"请输入信源符号个数:";

cin>>n;

p=new double[n];

cout<<"请分别输入这"<

cin>>p[i];

pxj=new double[n];

k=new int[n];

mz=new double[n];

double sum=0.0;

for(i=0;i

sum+=p[i];

if(sum!=1.0)

throw 1;

else

{

for(i=0;i

{

int k=i;

for(int j=i+1;j

if(p[k]

double m=p[i];

p[i]=p[k];

p[k]=m;

}

}

}

T::~T()

{

delete p;

delete pxj;

delete k;

delete mz;

}

void T::Coutpxj()

{

pxj[0]=0;

for(int i=1;i

{

pxj[i]=0;

for(int j=0;j

pxj[i]+=p[j];

}

}

void T::Coutk()

{

for(int i=0;i

{

double d=(-1)*(log(p[i])/log(2)); if(d-(int)d>0) k[i]=(int)d+1;

else k[i]=(int)d;

}

}

void T::Print()

{

cout<<"Xi"<

<

<

<

<

for(int i=0;i

{ cout<<"X"<

<

mz[i]=pxj[i];

for(int j=0;j

{

if(2*mz[i]-1>=0)

{

cout<<1;

mz[i]=2*mz[i]-1;

}

else

{

cout<<0;

mz[i]=2*mz[i];

相关文档
最新文档