信息论课程设计

信息论课程设计
信息论课程设计

电子科技大学电子工程学院信息论课程设计报告课程名称:信息编码与加密

课程设计报告

学生姓名:农瀚学号:2014020908021 指导教师:李万春

一、课程设计名称:编程实现霍夫曼、费诺、香农编码

二、课设原理:

1)霍夫曼编码:霍夫曼编码的平均码长最短,是最佳编码。编码步骤如下:

(1)将信源符号按概率大小排序;

(2)对概率最小的两个符号求其概率之和,同时给两幅

号分别赋予码元0和1;

(3)将概率之和当做一个新符号的概率。与剩下的概率一起,形成一个缩减信源,再重复上述步骤,直到概率和为1为止;(4)按上述步骤实际上构成了一个码树,从根到端点经过的树枝即为码字。

2)费诺编码:

编码步骤如下:

(1)将信源概率从大到小排序;

(2)将信源符号分成两组,使两组信源符号的概率之和近似相等,并给两组信源符号分别赋0和1;

(3)再把各个小组的信源符号细分为两组并赋码元,方法与第一次分组相同;

(4)如此一直下去,直到每一个小组只含一个信源符号为止;(5)由此可构造成一个码树,所有终端节点上的码字组成费诺码。

3)香农编码:

编码方法如下:

⑴将信源消息符号按其出现的概率大小依次排列

p(u1)≥p(u2)≥…≥p(un)

⑵确定码长Ki (整数) :

Ki= []——取整

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

⑷将累加概率Pi变换成二进制数。

⑸取pi二进制数的小数点后Ki位即为该消息符号的二进制数。

三、课设目的:通过编程实现三种方式的编码,掌握三种编

码方式的步骤。

四、课设内容:

三种编码方式的编程思路:

1、霍夫曼编码:(1)对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F= {T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。(为方便在计算机上实现算法,一般还要求以Ti的权值Wi的升序排列。)(2)在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之

和。

(3)从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。

(4)重复二和三两步,直到集合F中只有一棵二叉树为止。

2、费诺编码的编程思路:(1)先使用冒泡法对信源概率概率排序;(2)依次将按排好序的符号概率进行近似1:1分成两大组;

(3)对各组赋予一个二进制码元“0”和“1”;

(4)输出符号,符号概率及编码。

3、香农编码:

(1)对于一个给定的符号列表,制定了概率相应的列表或频率计数,使每个符号的相对发生频率是已知。

(2)排序根据频率的符号列表,最常出现的符号在左边,最少出现的符号在右边。

(3)清单分为两部分,使左边部分的总频率和尽可能接近右边部分的总频率和。

(4)该列表的左半边分配二进制数字0,右半边是分配的数字1。这意味着,在第一半符号代都是将所有从0开始,第二半的代码都从1开始。

(5)对左、右半部分递归应用步骤3和4,细分群体,并添加位的代码,直到每个符号已成为一个相应的代码树的叶。

五、器材(设备、元器件):

计算机、visual studio2017社区版

六、设计代码:见附录

九、实验数据及结果

根据上述实验程序得到的实验数据及结果如下:霍夫曼编码:

费诺编码:

香农编码:

十、结论

完成了20个非等概随机信源的霍夫曼、费诺和香农编码,并给出了编码效率和码字。

十一、总结及心得体会

通过这次课程设计,我掌握了三种编码方式的步骤,并能够利用编程实现编码,提高了自己的编程水平和对该知识点的掌握程度。

附录代码:

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

//

/*******霍夫曼编码*************/

#include"stdafx.h"

#include

#include

#include

#include

#include

#include

using namespace std;

#define SourNum 20

#define MAXBIT 100

#define MaxValue 10000

#define MAXLEAF 30

#define MAXNODE MAXLEAF*2 -1

double Sp[SourNum];

char coder[100][100];

int bitlong[100];

void ProSource()//产生非等概信源的函数

{

int n = 0;

srand((unsigned)time(0));

double sum = 0;

while (1)

{

Sp[n] = (double)rand() / (RAND_MAX);//产生随机浮点数

sum = sum + Sp[n];

if (sum < 1 && Sp[n] <0.086)

{

n++;

if (n >19)

break;

else continue;

}

else

{

sum = sum - Sp[n];

Sp[n] = 0;

continue;

}

}

Sp[SourNum] = 1 - sum;

}

/*******霍夫曼编码*************/

typedef struct

{

int bit[MAXBIT];

int start;

} HCode;

typedef struct

{

double weight;

double parent;

double lchild;

double rchild;

int last;

} HNodeType;

void HuffmanTree(HNodeType HuffNode[MAXNODE], int n)

{

int i, j, x1, x2;;

double m1, m2;

for (i = 0; i < 2 * n - 1; i++)

{

HuffNode[i].weight = 0;

HuffNode[i].parent = -1;

HuffNode[i].lchild = -1;

HuffNode[i].rchild = -1;

}

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

{

HuffNode[i].weight = Sp[i];

}

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

{

m1 = m2 = MaxValue;

x1 = x2 = 0;

for (j = 0; j < n + i; j++)

{

if (HuffNode[j].weight < m1 && HuffNode[j].parent == -1)

{

m2 = m1;

x2 = x1;

m1 = HuffNode[j].weight;

x1 = j;

}

else if (HuffNode[j].weight < m2 && HuffNode[j].parent == -1)

{

m2 = HuffNode[j].weight;

x2 = j;

}

}

HuffNode[x1].parent = n + i;

HuffNode[x2].parent = n + i;

HuffNode[n + i].weight = HuffNode[x1].weight + HuffNode[x2].weight;

HuffNode[n + i].lchild = x1;

HuffNode[n + i].rchild = x2;

}

}

double CodEffi()//求编码效率

{

int AveraLong = 0, SumLong = 0;

double H = 0, CE = 0;

for (int i = 0; i < SourNum; i++)

{

SumLong = SumLong + bitlong[i];

}

AveraLong = SumLong / SourNum;

for (int j = 0; j < SourNum; j++)

{

H = (-Sp[j])*(log(Sp[j]) / log(2)) + H;

}

CE = H / AveraLong;

return CE;

}

int main()

{

ProSource();

sort(Sp, Sp + SourNum);

HNodeType HuffNode[MAXNODE];

HCode HuffCode[MAXLEAF], cd;

int i, j, c, p, n;

n = SourNum;

HuffmanTree(HuffNode, SourNum + 1);

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

{

cd.start = n - 1;

c = i;

p = HuffNode[c].parent;

while (p != -1)

{

if (HuffNode[p].lchild == c)

cd.bit[cd.start] = 0;

else

cd.bit[cd.start] = 1;

cd.start--;

c = p;

p = HuffNode[c].parent;

}

for (j = cd.start + 1; j

{

HuffCode[i].bit[j] = cd.bit[j];

}

HuffCode[i].start = cd.start;

}

memset(coder, '\0', sizeof(coder));

int temp=0;

for (i = 0; i

{

cout <<"信源 "<< i <<"编码为:";

for (j = HuffCode[i].start + 1; j < n; j++)

{

cout << HuffCode[i].bit[j];

coder[i][temp]= char(HuffCode[i].bit[j]+48);

temp++;

}

temp = 0;

cout <<" 信源概率:"<< Sp[i];

cout <<" 字长:"<< strlen(coder[i]);

printf("\n");

bitlong[i] = strlen(coder[i]);

}

CodEffi();

cout <<"\n编码效率: "<< CodEffi() * 100 <<"%\n";

return 0;

}

// 费诺编码.cpp : 定义控制台应用程序的入口点。

//

#include"stdafx.h"

#include

#include

#include

#include

#include

#include

#include

#define Bmax 10 #define Smax 20

using namespace std;

#define SourNum 20

double Sp[SourNum];

int bitlong[100];

void group1(int low, int mid, int high);

void code(int low, int mid, int high);

void ProSource()//产生非等概信源的函数

{

int n = 0;

srand((unsigned)time(0));

double sum = 0;

while (1)

{

Sp[n] = (double)rand() / (RAND_MAX);//产生随机浮点数

sum = sum + Sp[n];

if (sum < 1 && Sp[n] <0.086) //

{

n++;

if (n >19)

break;

else continue;

}

else

{

sum = sum - Sp[n];

Sp[n] = 0;

continue;

}

}

Sp[SourNum] = 1 - sum;

}

struct Bit

{

char b[Bmax]; //定义码长度数组的数据类型字符型组成成员int last;

};

typedef struct symbol

{

int c;

double probability;

struct Bit bit;

}sbl;

sbl s[Smax];

/********输入符号的符号概率********/

void input(int n)

{

int i;

int c;

for (i = 0; i

{

s[i].c = i;

s[i].probability = Sp[i];

}

}

/***********用冒泡法排序**********/

void code(int low, int mid, int high)

{

int i;

for (i = low; i

{

if (i

{

s[i].bit.b[s[i]https://www.360docs.net/doc/4e7046151.html,st] = '0';

s[i]https://www.360docs.net/doc/4e7046151.html,st++;

}

else

{

s[i].bit.b[s[i]https://www.360docs.net/doc/4e7046151.html,st] = '1';

s[i]https://www.360docs.net/doc/4e7046151.html,st++;

}

}

}

void sort(int n)

{

double t;

char a;

int i, j;

for (i = 1; i

for (j = 0; j

if (s[j].probability

{

t = s[j].probability;

a = s[j].c;

s[j].probability = s[j + 1].probability;

s[j].c = s[j + 1].c;

s[j + 1].probability = t;

s[j + 1].c = a;

}

}

/************分组函数************/

void group(int n)

{

int i, pmid, plow, phigh;

pmid = phigh = n;

plow = 0;

for (i = 0; i

group1(plow, pmid, phigh);

}

void group1(int low, int mid, int high)

{

double d, dmin;

d = 0;

int i;

if (high == low + 1)

return;

for (i = low; i

d += s[i].probability;

dmin = d - 2 * s[low].probability;

for (i = low + 1; i

{

d = fabs(dmin - 2 * s[i].probability);

if (d

dmin = d;

else

break;

}

mid = i;

code(low, mid, high);

group1(low, mid, mid);

group1(mid, high, high);

}

void output(int n)

{

int i, j;

printf("费诺编码输出信源,概率及编码:\n\n");

for (i = 0; i

{

cout<<"信源:"<

for (j = 0; j

cout<< s[i].bit.b[j];

bitlong[i] = s[i]https://www.360docs.net/doc/4e7046151.html,st;

cout <<" "<<"字长"<< bitlong[i];

printf("\n");

}

}

double CodEffi( )

{

int AveraLong =0,SumLong=0;

double H=0,CE=0;

for (int i = 0; i < SourNum; i++)

{

SumLong = SumLong + bitlong[i];

}

AveraLong = SumLong / SourNum;

for (int j=0; j < SourNum; j++)

{

H = (-Sp[j])*(log(Sp[j]) / log(2)) + H;

}

CE = H / AveraLong;

return CE;

}

void main() //主函数

{

int n = SourNum; //定义变量

ProSource();

input(n); //分别调用输入、排序、分组、输出函数,并执行

sort(n);

group(n);

output(n);

cout <<"\n编码效率: "<< CodEffi() * 100 <<"%\n";

}

// 香农编码.cpp : 定义控制台应用程序的入口点。

//

#include"stdafx.h"

#include

#include

#include

#include

#include

#include

#include

#include

#define Bmax 10 //最长码长度#define Smax 20

using namespace std;

#define SourNum 20

double Sp[SourNum];

int bitlong[100];

struct shan

{

int s;

double p;

double padd;

double l_f;

int l;

char w[20];

};

shan SourData[SourNum];

void group1(int low, int mid, int high);

void code(int low, int mid, int high);

void ProSource()//产生非等概信源的函数

{

int n = 0;

srand((unsigned)time(0));

double sum = 0;

while (1)

{

Sp[n] = (double)rand() / (RAND_MAX);//产生随机浮点数

sum = sum + Sp[n];

if (sum < 1 && Sp[n] <0.086) //

{

n++;

if (n >19)

break;

else continue;

}

else

{

sum = sum - Sp[n];

Sp[n] = 0;

continue;

}

}

Sp[SourNum] = 1 - sum;

}

int i, j, n, k, b;

double addp;

char bitw[20];

void sequ(struct shan x[], int n)

{

struct shan temp;

for (i = 0; i

for (j = i; j

{

if (x[i].p

{

temp =x[j];

x[j] =x[i];

x[i] = temp;

}

}

}

void countpadd(struct shan x[], int n) {

addp = 0;

x[0].padd = 0;

for (i = 0; i

{

addp += x[i].p;

x[i + 1].padd = addp;

}

void count_l(struct shan x[], int n)

{

for (i = 0; i

{

x[i].l_f = -log(x[i].p) / log(2);

if ((x[i].l_f - (int)x[i].l_f)>0)

x[i].l = (int)x[i].l_f + 1;

else x[i].l = (int)x[i].l_f;

}

}

void covbit(double a, int lc)

{

for (j = 0; j

{

b = (int)(a * 2);

bitw[j] = b + 48;

a = 2 * a - int(a * 2);

}

}

double CodEffi()

{

int AveraLong = 0, SumLong = 0;

double H = 0, CE = 0;

for (int i = 0; i < SourNum; i++)

{

SumLong = SumLong + bitlong[i];

}

AveraLong = SumLong / SourNum;

for (int j = 0; j < SourNum; j++)

{

H = (-Sp[j])*(log(Sp[j]) / log(2)) + H;

}

CE = H / AveraLong;

return CE;

}

int main()

{

n = SourNum;

ProSource();

for (i = 0; i

{

SourData[i].s= i;

/*获取信源概率*/

for (i = 0; i

{

SourData[i].p=Sp[i];

}

sequ(SourData, n);

countpadd(SourData, n);

count_l(SourData, n);

for (i = 0; i

{

covbit(SourData[i].padd, SourData[i].l);

strcpy(SourData[i].w, bitw);

}

/*输出数据*/

cout.fill(' ');

for (i = 0; i

cout << left << setw(6) <<"信源符号: "<< SourData[i].s<<" 信源概率:

"<

for (i = 0; i < SourNum; i++)

{

bitlong[i] = SourData[i].l;

}

cout <<"\n编码效率: "<< CodEffi() * 100 <<"%\n";

return 0;

}

信息论与编码课程设计报告

目录 一:实验原理----------------------------1 二:程序源代码--------------------------1 三:实验分析-----------------------------6 四:实验结论---------------------------7

赫夫曼编码 一:实验原理 哈夫曼编码的具体步骤归纳如下: ① 概率统计(如对一幅图像,或m幅同种类型图像作灰度信号统计),得到n个不同概率的信息符号。 ② 将n个信源信息符号的n个概率,按概率大小排序。 ③ 将n个概率中,最后两个小概率相加,这时概率个数减为n-1个。 ④ 将n-1个概率,按大小重新排序。 ⑤ 重复③,将新排序后的最后两个小概率再相加,相加和与其余概率再排序。 ⑥ 如此反复重复n-2次,得到只剩两个概率序列。 ⑦ 以二进制码元赋值,构成哈夫曼码字。编码结束。 哈夫曼码字长度和信息符号出现概率大小次序正好相反,即大 概信息符号分配码字长度短,小概率信息符号分配码字长度长。 C、哈夫曼编码的特点 (1)哈夫曼编码的构造顺序明确,但码不是唯一的(因以大赋1还是小的赋1而异;

(2)哈夫曼编码的字长参差不齐,硬件实现不方便; (3)只有在概率分布很不均匀时,哈夫曼编码才有显著的效果,而在信源分布均匀时,一般不使用哈夫曼编码。 二:程序源代码: #define MAXVALUE 10000 #define MAXLEAF 30 #define MAXNODE 59 #define MAXBIT 10 #define LENTH 30 #include "" #include typedef struct{ float gailv; int flag; int parent; int lchild; int rchild; char ch; int t; }HNodeType; typedef struct{ int bit[MAXBIT]; int start; }HCodeType; typedef struct{ float gailv; char letter; }mytype; /*it's the type of data save in file*/ typedef struct filehuff{ int count; mytype mydata[MAXLEAF]; filehuff(){count=0; }; }; filehuff filedata; char code[MAXVALUE]; HNodeType HuffNode[MAXNODE]; void savetofile() { FILE *fp;

信息论与编码课程设计..

吉林建筑大学 电气与电子信息工程学院信息理论与编码课程设计报告 设计题目:哈夫曼编码的分析与实现专业班级:电子信息工程101 学生姓名: 学号: 指导教师:吕卅王超 设计时间:2013.11.18-2013.11.29

一、设计的作用、目的 《信息论与编码》是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。 通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法 二、设计任务及要求 通过课程设计各环节的实践,应使学生达到如下要求: 1. 理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法; 2. 掌握哈夫曼编码/费诺编码方法的基本步骤及优缺点; 3. 深刻理解信道编码的基本思想与目的,理解线性分组码的基本原理与编码过程; 4. 能够使用MATLAB 或其他语言进行编程,编写的函数要有通用性。 三、设计内容 一个有8个符号的信源X ,各个符号出现的概率为: 编码方法:先将信源符号按其出现的概率大小依次排列,并取概率最小的字母分别配以0和1两个码元(先0后1或者先1后0,以后赋值固定),再将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队。并不断重复这一过程,直到最后两个符号配以0和1为止。最后从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即为对应的码字。 哈夫曼编码方式得到的码并非唯一的。在对信源缩减时,两个概率最小的符号合并后的概率与其他信源符号的概率相同时,这两者在缩减中的排序将会导致不同码字,但不同的排序将会影响码字的长度,一般讲合并的概率放在上面, 12345678,,,,, ()0.40.180.10.10.070.060.050.04X x x x x x x x x P X ????=????????

信息论与编码实验报告.

本科生实验报告 实验课程信息论与编码 学院名称信息科学与技术学院 专业名称通信工程 学生姓名 学生学号 指导教师谢振东 实验地点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

课程设计报告

课程设计报告 题 目 基于数据挖掘的航电系统故障诊断 专业名称 电子信息工程 学生姓名 王腾飞 指导教师 陈 杰 完成时间 2014年3月18日

摘要 航电系统是飞机的重要组成部分,由于其综合应用了电子、机械、计算机及自动检测等许多学科的先进技术,结构层次很多,所以对其实施故障诊断具有涉及专业领域多、诊断难度大、要求时间短等特点。这对快速处理故障数据提出了很大的挑战。 从独立的联合式航电机箱的按键通电测试,到集中式飞机管理系统数据收集,飞机维修系统经过漫长的发展已演变成故障诊断工具。 现代飞机均采用了中央维修系统,用以收集所有子系统的故障报告、判断故障根源并推荐修理方法。飞机的故障信息和历史数据存放在数据库中。如果用传统的数据分析方法对这些海量的数据进行分析时会显得力不从心,不仅浪费时间而且对于隐含的知识难以有效的进行挖掘。数据挖掘技术十分符合现实的需要,它可以客观地挖掘出历史数据库中潜在的故障规则,这些规则能更好地指导故障的定位与检修,并对潜在的故障做出预测。随着数据的不断增长,如何能自动获取知识已经成为故障诊断技术发展的主要制约条件,而数据挖掘技术为解决这个“瓶颈”问题提供了一条有效的途径。 本文详细介绍了故障诊断技术与数据挖掘技术,并总结了航电系统的故障诊断的特点。拟采用聚类分析的技术对故障数据快速处理,实现对故障的快速定位。 关键词:故障诊断数据挖掘聚类分析航电系统

故障诊断技术 故障诊断技术简介 故障诊断就是指当设备系统不能完成正常的功能时,利用一定的方法找出使该功能丧失的原因及发生故障的部位,实现对故障发展趋势的预测的过程。故障诊断涉及到多方面的技术背景,主要以系统论、信息论、控制论、非线性科学等最新技术理论为基础,它是一门综合性的学科,具有重要的实用价值。 设备系统故障及故障诊断 随着现代化工业的发展,设备系统能够以最佳状态可靠地运行,对于保证产品质量、提高企业的产能、保障生命财产安全都具有极其重要的意义。设备系统的故障是指设备系统在规定时间内、规定条件下丧失规定功能的状况。故障诊断的作用则是发现并确定发生故障的部位及性质,找出故障的起因,预测故障的发展趋势并提出应对措施。故障诊断技术的使用范围不应只局限于设备系统使用和维修过程中,在设备系统的设计制造过程中也可以使用故障诊断技术,为以后的故障监测和设备系统维护创造条件。因此,故障诊断技术应该贯穿于设备系统的设计、制造、运行和维护的全过程当中。 机载设备的故障诊断流程框图:

哈夫曼编码信息论课程设计

信 息 论 课 程 设 计 实 验 报 告 专业班级:信计0802 姓名:刘建勋 学号:07 目录:

1.课题描述-----------------------------------------------------------------------------------------3 2.信源编码的相关介绍---------------------------------------------------------------------3 3.哈夫曼编码-------------------------------------------------------------------------------------3 哈夫曼编码算法-----------------------------------------------------------------------3 哈弗曼编码的特点--------------------------------------------------------------------4 哈夫曼实验原理----------------------------------------------------------------------- 4 4.哈夫曼编码的C++实现-----------------------------------------------------------------5 程序设计-----------------------------------------------------------------------------------5 运行结果-----------------------------------------------------------------------------------8 总结-----------------------------------------------------------------------------------------------------8 参考文献-------------------------------------------------------------------------------------------------8

信息论与编码课程设计报告书

信息论与编码课程设计报告设计题目:判断唯一可译码、香农编码 专业班级电信12-03 学号7 学生琳 指导教师成凌飞 教师评分 2015年3月21日

目录 一、设计任务与要求 (2) 二、设计思路 (2) 三、设计流程图 (3) 四、程序运行及结果 (4) 五、心得体会 (6) 参考文献 (7) 附录:源程序 (8)

一、设计任务与要求 通过本次课程设计的练习,使学生进一步巩固信源熵、信源编码的基本原理,掌握具体的编码方法,熟悉编程软件的使用,培养学生自主设计、编程调试的开发能力,同时提高学生的实践创新能力。 1、判断唯一可译码 利用尾随后缀法判断任意输入的码是否为唯一可译码,即设计一个程序实现判断输入码组是否为唯一可译码这一功能。 2、香农编码 熟悉运用香农编码,并能通过C语言进行编程,对任意输入消息概率,利用香农编码方法进行编码,并计算信源熵和编码效率。 二、设计思路 1、判断唯一可译码 在我们学习使用了克劳夫特不等式之后,知道唯一可译码必须满足克劳夫特不等式。但是克劳夫特不等式仅仅是存在性的判定定理,即该定理不能作为判断一种码是否为唯一可译码的依据。也就是说当码字长度和码符号数满足克劳夫特不等式时,则必可以构造出唯一可译码,否则不能构造出唯一可译码。因此我们必须找到一种能够判断一种码是否为唯一可译码的方法,尾随后缀法。 尾随后缀法算法描述: 设C为码字集合,按以下步骤构造此码的尾随后缀集合F: (1) 考查C中所有的码字,若Wi是Wj的前缀,则将相应的后缀作为一个尾随后缀放入集合F0中; (2) 考查C和Fi两个集合,若Wj∈C是Wi∈Fi的前缀或Wi∈Fi 是Wj

信息论与编码大作业

广西科技大学 大作业 课程名称:信息论与编码 题目:信道编码对通信系统性能的影响学院:电气与信息工程学院 专业:电子信息工程 班级: 学号: 成绩: 姓名: 电话号码:

信道编码对通信系统性能的影响 [摘要] 简述信道编码理论,详细说明分组码的编译原理、实现方法及检错纠错能力,用MATLAB仿真有无信道编码条件下对通信系统性能的影响及信道编码在不同信道下对通信系统性能的影响,如AWGN信道和深衰落信道。 [关键词] 信道编码、分组码、MATLAB仿真、性能 一、引言 提高信息传输的有效性和可靠性始终是通信技术所追求的目标,而信道编码能够显著的提升信息传输的可靠性。1948年,信息论的奠基人C.E.Shannon在他的开创性论文“通信的数学理论”中,提出了著名的有噪信道编码定理.他指出:对任何信道,只要信息传输速率R不大于信道容量C, 就一定存在这样的编码方法:在采用最大似然译码时,其误码率可以任意小.该定理在理论上给出了对给定信道通过编码所能达到的编码增益的上限,并指出了为达到理论极限应采用的译码方法.在信道编码定理中,香农提出了实现最佳编码的三个基本条件:(1 )采用随机编译码方式;(2 )编码长度L→∞ , 即分组的码组长度无限;(3)译码采用最佳的最大似然译码算法。 二、信道编码理论 1、信道编码的概念与目的 进行信道编码是为了提高信号传输的可靠性,改善通信系统的传输质量,研究信道编码的目标是寻找具体构造编码的理论与方法。从原理上,构造信道码的基本思路是根据一定的规律在待发送的信息码元中人为的加入一定的多余码元,以引入最小的多余度为代价来换取最好的抗干扰性能。信道编码是通过信道编码器和译码器实现的用于提高信道可靠性的理论和方法,是信息论的内容之一。信道编码大致分为两类:①信道编码定理,从理论上解决理想编码器、译码器的存在性问题,也就是解决信道能传送的最大信息率的可能性和超过这个最大值时的传输问题。②构造性的编码方法以及这些方法能达到的性能界限。编码定理的证明,从离散信道发展到连续信道,从无记忆信道到有记忆信道,从单用户信道到多用户信道,从证明差错概率可接近于零到以指数规律逼近于零,正在不断完善。编码方法,在离散信道中一般用代数码形式,其类型有较大发展,各种界限也不断有人提出,但尚未达到编码定理所启示的限度。在连续信道中常采用正交函数系来代表消息,这在极限情况下可达到编码定理的限度,不是所有信道的编码定理都已被证明。 2、信道编码的分类

信息论课程设计报告

成绩: 2016-2017学年第1学期 《信息论》课程设计 学院名称: 班级学号: 学生姓名: 教师姓名: 2016年12月 一、判定唯一可译码 1. 任务说明

输入:任意的一个码(即已知码字个数及每个具体的码字) 输出:判决结果(是/不是) 输入文件:in1.txt ,含至少2组码,每组的结尾为”$”符 输出文件:out1.txt ,对每组码的判断结果 说明:为了简化设计,可以假定码字为0,1串 2. 实现原理 判断方法:将码C 中所有码字可能的尾随后缀组成一个集合F ,当且仅当集合F 中没有 包含任一码字,则可判断此码C 为唯一可译变长码。 构成集合F :首先观察码C 中最短的码字是否是其他码字的前缀。若是,将其所有可能 的尾随后缀排列出。就是将其他码字序列中截去与其最短码字相同的前缀 部分,将余下的序列为尾随后缀。而这些尾随后缀又可能是某些码字的前 缀,或者最短码字又仍是这些尾随后缀的前缀,再将由这些尾随后缀产生 的新的尾随后缀列出。然后再观察这些新的尾随后缀是否是某些码字的前 缀,或观察有否其他码字是这些新的尾随后缀的前缀,再将产生的尾随后 缀列出,依次下去,直至没有一个尾随后缀是码字的前缀或没有新的尾随 后缀产生为止。这样,首先获得的是由最短码字能引起的所有尾随后缀。 接着,按照上述步骤将次短的码字、......所有码字可能产生的尾随后缀前部 列出。由此得到由码C 的所有可能的尾随后缀组成的集合F 。 参考算法伪代码: For all ,i j W W C ∈ do if i W 是j W 的前缀 then 将相应的后缀作为一个尾随后缀放入集合0F 中 End if End for Loop For all i W C ∈ do For all j n W F ∈ do if i W 是j W 的前缀 then 将相应的后缀作为一个尾随后缀放入集合1n F +中 Else if j W 是i W 的前缀 then 将相应的后缀作为一个尾随后缀放入集合1n F +中 End if End for End for i i F F ← If ,i i W F W C ?∈∈ then Return false Else if F 中未出现新的元素 then Return true End if //能走到这里,说明F 中有新的元素出现,需继续 End loop

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

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

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

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

五、编码程序 #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"); for(i=0;i<26;i++) { p[i]=num[i]/strlen(s); printf("%3c:%f\t",i+65,p[i]); n++; if(n==3) { printf("\n"); n=0; } } p[26]=num[26]/strlen(s); printf(" 空格:%f\t",p[26]);

信息论与编码课程设计报告,统计信源熵与香农编码

信息论与编码课程设计报告设计题目:统计信源熵与香农编码 专业班级电信 12-06 学号 学生姓名 指导教师 教师评分 2015年 3 月 30日

目录 一、设计任务与要求 (2) 二、设计思路 (2) 三、设计流程图 (3) 四、程序运行及结果 (4) 五、心得体会 (6) 参考文献 (7) 附录:源程序 (8)

一、设计任务与要求 1.统计信源熵 要求:统计任意文本文件中各字符(不区分大小写)数量,计算字符概率,并计算信源熵。 2.香农编码 要求:任意输入消息概率,利用香农编码方法进行编码,并计算信源熵和编码效率。 二、设计思路 本次课程设计中主要运用C 语言编程以实现任务要求,分析所需要的统计量以及相关变量,依据具体公式和计算步骤编写语句,组成完整C 程序。 1、信源熵 定义:信源各个离散消息的自信息量的数学期望为信源的平均信息量,一般称为信源的信息熵,也叫信源熵或香农熵,有时称为无条件熵或熵函数,简称熵,记为H ()。 计算公式: ) (log )(-)x (i i i x p x p H ∑= 2、香农编码过程: (1)将信源消息符号按其出现的概率大小依次排列为 n p p ≥???≥≥21p (2)确定满足下列不等式的整数码长i K 为 1)()(+-<≤-i i i p lb K p lb (3)为了编成唯一可译码,计算第i 个消息的累加概率 ∑-==11) (i k k i a p P (4)将累计概率 i P 变换成二进制数。 (5)取i P 二进制数的小数点后i K 位即为该消息符号的二进制码字。

三、设计流程图 1、统计信源熵 开始 读取给定文件 判断文件是否打开否 并且不为空 是 统计文本字符,直关闭文件 至文本字符读完。 统计同一字符(不分 大小写)出现的次数 计算字符概率 计算信源熵 输出 结束

信息论与编码课程大作业信道容量的迭代算法

信息论与编码课程大作业 题目:信道容量的迭代算法 学生姓名: 学号:2010020200 专业班级:10电子信息工程 2013 年5 月18 日

信道容量的迭代算法 1信道容量的迭代算法的步骤 一、用了matlab 实现DMC 容量迭代的算法如下: 第一步:首先要初始化信源分布:.0deta 10,1,0,1 ) (>>=?==,选置,,k r i r P k i 即选取一个精度,本次中我选deta=0.000001。 第二步:}{,) ()()() (k ij i ji k i ji k i k ij t p p p p t 得到反向转移概率矩阵根据式子∑= 。 第三步: ()()()()(){} 111] log exp[] log exp[+++== ∑∑∑k i k i j ij k ji j ij k ji k i p P t p t p p 计算由式。 第四步: () ()() ()()()。 C t p t P I C k r i s j k ij ji k k k 10011log exp log ,+==++????? ???????????==∑∑计算由式 第五步: 若 a C C C k k k det ) 1() ()1(>-++,则执行k=k+1,然后转第二步。直至转移条件不成立,接着 执行下面的程序。 第六步:输出迭代次数k 和()1+k C 和1+k P ,程序终止。 2. Matlab 实现 clear; r=input('输入信源个数:'); s=input('输入信宿个数:'); deta=input('输入信道容量的精度: '); Q=rand(r,s); %形成r 行s 列随机矩阵Q

信息论与编码课程大作业二进制哈夫曼编码

信息论与编码课程大作业 题目:二进制哈夫曼编码 学生姓名: 学号:2010020200 专业班级: 2010级电子信息班 2013年5月18日

二进制哈夫曼编码 1、二进制哈夫曼编码的原理及步骤 1、1信源编码的计算 设有N 个码元组成的离散、无记忆符号集,其中每个符号由一个二进制码字表示,信源符号个数n 、信源的概率分布P={p(s i )},i=1,…..,n 。且各符号xi 的以li 个码元编码,在变长字编码时每个符号的平均码长为∑==n i li xi p L 1)( ; 信源熵为:)(log )()(1 xi p xi p X H n i ∑=-= ; 唯一可译码的充要条件:11 ≤∑=-n i Ki m ; 其中m 为码符号个数,n 为信源符号个数,Ki 为各码字长度。 构造哈夫曼数示例如下图所示。 1、2 二元霍夫曼编码规则 (1)将信源符号依出现概率递减顺序排序。 (2)给两个概率最小的信源符号各分配一个码位“0”和“1”,将两个信源符号合并成一个新符号,并用这两个最小的概率之和作为新符号的概率,结 0.60 0.15 0.09 0.30 1.00 0.60 0.03 0.30 0.15 0.40 0.05 0.04 0.03

果得到一个只包含(n-1)个信源符号的新信源。称为信源的第一次缩减信源,用s1 表示。 (3)将缩减信源 s1 的符号仍按概率从大到小顺序排列,重复步骤(2),得到只含(n-2)个符号的缩减信源s2。 (4)重复上述步骤,直至缩减信源只剩两个符号为止,此时所剩两个符号 的概率之和必为 1,然后从最后一级缩减信源开始,依编码路径向前返回,就得到各信源符号所对应的码字。 1、3 二元哈夫曼编码流程图如下图所示。 是 是 开始 等待数据输入 判断输入的概 率是否小于零 判断概率和是 否大于1 生成一个n - 1行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) 五、实验结果

信息论与编码课程设计(哈夫曼编码的分析与实现)

建筑大学 电气与电子信息工程学院 信息理论与编码课程设计报告 设计题目:哈夫曼编码的分析与实现 专业班级:电子信息工程 101 学生: 学号: 指导教师:吕卅王超 设计时间: 2013.11.18-2013.11.29

一、设计的作用、目的 《信息论与编码》是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。 通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法 二、设计任务及要求 通过课程设计各环节的实践,应使学生达到如下要求: 1. 理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法; 2. 掌握哈夫曼编码/费诺编码方法的基本步骤及优缺点; 3. 深刻理解信道编码的基本思想与目的,理解线性分组码的基本原理与编码过程; 4. 能够使用MATLAB 或其他语言进行编程,编写的函数要有通用性。 三、设计容 一个有8个符号的信源X ,各个符号出现的概率为: 编码方法:先将信源符号按其出现的概率大小依次排列,并取概率最小的字母分别配以0和1两个码元(先0后1或者先1后0,以后赋值固定),再将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队。并不断重复这一过程,直到最后两个符号配以0和1为止。最后从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即为对应的码字。 哈夫曼编码方式得到的码并非唯一的。在对信源缩减时,两个概率最小的符号合并后的概率与其他信源符号的概率相同时,这两者在缩减中的排序将会导12345678,,,,,()0.40.180.10.10.070.060.050.04X x x x x x x x x P X ????=????????

香农编码--信息论大作业

信息论与编码课程大作业 题目:香农编码 学生姓名: ****** 学号: &********** 专业班级: ******************* 2013 年 5 月 10 日

香农编码 1.香农编码的原理/步骤 香农第一定理指出了平均码长与信源之间的关系,同时也指出了可以通过编码使平均码长达到极限值,这是一个很重要的极限定理。如何构造这种码香农第一定理指出, 选择每个码字的长度K i 将满足式 I(x i )≤K i <Ip(x i )+1就可以得到这种码。这种编码方 法就是香农编码。 香农编码步骤如下: (1)将信源消息符按从大到小的顺序排列。 (2)计算p[i]累加概率; (3)确定满足自身要求的整数码长; (4)将累加概率变为二进制数; (5)取P[i]二进制数的小数点后Ki位即为该消息符号的二进制码字。 2. 用C语言实现 #include <> #include <> #include <> #define max_CL 10 /*maxsize of length of code*/ #define max_PN 6 /*输入序列的个数*/ typedef float datatype; typedef struct SHNODE { datatype pb; /*第i个消息符号出现的概率*/ datatype p_sum; /*第i个消息符号累加概率*/ int kl; /*第i个消息符号对应的码长*/ int code[max_CL]; /*第i个消息符号的码字*/ struct SHNODE *next; }shnolist; datatype sym_arry[max_PN]; /*序列的概率*/ void pb_scan(); /*得到序列概率*/ void pb_sort(); /*序列概率排序*/ void valuelist(shnolist *L); /*计算累加概率,码长,码字*/ void codedisp(shnolist *L); void pb_scan() { int i; datatype sum=0; printf("input %d possible!\n",max_PN); for(i=0;i>"); scanf("%f",&sym_arry[i]); sum=sum+sym_arry[i]; }

信息论与编码课程设计(精.选)

信息论与编码课程设计报告 设计题目:统计信源熵、香农编码与费诺编码 专业班级:XXXXXXXXXXXX 姓名:XXXXXXXXXXXX 学号:XXXXXXXXXXXX 指导老师:XXXXXXXXXXXX 成绩: 时间:2015年3月31日

目录 一、设计任务与要求 (2) 二、设计思路 (2) 三、设计流程图 (5) 四、程序及结果 (7) 五、心得体会 (11) 六、参考文献 (12) 附录 (13)

一、 设计任务与要求 1. 统计信源熵 要求:统计任意文本文件中各字符(不区分大小写)数量,计算字符概率,并计算信源熵。 2. 香农编码 要求:任意输入消息概率,利用香农编码方法进行编码,并计算信源熵和编码效率。 3. 费诺编码 要求:任意输入消息概率,利用费诺编码方法进行编码,并计算信源熵和编码效率。 二、 设计思路 1、统计信源熵: 统计信源熵就是对一篇英文文章中的i 种字符(包括标点符号及空格,英文字母不区分大小写)统计其出现的次数count i (),然后计算其出现的概率()p i ,最后由信源熵计算公式: 1()()log ()n i i n H x p x p x ==-∑ 算出信源熵()H x 。所以整体步骤就是先统计出文章中总的字符数,然后统计每种字符的数目,直到算出所有种类的字符的个数,进而算出每种字符的概率,再由信源熵计算公式计算出信源熵。在这里我选择用Matlab 来计算信源熵,因为Matlab 中系统自带了许多文件操作和字符串操作函数,其计算功能强大,所以计算

信源熵很是简单。 2、香农编码 信源编码模型: 信源编码就是从信源符号到码符号的一种映射f ,它把信源输出的符号i a 变换成码元序列i x 。 1,2,...,,i i N f a i q x =→: 1:{,...,}q S s a a ∈ 信源 1 2 {,...,}li i i i i X x x x = 码元 1{,...,} 1,2,...,i q S a a i N ∈= 1,2,...,N i q = 1:{,...,} r X x x x ∈ 码符号 N 次扩展信源无失真编码器 凡是能载荷一定的信息量,且码字的平均长度最短,可分离的变长码的码字集合都可以称为最佳码。为此必须将概率大的信息符号编以短的码字,概率小的符号编以长的码字,使得平均码字长度最短。能获得最佳码的编码方法主要有:香农(Shannon )、费诺(Fano )、哈夫曼(Huffman )编码等。 香农第一定理: 离散无记忆信源为 1 21 2......()()()...... q q s s s S p s p s p s P ????=???????? 熵()H S ,其N 次扩展为

信息论课程设计(2)

电子科技大学电子工程学院信息论课程设计报告课程名称:信息编码与加密

课程设计报告 学生姓名:农瀚学号:21 指导教师:李万春 一、课程设计名称:编程实现霍夫曼、费诺、香农编码 二、课设原理: 1)霍夫曼编码:霍夫曼编码的平均码长最短,是最佳编码。编码步骤如下: (1 )将信源符号按概率大小排序; (2)对概率最小的两个符号求其概率之和,同时给两幅 号分别赋予码元0和1 ; (3)将概率之和当做一个新符号的概率。与剩下的概率 一起,形成一个缩减信源,再重复上述步骤,直到概率和为1为止;(4)按上述步骤实际上构成了一个码树,从根到端点经过的树枝即为码字。 2)费诺编码: 编码步骤如下: (1)将信源概率从大到小排序; (2)将信源符号分成两组,使两组信源符号的概率之和近似相等,并给两组信源符号分别赋0和1; (3)再把各个小组的信源符号细分为两组并赋码元,方法与第一次分组相同; (4)如此一直下去,直到每一个小组只含一个信源符号为止;(5)由此可构造成一个码树,所有终端节点上的码字组成费诺码。

3)香农编码: 编码方法如下: ⑴将信源消息符号按其出现的概率大小依次排列 p(u1) > p(u2)》p(un) ⑵确定码长Ki (整数): 1?S — Ki=[ ]——取整 ⑶ 为了编成唯一可译码,计算第i个消息的累加概率 Pi=工>(?J u ⑷ 将累加概率Pi变换成二进制数。 ⑸ 取pi二进制数的小数点后Ki位即为该消息符号的二进制数。 三、课设目的:通过编程实现三种方式的编码,掌握三种编 码方式的步骤。 四、课设内容: 三种编码方式的编程思路: 1、霍夫曼编码:(1)对给定的n个权值{W1,W2,W3,…,Wi,…,Wn} 构成n 棵二叉树的初始集合F= {T1,T2,T3,…,Ti,…,Tn},其中每棵二叉树Ti 中只有一个权值为Wi的根结点,它的左右子树均为空。(为方便在计算机上实现算法,一般还要求以Ti的权值Wi的升序排列。) (2)在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右

信息论与编码课程设计哈夫曼编码的分析与实现

信息论与编码课程设计哈夫曼编码的分析与实现

吉林建筑大学 电气与电子信息工程学院 信息理论与编码课程设计报告 设计题目:哈夫曼编码的分析与实现 专业班级:电子信息工程 101 学生姓名: 学号: 指导教师:吕卅王超 设计时间: .11.18- .11.29 一、设计的作用、目的

《信息论与编码》是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。 经过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法 二、设计任务及要求 经过课程设计各环节的实践,应使学生达到如下要求: 1. 理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法; 2. 掌握哈夫曼编码/费诺编码方法的基本步骤及优缺点; 3. 深刻理解信道编码的基本思想与目的,理解线性分组码的基本原理与编码过程; 4. 能够使用MATLAB 或其它语言进行编程,编写的函数要有通用性。 三、设计内容 一个有8个符号的信源X ,各个符号出现的概率为: 12345678,,,,, ()0.40.180.10.10.070.060.050.04X x x x x x x x x P X ????=????????

编码方法:先将信源符号按其出现的概率大小依次排列,并取概率最小的字母分别配以0和1两个码元(先0后1或者先1后0,以后赋值固定),再将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队。并不断重复这一过程,直到最后两个符号配以0和1为止。最后从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即为对应的码字。 哈夫曼编码方式得到的码并非唯一的。在对信源缩减时,两个概率最小的符号合并后的概率与其它信源符号的概率相同时,这两者在缩减中的排序将会导致不同码字,但不同的排序将会影响码字的长度,一般讲合并的概率放在上面,这样可获得较小的码方差。 四、设计原理 4.1哈夫曼编码步骤 (1)将信源消息符号按照其出现的概率大小依次排列为 ≥Λ 1 ≥ 2 pn p p≥ (2)取两个概率最小的字母分别配以0和1两个码元,并将这两个概率相加作为一个新的概率,与未分配的二进制符号的字母重新排队。 (3)对重新排列后的两个最小符号重复步骤(2)的过程。 (4)不断重复上述过程,知道最后两个符号配以0和1为止。

相关文档
最新文档