信息论与编码实验报告材料
- 格式:doc
- 大小:411.30 KB
- 文档页数:29
本科生实验报告
实验课程信息理论与编码
学院名称信息科学与技术学院
专业名称
学生姓名
学生学号
指导教师
实验地点
实验成绩
二〇一六年九月----二〇一六年十一月
填写说明
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]< delete []X; delete []pa;