信息论与编码实验报告材料

  • 格式:doc
  • 大小:411.30 KB
  • 文档页数:29

下载文档原格式

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

本科生实验报告

实验课程信息理论与编码

学院名称信息科学与技术学院

专业名称

学生姓名

学生学号

指导教师

实验地点

实验成绩

二〇一六年九月----二〇一六年十一月

填写说明

1、适用于本科生所有的实验报告(印制实验报告册除外);

2、专业填写为专业全称,有专业方向的用小括号标明;

3、格式要求:

①用A4纸双面打印(封面双面打印)或在A4大小纸上用蓝黑色水笔书写。

②打印排版:正文用宋体小四号,1.5倍行距,页边距采取默认形式(上下2.54cm,

左右2.54cm,页眉1.5cm,页脚1.75cm)。字符间距为默认值(缩放100%,间距:标准);页码用小五号字底端居中。

③具体要求:

题目(二号黑体居中);

摘要(“摘要”二字用小二号黑体居中,隔行书写摘要的文字部分,小4号宋体);

关键词(隔行顶格书写“关键词”三字,提炼3-5个关键词,用分号隔开,小4号黑体);

正文部分采用三级标题;

第1章××(小二号黑体居中,段前0.5行)

1.1 ×××××小三号黑体×××××(段前、段后0.5行)

1.1.1小四号黑体(段前、段后0.5行)

参考文献(黑体小二号居中,段前0.5行),参考文献用五号宋体,参照《参考文献著录规则(GB/T 7714-2005)》。

实验一:香农(Shannon )编码

一、实验目的

掌握通过计算机实现香农编码的方法。

二、实验要求

对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。

三、实验基本原理

给定某个信源符号的概率分布,通过以下的步骤进行香农编码 1.将信源消息符号按其出现的概率大小排列

)()()(21n x p x p x p ≥≥≥ 2.确定满足下列不等式的整数码长K i ;

1)(log )(log 22+-<≤-i i i x p K x p

3.为了编成唯一可译码,计算第i 个消息的累加概率

∑-==1

1

)(i k k i x p p

4.将累加概率P i 变换成二进制数。

5.取P i 二进制数的小数点后K i 位即为该消息符号的二进制码。

四、实验内容

1.对给定信源⎥

⎦⎤⎢⎣⎡=⎥⎦⎤⎢⎣

⎡01.01.015.017.018.019.02.0)(7654321

x x x x x x x X q X 进行二进制香农编码。 2.对给定信源⎥⎦⎤⎢⎣⎡=⎥⎦⎤⎢⎣

⎡05.010.015.020.025.025.0)(654321x x x x x x X q X 进行二进制香农编码。 3.自已选择一个例子进行香农编码。

五、实验设备

PC 计算机 ,C++

六、实验报告要求

1、画出程序设计的流程图,

2、写出程序代码,

3、写出在调试过程中出现的问题,

4、对实验的结果进行分析。

七、流程图

八、程序代码

// test.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

int test;

int N;

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

cout<<"请输入各符号的概率:"<

double *X=new double[N]; //离散无记忆信源int i,j;

for(i=0;i

{

cout<<"X["<>X[i];

}

//由小到大排序

for(i=0;i

for(j=i+1;j

if(X[i]

{ double temp=X[i];X[i]=X[j];X[j]=temp;}

int *K=new int[N]; //确定码长

for(i=0;i

{

K[i]=int(-(log(X[i])/log(2.0)))+1; //确认码长为1-log2(p(xi))

if(K[i]==(-(log(X[i])/log(2.0)))+1)//当K[i]=-log2(p(xi))时,K[i]--

K[i]--;

}

//累加概率

double *pa=new double[N];pa[0]=0.0;

double *p=new double[N];p[0]=0.0;

for(i=1;i

{

pa[i]=pa[i-1]+X[i-1];

p[i]=pa[i];

}

//将累加概率转换为二进制

string *code=new string[N];

for(i=0;i

for(j=0;j

{

double temp=pa[i]*2;

if(temp>=1) //累加概率乘2大于1,对应码字加1,累加概率自身取余

{

code[i]+="1";

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

}

else //累加概率乘2小于1时,对应码字加0,累加概率自身取余

{

code[i]+="0";

pa[i]*= 2;

}

}

for(i=0;i

{ code[i]= code[i].substr(0,K[i]); } //求码字

//输出码字

cout<

for(i=0;i

cout<

K[i]<data()<

delete []X;

delete []pa;