实验3Huffman编码

实验3Huffman编码
实验3Huffman编码

湖南大学

信息科学与工程学院

实验报告

实验名称Huffman编码方案程序

设计

课程名称信息论与编码

一、实验目的

1、进一步熟悉Huffman编码过程;

2、掌握C语言递归程序的设计和调试技术。

二、实验要求

1、输入:信源符号个数r、信源的概率分布P;

2、输出:每个信源符号对应的Huffman编码的码字。

三、Huffman编码算法描述

1:procedure HUFFMAN({s

i },{p

i

})

2:if q==2 then

3:return s

0→0,s

1

→1

4:else

5:降序排序{p

i

}

6:缩减信源:创建一个符号s’以取代s

2

-

q ,s

1-

q

,其概率为p’ =p

2

-

q

+p

1-

q

7:递归调用Huffman算法以得到s

0,…,s

3-

q

,s’的编码:w

,…,w

3-

q

w’,相应的概率分布为p

0,…,p

3-

q

,p’

8: return s

0→w0,…,s

3-

q

→w

3-

q

,s

2

-

q

→w’0,s

1-

q

→w’1

9: end if

10:end procedure

四、代码分析

#include

#include

#include

#include

#include

#include

# define DELTA 1.0e-6

//节点的结构体

typedef struct

{float weight; //结点权值

unsigned int parent,lchild,rchild; //结点的父指针,左右孩子指针}HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树

typedef char **HuffmanCode; //动态分配数组存储哈夫曼编码表

void CreateHuffmanTree(HuffmanTree &,float*,int ); //生成哈夫曼树void HuffmanCoding(HuffmanTree,HuffmanCode &,int ); //对哈夫曼树进行编码

void PrintHuffmanCode(HuffmanCode,float*,int); //显示哈夫曼编码void Select(HuffmanTree,int,int&,int&); //在数组中寻找权值最小的两个结点

int main()

{

HuffmanTree HT; //哈夫曼树HT

HuffmanCode HC; //哈夫曼编码表HC

int n,i; //n是哈夫曼树叶子结点数

float sum=0;

float *w; //w存放叶子结点权值

printf("请输入信号数目:");

scanf("%d",&n); //输入字符数目

if(n<=1)

{

printf("该数不合理!\n");

}

w=(float*)malloc(n*sizeof(float)); //开辟空间存放权值 printf("请输入信号出现概率:\n");

for(i=0;i

{

scanf("%f",&w[i]); //输入各字符出现的次数/权值

sum +=w[i];

}

//提示输入错误

if(fabs(sum-1.0)>DELTA)

{

fprintf(stderr,"信号概率输入有误 \n");

exit(-1);

}

for(i=0;i

{

CreateHuffmanTree(HT,w,n); //生成哈夫曼树

}

HuffmanCoding(HT,HC,n); //进行哈夫曼编码

PrintHuffmanCode(HC,w,n); //显示哈夫曼编码

}

//构造huffman树

void CreateHuffmanTree(HuffmanTree &HT,float *w,int n) {//w存放n个结点的权值,将构造一棵哈夫曼树HT

int i,m;

int s1,s2;

HuffmanTree p;

if(n<=1) return;

m=2*n-1; //n个叶子结点的哈夫曼树,有2*n-1个结点

HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //开辟2*n各结点空间

for(p=HT+1,i=1;i<=n;++i,++p,++w) //进行初始化,给每个叶子节点赋值 {

p->weight=*w;

p->parent=0;

p->lchild=0;

p->rchild=0;

}

for(;i<=m;++i,++p)

{

p->weight=0;

p->parent=0;

p->lchild=0;

p->rchild=0;

}

for(i=n+1;i<=m;++i) //建哈夫曼树

{

Select(HT,i-1,s1,s2);

//从HT[1...i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2

HT[s1].parent=i; HT[s2].parent=i; //修改s1和s2结点的父指针parent

HT[i].lchild=s1; HT[i].rchild=s2; //修改i结点的左右孩子指针

HT[i].weight=HT[s1].weight+HT[s2].weight; //修改权值

}

}

void HuffmanCoding(HuffmanTree HT,HuffmanCode &HC,int n)

{//将有n个叶子结点的哈夫曼树HT进行编码,所编的码存放在HC中

//方法是从叶子到根逆向求每个叶子结点的哈夫曼编码

int i,c,f,start;

char *cd;

HC=(HuffmanCode)malloc((n+1)*sizeof(char *)); //分配n个编码的头指针向量

cd=(char *)malloc(n*sizeof(char)); //开辟一个求编码的工作空间

cd[n-1]='\0'; //编码结束符

for(i=1;i<=n;++i) //逐个地求哈夫曼编码

{

start=n-1; //编码结束位置

for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) //从叶子到根逆向求编码

{

if(HT[f].lchild==c)

{

start--;

cd[start]='0'; //若是左孩子编为'0'

}

else

{

start--;

cd[start]='1'; //若是右孩子编为'1'

}

}

HC[i]=(char *)malloc((n-start)*sizeof(char)); //为第i个编

码分配空间

strcpy(HC[i],&cd[start]); //将编码从cd复制到HC中 }

free(cd); //释放工作空间

}

void PrintHuffmanCode(HuffmanCode HC,float *w,int n)

{//显示有n个叶子结点的哈夫曼树的编码表

int i;

printf("HuffmanCode is :\n");

for(i=1;i<=n;i++)

{

printf(" %d\t%f\t",i,w[i-1]);

puts(HC[i]);

}

printf("\n");

}

void Select(HuffmanTree HT,int t,int&s1,int&s2)

{//在HT[1...t]中选择parent不为0且权值最小的两个结点,其序号分别为s1和s2

int i;

float m,n;

m=n=1.0;

for(i=1;i<=t;i++)

{

if(HT[i].parent==0&&(HT[i].weight

{

if(m

{

n=HT[i].weight;s2=i;

}

else

{

m=HT[i].weight;s1=i;

}

}

}

if(s1>s2) //s1放较小的序号

{

i=s1;s1=s2;s2=i;

}

}

五、实验结果

先输入信号的数目,然后输入各个信号出现的概率;

输出即为各概率信号的haffman编码。

5、实验总结

Huffman编码的指导思想是:将概率小的消息赋予较大码长,概率大的消息赋予较短的码长。对比香农编码和菲诺编码,Huffman编码的效率最高,考虑所需的存储单元和实现的复杂程度Huffman编码也最高。

信息论与编码实验

实验五霍夫曼编码 一、实验目的 1、熟悉Matlab 工作环境及工具箱; 2、掌握霍夫曼编码的基本步骤; 3、利用MATLAB实现霍夫曼编码。 二、实验内容 (1)熟悉理解Huffman编码的过程 (2)将给定的数据进行Huffman编码 知识要点: 1、霍夫曼编码的基本原理。参照教材及参考书。 2、二进制霍夫曼编码方法。 1. 基本原理: 变长编码 不要求所有码字长度相同,对不同概率的信源符号或序列,可赋予不同长度的码字。变长编码力求平均码长最小,此时编码效率最高,信源的冗余得到最大程度的压缩。 1)几种常用变长编码方法: 霍夫曼编码 费若编码 香农编码。 2)霍夫曼编码: 二进制霍夫曼编码 r进制霍夫曼编码 符号序列的霍夫曼编码。 3)二进制霍夫曼编码的编码过程: 将信源中n个符号按概率分布的大小,以递减次序排列起来; 用0和1码分别分配给概率最小的两个信源符号,并将这两个概率最小的信源符号合并成一个新符号,并用这两个最小概率之和作为新符号的概率,从而得到只包含n-1个符号的新信源,称为其缩减信源; 把缩减信源的符号仍按概率大小以递减次序排列,再将最后两个概率最小的符号合并

成一个新符号,并分别用0和1码表示,这样又形成一个新缩减信源; 依次继续下去,直到缩减信源最后只剩两个符号为止。再将最后两个新符号分别用0和1 码符号表示。最后这两个符号的概率之和为1,然后从最后一级缩减信源开始,依编码路径右后向前返回,就得到各信源符号所对应得码符号序列,即对应得码字。 r进制霍夫曼编码 由二进制霍夫曼编码可推广到r进制霍夫曼编码,只是每次求缩减信源时,改求r个最小概率之和,即将r个概率最小符号缩减为一个新符号,直到概率之和为1。但要注意,即缩减过程中可能到最后没有r个符号。为达次目的,可给信源添加几个概率为零的符号。 符号序列的霍夫曼编码 对信源编码除了对信源符号编码以外,也可对信源符号序列编码,一般来说,对序列编码比对单个符号更为有效。 2 数据结构与算法描述 1)变量及函数的定义 3 实验数据与实验结果(可用文字描述或贴图的方式进行说明) 1)测试数据 0.2 0.1 0.3 0.1 0.1 0.2 2)实验结果

信息论与编码实验报告.

本科生实验报告 实验课程信息论与编码 学院名称信息科学与技术学院 专业名称通信工程 学生姓名 学生学号 指导教师谢振东 实验地点6C601 实验成绩 二〇一五年十一月二〇一五年十一月

实验一:香农(Shannon )编码 一、实验目的 掌握通过计算机实现香农编码的方法。 二、实验要求 对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。 三、实验基本原理 给定某个信源符号的概率分布,通过以下的步骤进行香农编码 1、将信源消息符号按其出现的概率大小排列 )()()(21n x p x p x p ≥≥≥ 2、确定满足下列不等式的整数码长K i ; 1)(l o g )(l o g 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 位即为该消息符号的二进制码。 四、源程序: #include #include #include #include #include using namespace std; int main() { int N; cout<<"请输入信源符号个数:";cin>>N; cout<<"请输入各符号的概率:"<

int i,j; for(i=0;i

信息论与编码实验二

实验二 离散信道及其容量 一、实验目的 1、 理解离散信道容量的内涵; 2、 掌握求二元对称信道(BSC )互信息量和容量的设计方法; 3、 掌握二元扩展信道的设计方法并会求其平均互信息量。 二、实验原理 若某信道输入的是N 维序列x ,其概率分布为q(x),输出是N 维序列y,则平均互信息量记为I(X;Y),该信道的信道容量C 定义为() max (X;Y)q x C I =。 三、实验内容 1、给定BSC 信道,信源概率空间为 信道矩阵 0.990.010.010.99P ??=???? 求该信道的I(X;Y)和容量,画出I(X;Y)和ω、C 和p 的关系曲线。 2 、编写一M 脚本文件t03.m ,实现如下功能: 在任意输入一信道矩阵P 后,能够判断是否离散对称信道,若是,求出信道容量C 。 3、已知X=(0,1,2);Y=(0,1,2,3),信源概率空间和信道矩阵分别为 X P 0 1 0.6 0.4 = X Px 0 1 2 0.3 0.5 0.2 =

求: 平均互信息量; 4、 对题(1)求其二次扩展信道的平均互信息I(X;Y)。 四、程序设计与算法描述 1)设计思路 1、信道容量() max (X;Y)q x C I 因此要求给定信道的信道容量,只要知道该信道的最大互信息量,即求信道容量就是求信道互信息量的过程。 程序代码: clear all,clc; w=0.6; w1=1-w; p=0.01; X=[0 1]; P =[0.6 0.4]; p1=1-p; save data1 p p1; I_XY=(w*p1+w1*p)*log2(1/(w*p1+w1*p))+(w*p+w1*p1)*log2(1/(w*p+w1*p1))-(p*log2(1/p)+p 1*log2(1/p1)); C=1-(p*log2(1/p)+p1*log2(1/p1)); fprintf('互信息量:%6.3f\n 信道容量:%6.3f',I_XY,C); p=eps:0.001:1-eps; p1=1-p; C=1-(p.*log2(1./p)+p1.*log2(1./p1)); subplot(1,2,1),plot(p,C),xlabel('p'),ylabel('C'); load data1; w=eps:0.001:1-eps; w1=1-w; I_XY=(w.*p1+w1.*p).*log2(1./(w.*p1+w1.*p))+(w.*p+w1.*p1).*log2(1./(w.*p+w1.*p1))-(p .*log2(1./p)+p1.*log2(1./p1)); subplot(1,2,2),plot(w,I_XY) xlabel('w'),ylabel('I_XY'); 0.1 0.3 0 0.6 0.3 0.5 0.2 0 0.1 0.7 0.1 0.1 P=

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

实验报告 课程名称:信息论与编码姓名: 系: 专业: 年级: 学号: 指导教师: 职称: 年月日

目录 实验一信源熵值的计算 (1) 实验二 Huffman信源编码 (5) 实验三 Shannon编码 (9) 实验四信道容量的迭代算法 (12) 实验五率失真函数 (15) 实验六差错控制方法 (20) 实验七汉明编码 (22)

实验一 信源熵值的计算 一、 实验目的 1 进一步熟悉信源熵值的计算 2熟悉 Matlab 编程 二、实验原理 熵(平均自信息)的计算公式 ∑∑=--==q i i i q i i i p p p p x H 1 212log 1 log )( MATLAB 实现:))(log *.(2x x sum HX -=;或者))((log *)(2i x i x h h -= 流程:第一步:打开一个名为“nan311”的TXT 文档,读入一篇英文文章存入一个数组temp ,为了程序准确性将所读内容转存到另一个数组S ,计算该数组中每个字母与空格的出现次数(遇到小写字母都将其转化为大写字母进行计数),每出现一次该字符的计数器+1; 第二步:计算信源总大小计算出每个字母和空格出现的概率; 最后,通过统计数据和信息熵公式计算出所求信源熵值(本程序中单位为奈特nat )。 程序流程图: 三、实验内容 1、写出计算自信息量的Matlab 程序 2、已知:信源符号为英文字母(不区分大小写)和空格。

输入:一篇英文的信源文档。 输出:给出该信源文档的中各个字母与空格的概率分布,以及该信源的熵。 四、实验环境 Microsoft Windows 7 Matlab 6.5 五、编码程序 #include"stdio.h" #include #include #define N 1000 int main(void) { char s[N]; int i,n=0; float num[27]={0}; double result=0,p[27]={0}; FILE *f; char *temp=new char[485]; f=fopen("nan311.txt","r"); while (!feof(f)) { fread(temp,1, 486, f);} fclose(f); s[0]=*temp; for(i=0;i='a'&&s[i]<='z') num[s[i]-97]++; else if(s[i]>='A'&&s[i]<='Z') num[s[i]-65]++; } printf("文档中各个字母出现的频率:\n");

信息论与编码实验报告

实验一 绘制二进熵函数曲线(2个学时) 一、实验目的: 1. 掌握Excel 的数据填充、公式运算和图表制作 2. 掌握Matlab 绘图函数 3. 掌握、理解熵函数表达式及其性质 二、实验要求: 1. 提前预习实验,认真阅读实验原理以及相应的参考书。 2. 在实验报告中给出二进制熵函数曲线图 三、实验原理: 1. Excel 的图表功能 2. 信源熵的概念及性质 ()()[] ()[]())(1)(1 .log )( .) ( 1log 1log ) (log )()(10 , 110)(21Q H P H Q P H b n X H a p H p p p p x p x p X H p p p x x X P X i i i λλλλ-+≥-+≤=--+-=-=≤≤? ?????-===??????∑ 单位为 比特/符号 或 比特/符号序列。 当某一符号xi 的概率p(xi)为零时,p(xi)log p(xi) 在熵公式中无意义,为此规定这时的 p(xi)log p(xi) 也为零。当信源X 中只含有一个符号x 时,必有p(x)=1,此时信源熵H (X )为零。 四、实验内容: 用Excel 和Matlab 软件制作二进熵函数曲线。根据曲线说明信源熵的物理意义。 (一) Excel 具体步骤如下: 1、启动Excel 应用程序。 2、准备一组数据p 。在Excel 的一个工作表的A 列(或其它列)输入一组p ,取步长为0.01,从0至100产生101个p (利用Excel 填充功能)。

3、取定对数底c,在B列计算H(x) ,注意对p=0与p=1两处,在B列对应位置直接输入0。Excel中提供了三种对数函数LN(x),LOG10(x)和LOG(x,c),其中LN(x)是求自然对数,LOG10(x)是求以10为底的对数,LOG(x,c)表示求对数。选用c=2,则应用函数LOG(x,2)。 在单元格B2中输入公式:=-A2*LOG(A2,2)-(1-A2)*LOG(1-A2,2) 双击B2的填充柄,即可完成H(p)的计算。 4、使用Excel的图表向导,图表类型选“XY散点图”,子图表类型选“无数据点平滑散点图”,数据区域用计算出的H(p)数据所在列范围,即$B$1:$B$101。在“系列”中输入X值(即p值)范围,即$A$1:$A$101。在X轴输入标题概率,在Y轴输入标题信源熵。 (二)用matlab软件绘制二源信源熵函数曲线 p = 0.0001:0.0001:0.9999; h = -p.*log2(p)-(1-p).*log2(1-p); plot(p,h) 五、实验结果

信息论与编码试题集与答案(新)

一填空题(本题20分,每小题2分) 1、平均自信息为 表示信源的平均不确定度,也表示平均每个信源消息所提供的信息量。 平均互信息 表示从Y获得的关于每个X的平均信息量,也表示发X前后Y的平均不确定性减少的量,还表示通信前后整个系统不确定性减少的量。 2、最大离散熵定理为:离散无记忆信源,等概率分布时熵最大。 3、最大熵值为。 4、通信系统模型如下: 5、香农公式为为保证足够大的信道容量,可采用(1)用频带换信噪比;(2)用信噪比换频带。

6、只要,当N足够长时,一定存在一种无失真编码。 7、当R<C时,只要码长足够长,一定能找到一种编码方法和译码规则,使译码错误概率无穷小。 8、在认识论层次上研究信息的时候,必须同时考虑到形式、含义和效用三个方面的因素。 9、1948年,美国数学家香农发表了题为“通信的数学理论”的长篇论文,从而创立了信息论。 按照信息的性质,可以把信息分成语法信息、语义信息和语用信息。 按照信息的地位,可以把信息分成客观信息和主观信息。 人们研究信息论的目的是为了高效、可靠、安全地交换和利用各种各样的信息。 信息的可度量性是建立信息论的基础。 统计度量是信息度量最常用的方法。 熵是香农信息论最基本最重要的概念。 事物的不确定度是用时间统计发生概率的对数来描述的。 10、单符号离散信源一般用随机变量描述,而多符号离散信源一般用随机矢量描述。 11、一个随机事件发生某一结果后所带来的信息量称为自信息量,定义为其发生概率对

数的负值 。 12、自信息量的单位一般有 比特、奈特和哈特 。 13、必然事件的自信息是 0 。 14、不可能事件的自信息量是 ∞ 。 15、两个相互独立的随机变量的联合自信息量等于 两个自信息量之和 。 16、数据处理定理:当消息经过多级处理后,随着处理器数目的增多,输入消息与输出消息之间的平均互信息量 趋于变小 。 17、离散平稳无记忆信源X 的N 次扩展信源的熵等于离散信源X 的熵的 N 倍 。 18、离散平稳有记忆信源的极限熵,=∞H )/(lim 121-∞→N N N X X X X H 。 19、对于n 元m 阶马尔可夫信源,其状态空间共有 nm 个不同的状态。 20、一维连续随即变量X 在[a ,b]区间内均匀分布时,其信源熵为 log2(b-a ) 。 21、平均功率为P 的高斯分布的连续信源,其信源熵,Hc (X )=eP π2log 21 2。 22、对于限峰值功率的N 维连续信源,当概率密度 均匀分布 时连续信源熵具有最大值。 23、对于限平均功率的一维连续信源,当概率密度 高斯分布 时,信源熵有最大值。 24、对于均值为0,平均功率受限的连续信源,信源的冗余度决定于平均功率的限定值P 和信源的熵功率P 之比 。

信息论与编码实验报告

信息论与编码实验报告-标准化文件发布号:(9456-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

实验一关于硬币称重问题的探讨 一、问题描述: 假设有N 个硬币,这N 个硬币中或许存在一个特殊的硬币,这个硬币或轻 或重,而且在外观上和其他的硬币没什么区别。现在有一个标准天平,但是无刻度。现在要找出这个硬币,并且知道它到底是比真的硬币重还是轻,或者所有硬币都是真的。请问: 1)至少要称多少次才能达到目的; 2)如果N=12,是否能在3 次之内将特殊的硬币找到;如果可以,要怎么称? 二、问题分析: 对于这个命题,有几处需要注意的地方: 1)特殊的硬币可能存在,但也可能不存在,即使存在,其或轻或重未知; 2)在目的上,不光要找到这只硬币,还要确定它是重还是轻; 3)天平没有刻度,不能记录每次的读数,只能判断是左边重还是右边重,亦或者是两边平衡; 4)最多只能称3 次。 三、解决方案: 1.关于可行性的分析 在这里,我们把称量的过程看成一种信息的获取过程。对于N 个硬币,他们 可能的情况为2N+1 种,即重(N 种),轻(N 种)或者无假币(1 种)。由于 这2N+1 种情况是等概率的,这个事件的不确定度为: Y=Log(2N+1) 对于称量的过程,其实也是信息的获取过程,一是不确定度逐步消除的过程。 每一次称量只有3 种情况:左边重,右边重,平衡。这3 种情况也是等概率 的,所以他所提供的信息量为: y=Log3 在K 次测量中,要将事件的不确定度完全消除,所以 K= Log(2N+1)/ Log3 根据上式,当N=12 时,K= 2.92< 3 所以13 只硬币是可以在3 次称量中达到

信息论与编码实验1-3

实验一 关于信源熵的实验 班级:电子131501 姓名:赵英凯 学号:201315020137 时间:2016.5.22

一、实验目的 1. 掌握离散信源熵的原理和计算方法。 2. 熟悉matlab 软件的基本操作,练习使用matlab 求解信源的信息熵。 3. 自学图像熵的相关概念,并应用所学知识,使用matlab 求解图像熵。 二、实验原理 1. 离散信源相关的基本概念、原理和计算公式 产生离散信息的信源称为离散信源。离散信源只能产生有限种符号。随机事件的自信息量I(xi)为其对应的随机变量xi 出现概率对数的负值。 即: I (xi )= -log2p ( xi) 随机事件X 的平均不确定度(信源熵)H(X)为离散随机变量 xi 出现概率的数学期望,即: 2.二元信源的信息熵 设信源符号集X={0,1} ,每个符号发生的概率分别为p(0)= p,p(1)= q,p+ q =1,即信源的概率空间为:

则该二元信源的信源熵为: H( X) = - plogp–qlogq = - plogp –(1 - p)log(1- p) 即:H (p) = - plogp –(1 - p)log(1- p) 其中 0 ≤ p ≤1 3. MATLAB二维绘图 用matlab 中的命令plot( x , y) 就可以自动绘制出二维图来。例1-2,在matlab 上绘制余弦曲线图,y = cos x ,其中 0 ≤ x ≤2 >>x =0:0.1:2*pi; %生成横坐标向量,使其为 0,0.1,0.2,…, 6.2 >>y =cos(x ); %计算余弦向量 >>plot(x ,y ) %绘制图形 4. MATLAB求解离散信源熵 求解信息熵过程: 1) 输入一个离散信源,并检查该信源是否是完备集。 2) 去除信源中符号分布概率为零的元素。 3) 根据平均信息量公式,求出离散信源的熵。 5. 图像熵的相关知识 图像熵是一种特征的统计形式,它反映了图像中平均信息量的多少。

信息论与编码实验报告

信息论与编码基础实验报告
学院: 队别: 专业: 姓名: 学号:
电子科学与工程学院 二队 06 级 通信工程专业 曹务绅 200604015014
国防科学技术大学电子科学与工程学院
1

汉明码编译码
一、 实验目的
通过本次实验的练习, 进一步巩固了信道编码的基本原理, 掌握了Hamming 码编译码方法,提高了软硬件操作能力,培养了实验人员理论结合实践的能力。
二、 实验原理
(一)汉明码: 汉明码是在原编码的基础上附加一部分代码,使其满足纠错码的条件。它属 于线性分组码, 由于汉明码的抗干扰能力较强, 至今仍是应用比较广泛的一类码。 它具有以下特征: 码 长: n = 2m ? 1
信息位数: k = 2 m ? m ? 1 监督码位: r = n ? k = m 最小码距: d = 3 纠错能力: t = 1 (二)汉明码的编码: 在(n,k)汉明码中, (n-k)个附加的监督码元是由信息码元的线性运算产生 的。码长为 n,信息码元长度为 k,2k 个码组构成 n 维线性空间中的一个 k 维子 空间,编码的实质就是要在 n 维空间中,找出一组长为 n 的 k 个线性无关的矢 量 g0 g1 g k ?1 ,使得每个码组 c 都可以表示为 k 个矢量的线性组合,即 c0 ] = mk ?1 g 0 + mk ? 2 g1 + m0 g k ?1 其中, m i∈{0,1}, i=0,
c = [cn ?1 cn ? 2
1,……,k-1。将上式写成矩阵形式得
2

信息论与编码实验指导书

信息论与编码实验指导书 1 课程实验目的 本课程是一门实践性很强的专业课和核心课程,根据课程理论教学的需要安排了6学时的配套实验教学,主要内容涉及信息度量的计算方法、典型信源编码方法、典型信道容量计算方法和数据压缩方法四个实验,这四个实验的开设一方面有助于学生消化、巩固课程理论教学的知识,另一方面又可培养学生实践动手能力,同时为后续课程做好准备。 2 课程实验要求 课程实验准备要求 (1)课程实验主要为设计性实验,要求学生熟悉掌握在VC环境下编写和调试C++程序的方法。 (2)要求学生在实验前复习实验所用到的预备知识。可以查阅教材或者相关的参考资料,这需要学生有自主的学习意识和整理知识的能力。 (3)根据实验项目,设计相关的数据结构和算法,再转换为对应的书面程序,并进行静态检查,尽量减少语法错误和逻辑错误。上机前的充分准备能高效利用机时,在有限的时间内完成更多的实验内容。 课程实验过程要求 (1)生成源代码。将课前编写好的书面代码,利用VC自带的编辑器尽快输入为转换为源代码; (2)程序调试和软件测试。要求学生熟练掌握调试工具,调试正确后,认真整理源程序和注释,给出带有完整注释且格式良好的源程序清单和结果。 (3)完成实验报告。根据实验内容和完成情况,按照附件1给定的格式完成课程实验报告的编写。

课程实验报告要求 在每次课程实验后要及时进行总结和整理,并编写课程实验报告。报告格式按江西蓝天学院实验报告纸格式填写。 实验一二维随机变量信息熵的计算 [实验目的] 掌握二变量多种信息量的计算方法。 [实验学时] 2学时 [实验准备] 1.熟悉二变量多种信息量的计算方法,设计实验的数据结构和算法; 2.编写计算二维随机变量信息量的书面程序代码。 [实验内容及步骤] 离散二维随机变换熵的计算 说明: (1)利用random函数和归一化方法构造一个二维离散随机变量(X,Y); (2)分别计算X与Y的熵、联合熵、条件熵:H(X)、H(Y)、H(X,Y)H(X|Y)、I(X|Y); (3)对测试通过的程序进行规范和优化; (4)编写本次实验的实验报告。

信息论编码实验报告-费诺编码附源代码

中南大学 信息论与编码实验报告 选题:费诺编码 学生姓名: 学号: 专业班级:通信工程 指导老师: 学院:信息科学与工程学院 时间: 2015 目录 一、实验目的 二、实验原理 费诺编码思想

费诺编码流程图 三、实验内容 四、实验要求 五、代码调试结果 六、心得体会 七、程序源代码 一实验目的 1. 掌握费诺编码的原理和过程。 2. 熟悉 C/C++语言,练习使用C/C++实现香农码和Huffman 编码。 二、实验原理 费诺编码思想 设有离散无记忆信源 ∑==??????n i i n n x p x p x p x p x x x 1 21211)(,)(.....)()(..... 1.按信源符号的概率从大到小的顺序排队

不妨设 ) (......)()(21n x p x p x p ≥≥≥ 2.将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。 3.将每一大组的信源符号再分为两组,使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。 4.如此重复,直至每个组只剩下一个信源符号为止。 5.信源符号所对应的码字即为费诺码。 例:有一单符号离散无记忆信源 ??????=??????04.008.016.018.022.032.0)(654321 x x x x x x X P X 对该信源编二进制费诺码 )i /(35.2)(gn s bit X H = m L K R 2log = %92.97) (== R x H η ∑===61 ) /(4.2)(i i i k x p K 符号比特 费诺编码流程图

信息论与编码实验指导书

信息论与编码实验指导书

1 课程实验目的 本课程是一门实践性很强的专业课和核心课程,根据课程理论教学的需要安排了6学时的配套实验教学,主要内容涉及信息度量的计算方法、典型信源编码方法、典型信道容量计算方法和数据压缩方法四个实验,这四个实验的开设一方面有助于学生消化、巩固课程理论教学的知识,另一方面又可培养学生实践动手能力,同时为后续课程做好准备。 2 课程实验要求 2.1 课程实验准备要求 (1)课程实验主要为设计性实验,要求学生熟悉掌握在VC环境下编写和调试C++程序的方法。 (2)要求学生在实验前复习实验所用到的预备知识。可以查阅教材或者相关的参考资料,这需要学生有自主的学习意识和整理知识的能力。 (3)根据实验项目,设计相关的数据结构和算法,再转换为对应的书面程序,并进行静态检查,尽量减少语法错误和逻辑错误。上机前的充分准备能高效利用机时,在有限的时间内完成更多的实验内容。 2.2 课程实验过程要求 (1)生成源代码。将课前编写好的书面代码,利用VC自带的编辑器尽快输入为转换为源代码; (2)程序调试和软件测试。要求学生熟练掌握调试工具,调试正确后,认真整理源程序和注释,给出带有完整注释且格式良好的源程序清单和结果。 (3)完成实验报告。根据实验内容和完成情况,按照附件1给定的格式完成课程实验报告的编写。

2.3 课程实验报告要求 在每次课程实验后要及时进行总结和整理,并编写课程实验报告。报告格式按江西蓝天学院实验报告纸格式填写。

实验一二维随机变量信息熵的计算 [实验目的] 掌握二变量多种信息量的计算方法。 [实验学时] 2学时 [实验准备] 1.熟悉二变量多种信息量的计算方法,设计实验的数据结构和算法; 2.编写计算二维随机变量信息量的书面程序代码。 [实验内容及步骤] 离散二维随机变换熵的计算 说明: (1)利用random函数和归一化方法构造一个二维离散随机变量(X,Y); (2)分别计算X与Y的熵、联合熵、条件熵:H(X)、H(Y)、H(X,Y)H(X|Y)、I(X|Y); (3)对测试通过的程序进行规范和优化; (4)编写本次实验的实验报告。 附实验一主要内容及源程序 实验一离散二维随机变量信息熵的计算 1 实验内容 (1)利用random函数和归一化方法构造一个二维离散随机变量(X,Y); (2)分别计算X与Y的熵、联合熵、条件熵:H(X)、H(Y)、H(X,Y)H(X|Y)、I(X|Y); 2 数据结构与算法描述 (1)函数的定义:函数的数据成员 1.随机生成函数的代码: int k,n,t=0; double a[4][4],b=0,c=0; for(k=0;k<4;k++) { for(n=0;n<4;n++) { a[k][n]=rand()%100;

信息论与编码(第二版)曹雪虹(最全版本)答案

《信息论与编码(第二版)》曹雪虹答案 第二章 一个马尔可夫信源有3个符号{}1,23,u u u ,转移概率为:()11|1/2p u u =,()21|1/2p u u =, ()31|0p u u =,()12|1/3p u u =,()22|0p u u =,()32|2/3p u u =,()13|1/3p u u =,()23|2/3p u u =,()33|0p u u =,画出状态图并求出各符号稳态概率。 解:状态图如下 状态转移矩阵为: 1/21/2 01/302/31/32/30p ?? ?= ? ??? 设状态u 1,u 2,u 3稳定后的概率分别为W 1,W 2、W 3 由1231WP W W W W =??++=?得1231132 231231 112331223231W W W W W W W W W W W W ?++=???+=???=???++=? 计算可得1231025925625W W W ?=???= ?? ?=?? 由符号集{0,1}组成的二阶马尔可夫链,其转移概率为:(0|00)p =,(0|11)p =,(1|00)p =, (1|11)p =,(0|01)p =,(0|10)p =,(1|01)p =,(1|10)p =。画出状态图,并计算各状态的稳态概 率。 解:(0|00)(00|00)0.8p p == (0|01)(10|01)0.5p p == (0|11)(10|11)0.2p p == (0|10)(00|10)0.5p p == (1|00)(01|00)0.2p p == (1|01)(11|01)0.5p p == u 1 u 2 u 3 1/2 1/21/3 2/32/3 1/3

信息论与编码实验1

信息论与编码实验1 实验一关于信源熵的实验班级:电子131501 姓名:赵英凯学号:201315020137时间:一、实验目的 1. 掌握离散信源熵的原理和计算方法。 2. 熟悉matlab 软件的基本操作,练习使用matlab 求解信源的信息熵。 3. 自学图像熵的相关概念,并应用所学知识,使用matlab 求解图像熵。 二、实验原理 1. 离散信源相关的基本概念、原理和计算公式产生离散信息的信源称为离散信源。离散信源只能产生有限种符号。随机事件的自信息量I为其对应的随机变量xi 出现概率对数的负值。即:I = -log2p ( xi) 随机事件X 的平均不确定度H为离散随机变量xi 出现概率的数学期望,即:? 2.二元信源的信息熵

设信源符号集X={0,1} ,每个符号发生的概率分别为p(0)= p,p(1)= q,p+ q =1,即信源的概率空间为:?则该二元信源的信源熵为:H( X) = - plogp–qlogq = - plogp –(1 - p)log(1- p) 即:H (p) = - plogp –(1 - p)log(1- p)其中0 ≤ p ≤1 3. MATLAB 二维绘图用matlab 中的命令plot( x , y) 就可以自动绘制出二维图来。例1-2,在matlab 上绘制余弦曲线图,y = cos x ,其中0 ≤ x ≤ 2?。>>x =0::2*pi;%生成横坐标向量,使其为0,,,…,>>y =cos(x );%计算余弦向量>>plot(x ,y ) %绘制图形 4. MATLAB求解离散信源熵求解信息熵过程:1) 输入一个离散信源,并检查该信源是否是完备集。2) 去除信源中符号分布概率为零的元素。 3) 根据平均信息量公式,求出离散信源的熵。 5. 图像熵的相关知识图像熵是一种特征的统计形式,它反映

信息论与编码实验报告

信息论与编码实验报告 学院:计算机与通信工程学院 专业:计算机科学与技术 班级:计1203班 学号: 姓名: 2014年12月29日

实验一唯一可译码判别准则 实验目的: 1.进一步熟悉唯一可译码判别准则; 2.掌握C语言字符串处理程序的设计和调试技术。 实验内容: 1.已知:信源符号数和码字集合C; 2.输入:任意的一个码,码字的个数和每个具体的码字在运行时从键盘输入; 3.输出:判决(是唯一可译码/不是唯一可译码);循环(若继续判决则输入1循环判决,否则输入0结束运行)。 实验原理: 根据唯一可译码的判别方法,利用数据结构所学的知识,定义字符串数据类型并利用指针进行编程来实现算法。 算法:1、考察C 中所有的码字,若Wi是Wj的前缀,则将对应的后缀作为一个尾随后缀码放入集合Fi+1中; 2、考察C和Fi俩个集合,若Wi ∈C是Wj∈F的前缀或Wi ∈F是Wj∈C的前缀,则将相应的后缀作为尾随后缀码放入集合Fi+1中; 3、F=∪Fi即为码C的尾随后缀集合; 4、若F中出现了C中的元素,算法终止,返回假(C不是唯一可译码);否则若F中没有出现新的元素,则返回真。 实验环境及实验文件存档名: 1.实验环境:visual C++ 6.0 2.文件名:weiyikeyi.cpp 实验结果及分析: 1.源代码: #include #include char c[100][50]; char f[300][50]; int N,sum=0; //N为输入码字的个数,sum为尾随后缀集合中码字的个数 int flag;//判断是否唯一可译标志位 void patterson(char c[],char d[]) //检测尾随后缀 { int i,j,k; for(i=0;;i++) { if(c[i]=='\0'&&d[i]=='\0')//2字符串一样,跳出

信息论与编码实验报告

中南大学 信息论编码实验报告 题目信息论编码 学生姓名汤思远 指导教师张祖平 学院信息院 学号 090912052 专业班级电子1班 完成时间 14/12/5

实验一 关于信源熵的实验 一、实验目的 1. 掌握离散信源熵的原理和计算方法。 2. 熟悉matlab 软件的基本操作,练习使用matlab 求解信源的信息熵。 3. 自学图像熵的相关概念,并应用所学知识,使用matlab 或其他开发工具 求解图像熵。 4. 掌握Excel 的绘图功能,使用Excel 绘制散点图、直方图。 二、实验原理 1. 离散信源相关的基本概念、原理和计算公式 产生离散信息的信源称为离散信源。离散信源只能产生有限种符号。 随机事件的自信息量I (x i )为其对应的随机变量x i 出现概率对数的负值。即: I (x i )= -log 2 p (x i ) 随机事件X 的平均不确定度(信源熵)H (X )为离散随机变量x i 出现概率的数学期望,即: ∑∑-==i i i i i i x p x p x I x p X H )(log )()()()( 2. 信源的信息熵 设信源符号集X ={a1,a2,…,ar},每个符号发生的概率分别为p (a1)=p 1,p (a2)=p 2,…,p (ar),即信源的概率空间为 ,?? ????=??????)(...... )2(2 )1(1ar p ar a p a a p a P X 则该信源的信源熵为: H (X ) = - p (a1) log p (a1) –p (a2) log p (a2) –…–p (ar) log p (ar)

信息论与编码答案

《信息论与编码》-雪虹-课后习题答案 第二章 2.1一个马尔可夫信源有3个符号{}1,23,u u u ,转移概率为:()11|1/2p u u =, ()21|1/2p u u =,()31|0p u u =,()12|1/3p u u =,()22|0p u u =,()32|2/3p u u =, ()13|1/3p u u =,()23|2/3p u u =,()33|0p u u =,画出状态图并求出各符号稳态概率。 解:状态图如下 状态转移矩阵为: 1/21/2 01/302/31/32/30p ?? ?= ? ??? 设状态u 1,u 2,u 3稳定后的概率分别为W 1,W 2、W 3 由1231WP W W W W =??++=?得1231132231231 112331223231 W W W W W W W W W W W W ?++=???+=???=???++=?计算可得1231025925625W W W ?=??? =?? ?=?? 2.2 由符号集{0,1}组成的二阶马尔可夫链,其转移概率为:(0|00)p =0.8,(0|11)p =0.2, (1|00)p =0.2,(1|11)p =0.8,(0|01)p =0.5,(0|10)p =0.5,(1|01)p =0.5,(1|10)p =0.5。 画出状态图,并计算各状态的稳态概率。 解:(0|00)(00|00)0.8p p == (0|01)(10|01)0.5p p == (0|11)(10|11)0.2p p == (0|10)(00|10)0.5p p == (1|00)(01|00)0.2p p == (1|01)(11|01)0.5p p == (1|11)(11|11)0.8p p == (1|10)(01|10)0.5p p ==

信息论与编码实验报告

信息论与编码实验报告 实验一:英文文本信息量的计算一、实验目的及要求 a)实验目的1、通过本实验熟悉Mat lab软件编程环境2、编写M文件实现对英文文本信息量的统计,掌握信息量、信源爛的计算方法b)实验要求1、了解matlab 中M文件的xx、调试过程2、编写程序实现对给定英文文本信息量的统计3、英文文 本中字母不区分大小写,考虑空格的信息量,但不考虑标点符号的信息量4、建议英文文本采用txt格式 二、实验步骤及运行结果记录 a)实验步骤1、查找各个英文字母及空格出现的频率2、在Matlab中读取给定的英文文章3、计算英文文章的长度4、统计在该文章中各个字母及空格岀现的次数并放入数组N中5、计算各个字母和空格的信息量及整篇文章的信息量6、计算信源爛 b)实验结果 suml 二+003; H - 三、程序流程图四、程序清单,并注释每条语句五、实验小结通过本次实验熟悉了Mat lab软件编程环境和一些函数的功能及使用,掌握了信息量、信源爛的计算方法。 1附一:开始读取英文文章计算文章的长度嵌套的for循

环语句假判断是否符合循环条件真 if否elseif判断字是否为大写母输入相应的频率 否elseif 判断是否为小写字母计算各个字母、空格及整篇文章的 信息量是 判断是否为小写字母是 计算信源爛是 放入数组N中对应的位置放入数组N中对应的位置放入数组N中对应的位置 结束附二: wenzhang二textread(5实验一:english ' ,' ; M=size(wenzhang) ; row=M(l, 1) ; line=M(l, 2); N二zeros(1,27); for i=l:row for j=l:line %读取英文文章%文章的长度 if double(wenzhang(i, j))>96&&double(wenzhang(i, j))64&& double(wenzhang(i, j))<=90 N(l, double(wenzhang(i, j))-64)=N(l, double(wenzhang(i ,j))-64)+1; elseif double(wenzhang(i, j)) =32 N(l, 27)=N(1, 27)+1;

信息论与编码实验指导书

信息论与编码实验指导书 1课程实验目的 本课程是一门实践性很强的专业课和核心课程,根据课程理论教学的需要安排了6 学时的配套实验教学,主要内容涉及信息度量的计算方法、典型信源编码方法、典型信道容量计算方法和数据压缩方法四个实验,这四个实验的开设一方面有助于学生消化、巩固课程理论教学的知识,另一方面又可培养学生实践动手能力,同时为后续课程做好准备。 2课程实验要求 2.1课程实验准备要求 (1)课程实验主要为设计性实验,要求学生熟悉掌握在VC环境下编写和调试C++程序的方法。 ( 2)要求学生在实验前复习实验所用到的预备知识。可以查阅教材或者相关的参考资料,这需要学生有自主的学习意识和整理知识的能力。 ( 3)根据实验项目,设计相关的数据结构和算法,再转换为对应的书面程序,并进行静态检查,尽量减少语法错误和逻辑错误。上机前的充分准备能高效利用机时,在有限的时间内完成更多的实验内容。 2.2课程实验过程要求 ( 1 )生成源代码。将课前编写好的书面代码,利用VC 自带的编辑器尽快输入为转换为源代码; ( 2)程序调试和软件测试。要求学生熟练掌握调试工具,调试正确后,认真整理源程序和注释,给出带有完整注释且格式良好的源程序清单和结果。 ( 3)完成实验报告。根据实验内容和完成情况,按照附件1 给定的格式完成课程实验报告的编写。 2.3课程实验报告要求 在每次课程实验后要及时进行总结和整理,并编写课程实验报告。报告格式按江西蓝天

学院实验报告纸格式填写 实验一二维随机变量信息熵的计算 [ 实验目的] 掌握二变量多种信息量的计算方法。 [ 实验学时] 2 学时 [ 实验准备] 1.熟悉二变量多种信息量的计算方法,设计实验的数据结构和算法;2.编写计算二维随机变量信息量的书面程序代码。 [ 实验内容及步骤] 离散二维随机变换熵的计算说明: (1)利用random 函数和归一化方法构造一个二维离散随机变量( X ,Y ); (2)分别计算X与丫的熵、联合熵、条件熵:H (X )、H (丫)、H (X,Y ) H (X|Y )、 I(X|Y); (3)对测试通过的程序进行规范和优化; ( 4 )编写本次实验的实验报告。 附实验一主要内容及源程序 实验一离散二维随机变量信息熵的计算 1实验内容 (1)利用random 函数和归一化方法构造一个二维离散随机变量( X ,丫); (2 )分别计算X与丫的熵、联合熵、条件熵:H (X )、H (丫)、H (X,Y ) H (X|Y )、I (X|Y ); 2数据结构与算法描述 ( 1)函数的定义:函数的数据成员 1.随机生成函数的代码: int k,n,t=0; double a[4][4],b=0,c=0; for (k=0;k<4;k++) for (n=0;n<4;n++) { a[k][n]=rand()%100;

相关文档
最新文档