实验二香农编码的计算与分析
实验四_香农编码
实验名称:实验四香农编码一、实验目的:加深对香农公式的理解及其具体的实现过程。
二、实验内容与原理:内容:计算二进制香农编码三、实验步骤1.分析香农公式的算法2.将香农公式的流程转换为具体的代码四、实验数据及结果分析(可附程序运行截图)编码的结果:平均码长和编码效率:五、代码附录clear;% c = strcat(a,b)字符串连接p=[0.25 0.25 0.2 0.15 0.1 0.05];P=fliplr(sort(p));%按大到小排序Pa=[0;0];%累加和的定义----第一行为累加和,第二行为Ki %求累加和for x=1for y=1:1:5%Pa(x,y)=1;Pa(x,y+1)=P(x,y)+ Pa(x,y);endend%ceil 是取向离它最近的大整数圆整for i=2for j=1:1:6Pa(i,j)=ceil( -log2(P(1,j)) );endend%信源熵H=0;L=0;for i=1:1:6H=H-P(i)*log2(P(i));L=L+P(i)*Pa(2,i);endu=H/L;disp('平均码长:;');disp(L);disp('编码效率:');disp(u);%求各符号的编码temp=[];%临时的编码值:1:6for m=1:1:6fprintf('a(%d):',m);for n=1:1:abs(Pa(2,m))temp(m,n)=Pa(1,m)*2;if temp(m,n)>=1O(m,n)=1;Pa(1,m)=temp(m,n)-1;elseO(m,n)=0;Pa(1,m)=temp(m,n);endfprintf('%d',O(m,n));endfprintf('\n');end六、其他:实验总结、心得体会及对本实验方法、手段及过程的改进建议等。
实验起初是想把累加和及Ki和编码放在一个二维矩阵中,但具体的实现较为复杂,所以最后改为逐行存放并成功完成了实验。
香农编码--信息论大作业
信息论与编码课程大作业题目:香农编码学生姓名:******学号:&**********专业班级:*******************2013 年 5 月10 日香农编码1.香农编码的原理/步骤香农第一定理指出了平均码长与信源之间的关系,同时也指出了可以通过编码使平均码长达到极限值,这是一个很重要的极限定理。
如何构造这种码?香农第一定理指出,选择每个码字的长度K i将满足式I(x i)≤K i<I p(x i)+1就可以得到这种码。
这种编码方法就是香农编码。
香农编码步骤如下:(1)将信源消息符按从大到小的顺序排列。
(2)计算p[i]累加概率;(3)确定满足自身要求的整数码长;(4)将累加概率变为二进制数;(5)取P[i]二进制数的小数点后Ki位即为该消息符号的二进制码字。
2. 用C语言实现#include <stdio.h>#include <math.h>#include <stdlib.h>#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<max_PN;i++){ printf(">>");scanf("%f",&sym_arry[i]);sum=sum+sym_arry[i];}/*判断序列的概率之和是否等于1,在实现这块模块时,scanf()对float数的缺陷,故只要满足0.99<sum<1.0001出现的误差是允许的*/if(sum>1.0001||sum<0.99){ printf("sum=%f,sum must (<0.999<sum<1.0001)",sum);pb_scan();}}/*选择法排序*/void pb_sort(){int i,j,pos;datatype max;for(i=0;i<max_PN-1;i++){max=sym_arry[i];pos=i;for(j=i+1;j<max_PN;j++)if(sym_arry[j]>max){max=sym_arry[j];pos=j;}sym_arry[pos]=sym_arry[i];sym_arry[i]=max;}}void codedisp(shnolist *L){int i,j;shnolist *p;datatype hx=0,KL=0; /*hx存放序列的熵的结果,KL存放序列编码后的平均码字的结果*/p=L->next;printf("num\tgailv\tsum\t-lb(p(ai))\tlenth\tcode\n");printf("\n");for(i=0;i<max_PN;i++){printf("a%d\t%1.3f\t%1.3f\t%f\t%d\t",i,p->pb,p->p_sum,-3.332*log10(p->pb),p ->kl);j=0;for(j=0;j<p->kl;j++)printf("%d",p->code[j]);printf("\n");hx=hx-p->pb*3.332*log10(p->pb); /*计算消息序列的熵*/KL=KL+p->kl*p->pb; /*计算平均码字*/p=p->next;}printf("H(x)=%f\tKL=%f\nR=%fbit/code",hx,KL,hx/KL); /*计算编码效率*/ }shnolist *setnull(){ shnolist *head;head=(shnolist *)malloc(sizeof(shnolist));head->next=NULL;return(head);}shnolist *my_creat(datatype a[],int n){shnolist *head,*p,*r;int i;head=setnull();r=head;for(i=0;i<n;i++){ p=(shnolist *)malloc(sizeof(shnolist));p->pb=a[i];p->next=NULL;r->next=p;r=p;}return(head);}void valuelist(shnolist *L){shnolist *head,*p;int j=0;int i;datatype temp,s;head=L;p=head->next;temp=0;while(j<max_PN){p->p_sum=temp;temp=temp+p->pb;p->kl=-3.322*log10(p->pb)+1;/*编码,*/{s=p->p_sum;for(i=0;i<p->kl;i++)p->code[i]=0;for(i=0;i<p->kl;i++){p->code[i]=2*s;if(2*s>=1)s=2*s-1;else if(2*s==0)break;else s=2*s;}}j++;p=p->next;}}int main(void){shnolist *head;pb_scan();pb_sort();head=my_creat(sym_arry,max_PN); valuelist(head);codedisp(head);}3.运行结果及分析(本程序先定义了码字长度的最大值和信源概率的个数,然后有设定了概率的和的范围。
对香农三大定理的分析与探讨
对香农三大定理的分析与探讨摘要本文针对香农三大定理的内容,进行理论分析,探讨了无失真信源编码、有噪信道编码和保真度准则下的信源编码定理。
通过对离散信源熵的分析,延伸到了对扩展信源的理解,同时结合著名的香农公式和信息论与编码的发展史,指出了香农三大定理的意义。
一、香农第一定理香农第一定理主要研究信息的测度,对应的是无失真信源编码定理。
采用无失真最佳信源编码,可以使得用于每个信源符号的编码位数尽可能地小,但它的极限是原始信源的熵值,超过了这一极限就不可能实现无失真的译码。
1.1 离散信源熵1.1.1 信源的概念信源发出消息,消息载荷信息,而消息又具有不确定性,故而可以用随机变量或随机矢量来描述信源输出的消息。
从随机变量出发来研究信息,这正是香农信息论的基本假说。
而离散信源指的是这类信源输出的消息常以一个符号、一个符号的形式出现,这些符号的取值是有限的或者是可数的。
单符号离散信源只涉及一个随机事件,多符号离散信源则涉及多个随机事件。
1.1.2 信源熵的概念及其性质在度量信息的各种方法中,香农提出了解决信息度量问题的方法——熵,这是香农信息论最基本的,也是最重要的概念[1]。
信源熵,即信源的信息熵,又称香农熵、无条件熵,简称熵。
信源各个离散消息的自信息量的数学期望是信源的平均信息量,实质上是无记忆信源平均不确定度的度量。
信源熵表示在信源输出消息前,信源的平均不确定度,也表示在信源输出消息后,平均每个离散消息所提供的信息量,能够反映变量的随机性。
当消息出现的概率相同时,猜测每一个消息发生错误的概率均相同,说明等概率信源的不确定性最大,具有最大熵[2]。
1.2 无失真离散信源编码1.2.1 信源编码的概念信源编码处于通信系统的前端,直接对信源发出的信号进行变换处理。
通过压缩每个信源符号的平均比特数或信源的码率,以较少的码率来传送同样多的信息,增加单位时间内传送的平均信息量,来压缩信源的冗余度,从而提高通信的有效性。
信源编码的实验报告
一、实验目的1. 理解信源编码的基本原理和过程。
2. 掌握几种常见的信源编码方法,如哈夫曼编码、算术编码等。
3. 分析不同信源编码方法的编码效率。
4. 培养动手实践能力和分析问题、解决问题的能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 实验工具:PyCharm IDE三、实验内容1. 哈夫曼编码2. 算术编码四、实验步骤1. 实验一:哈夫曼编码(1)读取信源数据,统计每个字符出现的频率。
(2)根据字符频率构建哈夫曼树,生成哈夫曼编码表。
(3)根据哈夫曼编码表对信源数据进行编码。
(4)计算编码后的数据长度,并与原始数据长度进行比较,分析编码效率。
2. 实验二:算术编码(1)读取信源数据,统计每个字符出现的频率。
(2)根据字符频率构建概率分布表。
(3)根据概率分布表对信源数据进行算术编码。
(4)计算编码后的数据长度,并与原始数据长度进行比较,分析编码效率。
五、实验结果与分析1. 实验一:哈夫曼编码(1)信源数据:{a, b, c, d, e},频率分别为{4, 2, 2, 1, 1}。
(2)哈夫曼编码表:a: 0b: 10c: 110d: 1110e: 1111(3)编码后的数据长度:4a + 2b + 2c + 1d + 1e = 4 + 2 + 2 + 1 + 1 = 10(4)编码效率:编码后的数据长度为10,原始数据长度为8,编码效率为10/8 = 1.25。
2. 实验二:算术编码(1)信源数据:{a, b, c, d, e},频率分别为{4, 2, 2, 1, 1}。
(2)概率分布表:a: 0.4b: 0.2c: 0.2d: 0.1e: 0.1(3)编码后的数据长度:2a + 2b + 2c + 1d + 1e = 2 + 2 + 2 + 1 + 1 = 8(4)编码效率:编码后的数据长度为8,原始数据长度为8,编码效率为8/8 = 1。
六、实验总结1. 哈夫曼编码和算术编码是两种常见的信源编码方法,具有较好的编码效率。
信息论与编码实验报告
信息论与编码实验报告一、实验目的本实验主要目的是通过实验验证信息论与编码理论的基本原理,了解信息的产生、传输和编码的基本过程,深入理解信源、信道和编码的关系,以及各种编码技术的应用。
二、实验设备及原理实验设备:计算机、编码器、解码器、信道模拟器、信噪比计算器等。
实验原理:信息论是由香农提出的一种研究信息传输与数据压缩问题的数学理论。
信源产生的消息通常是具有统计规律的,信道是传送消息的媒体,编码是将消息转换成信号的过程。
根据信息论的基本原理,信息的度量单位是比特(bit),一个比特可以表示两个平等可能的事件。
信源的熵(Entropy)是用来衡量信源产生的信息量大小的物理量,熵越大,信息量就越多。
信道容量是用来衡量信道传输信息的极限容量,即信道的最高传输速率,单位是比特/秒。
编码是为了提高信道的利用率,减少传输时间,提高传输质量等目的而进行的一种信号转换过程。
常见的编码技术有霍夫曼编码、香农-费诺编码、区块编码等。
三、实验步骤1.运行编码器和解码器软件,设置信源信息,编码器将信源信息进行编码,生成信道输入信号。
2.设置信道模拟器的信道参数,模拟信道传输过程。
3.将信道输出信号输入到解码器,解码器将信道输出信号进行解码,恢复信源信息。
4.计算信道容量和实际传输速率,比较两者的差异。
5.改变信道参数和编码方式,观察对实际传输速率的影响。
四、实验结果与分析通过实验,我们可以得到不同信道及编码方式下的信息传输速率,根据信道参数和编码方式的不同,传输速率有时会接近信道容量,有时会低于信道容量。
这是因为在真实的传输过程中,存在信噪比、传输距离等因素导致的误码率,从而降低了实际传输速率。
在实验中,我们还可以观察到不同编码方式对传输速率的影响。
例如,霍夫曼编码适用于信源概率分布不均匀的情况,可以实现数据压缩,提高传输效率。
而区块编码适用于数据容量较大的情况,可以分块传输,降低传输错误率。
此外,通过实验我们还可以了解到信息论中的一些重要概念,如信源熵、信道容量等。
信息论与编码实验报告-Shannon编码
实验报告课程名称:信息论与编码姓名:系:专业:年级:学号:指导教师:职称:年月日实验三 Shannon 编码一、实验目的1、熟悉离散信源的特点;2、学习仿真离散信源的方法3、学习离散信源平均信息量的计算方法4、熟悉 Matlab 编程二、实验原理给定某个信源符号的概率分布,通过以下的步骤进行香农编码 1、信源符号按概率从大到小排列;12.......n p p p ≥≥≥2、确定满足下列不等式的整数码长i K 为()()1i i i lb p K lb p -≤<-+3、为了编成唯一可译码,计算第i 个消息的累加概率:4、将累加概率i P 变换成二进制数;5、取i P 二进制数的小数点后i K 位即为该消息符号的二进制码字。
三、实验内容1、写出计算自信息量的Matlab 程序2、写出计算离散信源平均信息量的Matlab 程序。
3、将程序在计算机上仿真实现,验证程序的正确性并完成习题。
四、实验环境Microsoft Windows 7 Matlab 6.5五、编码程序计算如下信源进行香农编码,并计算编码效率:⎥⎦⎤⎢⎣⎡=⎥⎦⎤⎢⎣⎡01.01.015.017.018.019.02.06543210a a a a a a a P X MATLAB 程序:(1) a=[0.2 0.18 0.19 0.15 0.17 0.1 0.01]; k=length(a);y=0; for i=1:k-111()i i k k P p a -==∑for n=i+1:kif (a(i)<a(n))t=a(i);a(i)=a(n);a(n)=t;endendends=zeros(k,1);b=zeros(k,1);for m=1:ks(m)=y;y=y+a(m);b(m)=ceil(-log2(a(m)));z=zeros(b(m),1);x=s(m);p=b2d10(x);for r=1:b(m)z(r)=p(r);enddisp('Êä³ö½á¹ûΪ£º')disp('³öʸÅÂÊ'),disp(a(m))disp('ÇóºÍ½á¹û'),disp(s(m))disp('±àÂëλÊý'),disp(b(m))disp('×îÖÕ±àÂë'),disp(z')end(2) function y=b2d10(x)for i=1:8temp=x.*2;if(temp<1)y(i)=0;x=temp;elsex=temp-1;y(i)=1;endend(3) p=[0.2 0.19 0.18 0.17 0.15 0.1 0.01]; sum=0;sum1=0;for i=1:7a(i)=-log2(p(i));K(i)=ceil(a(i));R(i)=p(i)*K(i);sum=sum+R(i);c(i)=a(i)*p(i);sum1=sum1+c(i);endK1=sum;H=sum1;Y=H/K1;disp('ƽ¾ùÐÅÏ¢Á¿'),disp(H)disp('ƽ¾ùÂ볤'),disp(K1)disp('±àÂëЧÂÊ'),disp(Y)六、实验结果输出结果为:出事概率0.2000,求和结果0,编码位数3,最终编码000出事概率0.1900,求和结果0.2000,编码位数3,最终编码001出事概率0.1800,求和结果0.3900,编码位数3,最终编码011出事概率0.1700,求和结果0.5700,编码位数3,最终编码100出事概率0.1500,求和结果0.7400,编码位数3,最终编码101出事概率0.1000,求和结果0.8900,编码位数4,最终编码1110出事概率0.0100,求和结果0.9900,编码位数7,最终编码1111110编码效率:平均信息量2.6087平均码长3.1400编码效率0.8308七、实验总结通过本次的实验,掌握了Shannon编码的实验原理以及编码过程。
Huffman编码实验报告
Huffman编码实验报告1 二进制哈夫曼编码的原理及步骤(1)信源编码的计算设有N 个码元组成的离散、无记忆符号集,其中每个符号由一个二进制码字表示,信源符号个数n 、信源的概率分布P={p(s i )},i=1,…..,n 。
且各符号xi 的以li 个码元编码,在变长字编码时每个符号的平均码长为∑==ni li xi p L 1)( ;信源熵为:)(log )()(1xi p xi p X H ni ∑=-= ;唯一可译码的充要条件:11≤∑=-ni Ki m ;其中m 为码符号个数,n 为信源符号个数,Ki 为各码字长度。
构造哈夫曼数示例如下图所示。
(2)二元霍夫曼编码规则(1)将信源符号依出现概率递减顺序排序。
(2)给两个概率最小的信源符号各分配一个码位“0”和“1”,将两个信源符号合并成一个新符号,并用这两个最小的概率之和作为新符号的概率,结果得到一个只包含(n-1)个信源符号的新信源。
称为信源的第一次缩减信源,用s1 表示。
(3)将缩减信源 s1 的符号仍按概率从大到小顺序排列,重复步骤(2),得到只含(n-2)个符号的缩减信源s2。
0.0.0.0.1.000.0.0.00.0.0.0.(4)重复上述步骤,直至缩减信源只剩两个符号为止,此时所剩两个符号 的概率之和必为 1,然后从最后一级缩减信源开始,依编码路径向前返回,就得到各信源符号所对应的码字。
2 功能介绍输入一段字符序列,通过本程序可得出该字符序列中各个字符出现的次数,以及每个字符出现的概率,并能计算出信源符号熵,每个字符的哈弗曼编码,和相应的平均码长,编码效率,码方差。
3 算法基本步骤描述4 C 语言源代码#include<stdio.h>#include<string.h>#include<math.h>#define MAX 100//定义全局变量h 存放信息熵double h=0; 得到信得出信源得出信源计算信输输输输输信源符号的码编码平均输//定义结构体用于存放信源符号,数目及概率typedef struct{//不同的字符char SOURCECODE;//不同字符出现的次数int NUM;//不同字符出现的概率double PROBABILITY;//哈夫曼编码符号int Code[MAX];int start;//哈夫曼树的父结点int parent;//哈夫曼树的左右子结点int lchild;int rchild;//哈夫曼编码的长度int lengthofhuffmancode;}Hcode;Hcode INFORMATION[MAX];//该函数用来求信源所包含的符号,以及不同符号出现的次数和概率int Pofeachsource(char informationsource[MAX],int a){int i,j=1,m,flag=0;char temp;//预先存入第一个字符,便于与后面的字符进行比较//统计不同的字符存入结构体数组中//利用flag标签来标记每个字符是否出现过,若出现过标记为1,否则置为零INFORMATION[0].SOURCECODE=informationsource[0];for(i=1;i<a;i++){ for(m=0;m<i;m++){flag=0;if(informationsource[m]==informationsource[i]){flag=1;break;}}if(flag==1)continue;elseINFORMATION[j++].SOURCECODE=informationsource[i];}INFORMATION[j].SOURCECODE='\0';printf("信源符号数为:%d\n",j);//统计相同的字符出现的次数//每做一个字符出现次数的统计都将结构体数组里的NUM置为零for(i=0;i<j;i++){ INFORMATION[i].NUM=0;for(m=0;m<a;m++)if(informationsource[m]==INFORMATION[i].SOURCECODE)INFORMATION[i].NUM++;}//统计每个字符出现的概率for(i=0;i<j;i++) INFORMATION[i].PROBABILITY=(float)INFORMATION[i].NUM/a;//将每个不同字符出现的次数概率都显示出来for(i=0;i<j;i++)printf("The NUM and PROBABILITY of Code'%c'is %dand %.3f\n",INFORMATION[i].SOURCECODE,INFORMATION[i].NUM,INFORMATION [i].PROBABILITY);return j;}//求信源符号的熵void H(int a){int i;for(i=0;i<a;i++){h+=((-1)*(INFORMATION[i].PROBABILITY)*(log(INFORMATION[i].PROBABI LITY)/log(2)));}}//哈夫曼编码函数void Huffman(int a){Hcode cd;int i,j,m=0,lm=0,p,c;double min,lmin;//顺序初始化每个信源父子结点为-1for(i=0;i<a;i++){INFORMATION[i].parent=-1;INFORMATION[i].lchild=-1;INFORMATION[i].lchild=-1;}cd.start--; /* 求编码的低一位 */c=p;p=INFORMATION[c].parent; /* 设置下一循环条件 */}//保存求出的每个叶结点的哈夫曼编码和编码的起始位for(j=cd.start+1;j<m;j++){ INFORMATION[i].Code[j]=cd.Code[j];}INFORMATION[i].start=cd.start;}}void main(){//定义存放信源符号的数组char informationsource[MAX];int i,j,m;double averageofhuffmancode=0.0,Eita,cV=0.0;printf("please input the source of information:");for(i=0;;i++){scanf("%c",&informationsource[i]);if(informationsource[i]=='\n')break;}informationsource[i]='\0';printf("信源序列为:");//显示已输入的一串信源符号puts(informationsource);//返回不同信源符号的数目m=Pofeachsource(informationsource,i);//求信源的符号熵H(m);printf("信源的符号熵:H(X)=%.3f(比特/符号)\n",h);Huffman(m);//输出已保存好的所有存在编码的哈夫曼编码for(i=0;i<m;i++){printf("%c's Huffman code is: ",INFORMATION[i].SOURCECODE); for(j=INFORMATION[i].start+1;j<m;j++)printf("%d",INFORMATION[i].Code[j]);INFORMATION[i].lengthofhuffmancode=m-INFORMATION[i].start-1; printf("\n");}//求哈夫曼编码的平均码长和编码效率for(i=0;i<m;i++)averageofhuffmancode+=INFORMATION[i].PROBABILITY*INFORMATION[i].l engthofhuffmancode;printf("哈夫曼编码的平均码长为:%lf(码元/信源符号)\n",averageofhuffmancode);Eita=h/averageofhuffmancode;printf("哈夫曼编码的编码效率为:%lf\n",Eita);//求哈弗曼编码的码方差for(i=0;i<m;i++)cV+=INFORMATION[i].PROBABILITY*INFORMATION[i].lengthofhuffmancode *INFORMATION[i].lengthofhuffmancode;cV-=averageofhuffmancode*averageofhuffmancode;printf("哈弗曼编码的码方差为:%lf\n",cV);}5 运行结果截图:6 实验分析(1)在哈弗曼编码的过程中,对缩减信源符号按概率有大到小的顺序重新排列,应使合并后的新符号尽可能排在靠前的位置,这样可使合并后的新符号重复编码次数减少,使短码得到充分利用。
香农编码例题
香农编码例题香农编码是一种将符号转化为二进制代码的编码方式,它是由美国数学家克劳德·香农在1948年提出的。
这种编码方式最初被应用于通信领域,但现在已经广泛应用于数据压缩、图像处理和音频处理等领域。
香农编码的基本思想是根据符号出现的概率来确定其对应的二进制代码。
出现概率较高的符号使用较短的二进制代码表示,而出现概率较低的符号使用较长的二进制代码表示。
这样可以有效地减少使用的二进制位数,从而达到数据压缩的目的。
下面我们来看一个例题:假设有5个符号A、B、C、D、E,它们出现的概率分别为0.4、0.2、0.15、0.15和0.1,请使用香农编码将它们转化为二进制代码。
首先需要按照概率大小对这些符号进行排序,从大到小依次为A、B、C、D和E。
接下来需要计算每个符号对应的编码长度。
根据香农编码原理可知,每个符号对应的编码长度等于其出现概率取对数后向上取整得到的值。
因此,A的编码长度为ceil(log2(1/0.4))=ceil(1.3219)=2,B的编码长度为ceil(log2(1/0.2))=ceil(2.3219)=3,C和D的编码长度均为4,E的编码长度为5。
然后可以根据每个符号对应的编码长度来确定它们对应的二进制代码。
具体地,A对应的二进制代码为00,B对应的二进制代码为010,C和D均对应的二进制代码为0110,E对应的二进制代码为01110。
最后将这些二进制代码按照符号出现概率大小从小到大排列起来就可以得到它们对应的香农编码:E=01110、D=0110、C=0110、B=010、A=00。
通过这个例题我们可以看出,在使用香农编码进行数据压缩时,出现概率较高的符号所对应的二进制代码较短,而出现概率较低的符号所对应的二进制代码较长。
这样可以有效地减少使用的二进制位数,并且在解压缩时也能够快速地还原原始数据。
因此,在实际应用中香农编码是一种非常有效和常用的数据压缩方式。
霍夫曼及香农-范诺编码方法
1.霍夫曼编码方法:先按出现的概率大小排队,把两个最小的概率相加,作为
新的概率和剩余的概率重新排队,再把最小的两个概率相加,再重新排队,直到最后变成1。
每次相加时都将“0”和“1”赋与相加的两个概率,读出时由该符号开始一直走到最后的”0”或者“1”,将路线上所遇到的“0”和“1”按最低位到最高位的顺序排好,就是该符号的霍夫曼编码。
低位高位
用霍夫曼编码所得的平均码长为:Σ(码长×出现概率)
上例为:
0.2×2+0.19×2+0.18×3+0.17×3+0.15×3+0.1×4+0.01×4=2.72 bit
可以算出本例的信源熵为2.61bit,二者已经是很接近了。
2.香农-范诺编码的目的是产生具有最小冗余的码词。
其基本思想是产生编码长度可变的码词。
估计码词长度的准则是符号出现的概率,符号出现的概率越大,其码词的长度越短。
香农-范诺编码方法:将符号从最大可能到最少可能排序,将排列好的信源符号分化为两大组,使两组的概率和近于相同,并各赋予一个二元码符号“0”和“1”。
只要组内有两个或两个以上符号,就以同样的方法重复以上分组,以此确定这些符号的连续编码数字。
依次下去,直至每一组只剩下一个信源符号为止。
香农-范诺编码算法步骤:
(1)按照符号出现的概率减少的顺序将待编码的符号排成序列。
(2)将符号分成两组,使这两组符号概率和相等或几乎相等。
(3)将第一组赋值为0,第二组赋值为1。
(4)对每一组,重复步骤2的操作,直至每一组只剩下一个信源符号为止。
实验2:Shannon编码
k =1 i −1
3)按下式计算第 i 个消息的二元代码组的码长 li
1 li = log ; p ( si ) 4)将累加概率 F ( si ) 变换成二进制小数,根据码长 li 取小数点后 li 个二进制符号作为
实验 2:香农编码 :香农编码
学生姓名: 学生姓名: 学 号:
一、实验室名称:信息与编码课程组 实验室名称: 二、实验项目名称:香农编码 实验项目名称: 三、实验原理: 实验原理: 实验原理 1)将 q 个信源符号按概率大小递减排列 p ( s1 ) ≥ p ( s 2 ) ≥ L ≥ p ( s q ) ;
: 六、实验器材(设备、元器件) 实验器材(设备、元器件)
PC 机一台,装有 VC++6.0 或其它 C 语言集成开发环境。
七、实验步骤及操作: 实验步骤及操作:
1)排序; 2)计算码长; 3)递归调用香农算法得到相应的码字。
八、实验数据及结果分析: 实验数据及结果分析:
s 2 s3 s4 s5 s6 s 7 s8 S s1 题目:已知信源: = ,给出其一个 P 0.20, 0.18, 0.17, 0.15, 0.15, 0.05, 0.05, 0.05 香农码,并求其平均码长和编码效率。
第 i 个消息的码字。 实验目的: 四、实验目的: (1)进一步熟悉Shannon编码过程;(2)掌握C语言递归程序的设计和调试技术。以巩固 课堂所学编码的相关知识。 五、实验内容: 实验内容:
s2 , L , sq S s1 , 对于给定的信源 = P ,利用香农编码方法编出其中一种码。 p ( s1 ), p ( s 2 ),L , p ( s q 结及心得体会: 心得体会 本实验让我学习了使用 识有了进一步了解。
信息论与编码技术实验指导书
2、写出程序代码, 3、写出在调试过程中出现的问题 , 4、对实验的结果进行分析。
实验六 模p信道编码实验 一 实验目的:掌握通过计算机实现模p信道编码 二实验要求: 对于给定的消息序列,按照模p信道编码的方法进行 计算机实现. 三实验原理 在实际生活中,有时侯“1”和“I”很相似。 p=37(符号的个数) 数字“0”-“9”和字母“A”-“Z”和空格 共37种符号。 “0” 0 “1” 1 ¨ “A” 10 “B” 11 设有某消息的符号序列为X=X1X2X3X4, 用下表的方式来求它们的和及累加和,然后加上 适当的监督元,使累加和是模37的倍数。 消息符号
型如下图:
在给定信源概率分布条件下, 各种熵的求解方法如下: 1) 信源熵 2) 条件熵
3) 联合熵
4) 交互熵 5) 信道容量 ◼一般离散信道容量对计算步骤总结如下:
4、 实验设备:计算机 c++ 五、实验报告要求 1、 画出程序设计的流程图, 2、 写出程序代码, 3、 写出在调试过程中出现的问题 , 4、 对实验的结果进行分析。
和 累加和 X1 X1 X1 X2 X1+X2 2*X1+X2 X3 X1+X2+X3 3*X1+2*X2+X3 X4 X1+X2+X3+X4 4*X1+3*X2+2*X3+X4
ψ X1+X2+X3+X4+ψ 5*X1+4*X2+3*X3+2*X4+ψ 四实验设备 计算机 c++ 五实验报告 1、画出程序设计的流程图, 2、写出程序代码, 3、写出在调试过程中出现的问题 , 实验目的:通过该实验,掌握通过计算机实验信息量 和信道容量的计算方法 2、 实验要求:对一个离散的无记忆信源,给定信源的输 入概率分布,给定一个信道特性,计算各种信息量和 熵,并计算信道容量。 3、 实验原理:
实验二 香农编码的计算与分析
实验二香农编码的计算与分析一、[实验目的]1、 理解香农第一定理指出平均码长与信源之间的关系。
2、 加深理解香农编码具有的重要理论意义。
3、 掌握Shannon 编码的原理。
4、 掌握Shannon 编码的方法和步骤。
5、 熟悉shannnon 编码的各种效率二、[实验环境]windows XP,MATLAB 7三、[实验原理]香农第一定理:设离散无记忆信源为熵为H(S),其N 次扩展信源为熵为H(S N )。
码符号集X=〔x1,x2,…,xr 〕。
先对信源N S 进展编码,总可以找到一种编码方法,构成惟一可以码,使S 中每个信源符号所需的平均码长满足:当N →∞时 lim ()N r N L H S N→∞= N L 是平均码长 1()Nq N i i i L p αλ==∑i λ是i α对应的码字长度四、[实验容]1、根据实验原理,设计shannon 编码方法,在给定条件下,实现香农编码并算出编码效率。
SP s1 s2 s3 s4 s5 s6 s70.01 0.17 0.19 0.10 0.15 0.18 0.2=2、请自己构造两个信源空间,根据求Shannon编码结果说明其物理意义。
五、[实验过程]每个实验工程包括:1)设计思路2)实验中出现的问题及解决方法;要求:1〕有标准的实验报告〔10分〕2〕程序设计和根本算法合理〔30分〕3〕实验仿真具备合理性〔30分〕4〕实验分析合理〔20分〕5〕能清晰的对实验中出现的问题进展分析并提出解决方案〔10分〕附录:程序设计与算法描述参考〔1〕〕按降序排列概率的函数%[p,x]=array(P)为按降序排序的函数%%P为信源的概率矢量,x为概率元素的下标矢量%%P为排序后返回的信源的概率矢量%%x为排序后返回的概率元素的下标矢量%%******************************%function[p,x]=array(P)n=length(P);X=1:n;P=[P;X];for i=1:nmax=P(1,i);maxN=i;MAX=P(:,i);for j=i:nif(max<P(1,j))MAX=P(:,j);max=P(1,j);maxN=j;endendif (maxN>1)if (i<n)for k=(maxN-1):-1:iP(:,k+1)=P(:,k);endendendP(:,i)=MAX;endp=P(1,:);x=P(2,:);〔2〕Shannon编码算法% shannon编码生成器%% 函数说明:%% [W,L,q]=shannon(p) 为Shannon编码函数%% p 为信源的概率矢量,W为编码返回的码字%% L 为编码返回的平均码字长度,q 为编码概率%% ******************************************************* %function [W,L,q] =shannon(p)% 提示错误信息%if (length(find(p<=0)) ~=0)error('Not a prob.vector.negative ponent'); % 判断是否符合概率分布条件end% 1) 排序if (abs(sum(p)-1)>10e-10)error('Not a prob.vetor.ponent do not add up to 1') %判断是否符合概率和为1 end[p,x]=array(p);% 2) 计算代码组长度ll=ceil(-log2(p));% 3) 计算累加概率PP(1)=0;n=length(p);for i=2:nP(i)=P(i-1)+p(i-1);end% 4) 求得二进制代码组W% a) 将十进制数转为二进制数for i=1:nfor j=1:l(i)temp(i,j)=floor(P(i)*2);P(i)=P(i)*2-temp(i,j);endend% b) 给W赋ASCII码值,用于显示二进制代码组W for i=1:nfor j=1:l(i)if (temp(i,j)==0)W(i,j)=48;elseW(i,j)=49;endendendL=sum(p.*l); % 计算平均码字长度H=entropy1(p,2); % 计算信源熵q=H/L; % 计算编码效率for i=1:nB{i}=x(i);end% [n,m]=size(W);% TEMP=32*ones(n,6);% W=[W,TEMP];% W=W';% [n,m]=size(W);% W=reshape(W,1,n*m);% W=sprintf('%s',W);[m,n]=size(W);TEMP=blanks(m);W=[W,TEMP',TEMP',TEMP'];[m,n]=size(W);W=reshape(W',1,m*n);s0='很好!输入正确,编码结果如下:'; s1='Shannon编码所得码字W:';s2='Shannon编码平均码字长度L:';s3='Shannon编码的编码效率q:';disp(s0);disp(s1),disp(B),disp(W);disp(s2),disp(L);disp(s3),disp(q);。
香农信息定义分析与改进
香农信息定义分析与改进
香农信息论是由美国数学家克劳德·香农于20世纪40年代提出的一种通信理论。
该理论主要研究信息的传输、存储和处理,以及信息的可靠性和效率问题。
香农信息论最基本的概念是信息的概率论定义。
香农定义了信息量的度量方式,将信息的度量单位称为比特(bit)。
一个
比特的信息量等于用一个二进制数字表示一个事件发生的概率的负对数。
比如,如果一个事件发生的概率是1/2,那么该事件的信息量为1比特。
信息量越大,表示事件的不确定性越高,信息的重要性也就越大。
在香农信息论中,还引入了熵的概念。
熵是对一个随机变量的不确定性的度量,表示平均每个符号所包含的信息量。
熵越大,表示随机变量的不确定性越高,信息的平均度量也就越大。
熵可以用来衡量信息源的纯度和复杂性,对于设计有效的编码和压缩算法非常重要。
除了熵和信息量的概念之外,香农信息论还研究了信道容量和编码理论等问题。
信道容量是指在给定信噪比下,信道所能传输的最大有效信息量。
编码理论则研究如何用更少的比特表示更多的信息,以提高信息的传输效率和可靠性。
虽然香农信息论在通信领域有着广泛的应用,但也存在一些问题和改进的空间。
例如,香农信息论主要关注信息的传递和处理,但在现实生活中,信息的解释和理解也是非常重要的。
此外,随着技术的不断发展,信息的形式也越来越多样化,包括文本、图像、音频、视频等,如何应用香农信息论来处理多媒体信息,仍然需要进一步研究和改进。
信息论实验报告2信源编码
function [W,L,q]=shannon(p)
if (length(find(p<=0)) ~=0)
error('Not a prob.vector,negative component'); end
if (abs(sum(p)-1)>10e-10)
error('Not a prob.vector,component do not add up to 1'); end
n=length(P); %计算输入元素个数
p=P; mark=zeros(n-1,n);
% mark为n-1行、n列矩阵,用来记录每行最小两概率叠加后概率排列次序
% 1)确定概率大小值的排列,得到mark矩阵。
for i=1:n-1
[p,num]=sort(p); mark(i,:)=[num(1:n-i+1),zeros(1,i-1)];
s2='Shannon编码平均码字长度L:'; s3='Shannon编码的编码效率q:';
disp(s0);disp(s1),disp(B),disp(W);disp(s2),disp(L);disp(s3),disp(q);
function H=entropy(P,r)
if (length(find(P<=0))~=0) %判断是否符合概率分布条件
[c,k]=min(temp);
if (current_index<=k)
next_index=current_index; code_num=48;
next_P=current_P(1:k);
else
信息论与编码课程设计报告统计信源熵与香农编码
信息论与编码课程设计报告统计信源熵与香农编码信息论与编码课程设计报告设计题目:统计信源熵与香农编码专业班级电信 12-06学号学生姓名指导教师教师评分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、统计信源熵开始计算字符概率输出结束2、香农编码开始计算信源熵计算编码效率输出结束四、程序运行及结果1、统计信源熵2、香农编码五、心得体会经过这次课程设计明显的体会到知识匮乏所带来的种种问题,首先是对C语言编程的不熟练,课程知识在与C语言的结合中没有清晰的思路,具体实现程序语言的编写较为困难。
在程序的调试中出现的问题无法及时快速的解决,有些错误甚至无法找到合适的解决方法,以至于不断的修改程序,浪费了大量的时间。
香农公式计算例题
香农公式计算例题
香农公式是用来计算信息论中的信息量的公式。
它由克劳德·香农在1948年提出,被广泛应用于通信和数据压缩领域。
香农公式可以表示为:
H = -Σ(p * log2(p))
其中,H代表信息的熵(entropy),p代表事件发生的概率。
下面是一个计算信息量的例题:
假设有一个事件,该事件有4种可能的结果,每种结果发生的概率分别是0.2、0.3、0.4和0.1。
我们需要计算这个事件的信息量。
首先,我们可以计算每种结果的贡献信息量:
- 第一种结果:0.2 * log2(0.2) ≈-0.4644
- 第二种结果:0.3 * log2(0.3) ≈-0.5211
- 第三种结果:0.4 * log2(0.4) ≈-0.5283
- 第四种结果:0.1 * log2(0.1) ≈-0.3322
然后,将每种结果的贡献信息量相加:
- 总信息量= -0.4644 + (-0.5211) + (-0.5283) + (-0.3322) ≈-1.8459
因此,这个事件的信息量约为1.8459个比特。
希望这个例题能够帮助你理解香农公式的计算方式。
如果还有其他问题,请随时提问。
香农编码实验报告
中南大学《信息论与编码》实验报告目录一、香农编码 (3)实验目的 (3)实验要求 (3)编码算法 (3)调试过程 (3)参考代码 (4)调试验证 (7)实验总结 (7)二、哈夫曼编码 (8)实验目的 (8)实验原理 (8)数据记录 (9)实验心得 (10)一、香农编码1、实验目的(1)进一步熟悉Shannon 编码算法;(2)掌握C 语言程序设计和调试过程中数值的进制转换、数值与字符串之间的转换等技术。
2、实验要求(1)输入:信源符号个数q 、信源的概率分布p ;(2)输出:每个信源符号对应的Shannon 编码的码字。
3、Shannon 编码算法 1:procedure SHANNON(q,{Pi })2: 降序排列{Pi } 3: for i=1 q do 4: F(i s ) 5:i l 2[]log 1/()i p s 6:将累加概率F(i s )(十进制小数)变换成二进制小数。
7:取小数点后i l 个二进制数字作为第i 个消息的码字。
8:end for9:end procedure------------------------------------------------------------------------------------------------------------------4、调试过程1、fatal error C1083: Cannot open include file: 'unistd.h': No such file or directoryfatal error C1083: Cannot open include file: 'values.h': No such file or directory原因:unistd.h 和values.h 是Unix 操作系统下所使用的头文件纠错:删去即可2、error C2144: syntax error : missing ')' before type 'int'error C2064: term does not evaluate to a function原因:l_i(int *)calloc(n,sizeof(int)); l_i 后缺少赋值符号使之不能通过编译纠错:添加上赋值符号11()i k k p s -=∑3、error C2018: unknown character '0xa1'原因:有不能被识别的符号纠错:在错误处将不能识别的符号改为符合C语言规范的符号4、error C2021: expected exponent value, not ' '原因:if(fabs(sum-1.0)>DELTA); 这一行中DELTA宏定义不正确纠错:# define DELTA 0.0000015、error C2143: syntax error : missing ';' before '}'原因:少写了“;”号纠错:在对应位置添加上“;”号5、参考代码# include<stdio.h># include<math.h># include<stdlib.h># include<string.h># define DELTA 0.000001/*精度*/void sort(float*,int);/*排序*/int main(void){register int i,j;int n; /*符号个数*/int temp;/*中间变量*/float *p_i; /*符号的概率*/float *P_i; /*累加概率*/int *l_i; /*码长*/char * *C; /*码集合*//*用sum来检验数据,用p来缓存了中间数据*/float sum,p;/*输入符号数*/fscanf(stdin,"%d",&n);/*分配内存地址 */p_i=(float *)calloc(n,sizeof(float));P_i=(float *)calloc(n,sizeof(float));l_i=(int *)calloc(n,sizeof(int));/* 存储信道传输的概率*/for(i=0;i<n;i++)fscanf(stdin,"%f",&p_i[i]);/*确认输入的数据*/sum=0.0;for(i=0;i<n;i++)sum+=p_i[i];if(fabs(sum-(1.0))>DELTA)fprintf(stderr,"Invalid input data \n");fprintf(stdout,"Starting…\n\n");/*以降序排列概率*/sort (p_i,n);/*计算每个符号的码长*/for(i=0;i<n;i++){p=(float)(-(log(p_i[i])))/log(2.0);l_i[i]=(int)ceil(p);}/*为码字分配内存地址*/C=(char **)calloc(n,sizeof(char *));for(i=0;i<n;i++){C[i]=(char *)calloc(l_i[i]+1,sizeof(char));C[i][0]='\0';}/*计算概率累加和*/P_i[0]=0.0;for(i=1;i<n;i++)P_i[i]=P_i[i-1]+p_i[i-1];/*将概率和转变为二进制编码*/for(i=0;i<n;i++){for(j=0;j<l_i[i];j++){/*乘2后的整数部分即为这一位的二进制码元*/ P_i[i]=P_i[i]*2;temp=(int)(P_i[i]);P_i[i]=P_i[i]-temp;/*整数部分大于0为1,等于0为0*/if(temp==0)C[i]=strcat(C[i],"0");elseC[i]=strcat(C[i],"1");}}/*显示编码结果*/fprintf(stdout,"The output coding is :\n"); for(i=0;i<n;i++)fprintf(stdout,"%s",C[i]);fprintf(stdout,"\n\n");/*释放内存空间*/for(i=n-1;i>=0;i--)free(C[i]);free(C);free(p_i);free(P_i);free(l_i);exit(0);}/*冒泡排序法*/void sort(float *k,int m){int i=1;/*外层循环变量*/int j=1;/*内层循环变量*/int finish=0;/*结束标志*/float temp;/*中间变量*/while(i<m&&!finish){finish=1;for(j=0;j<m-i;j++){/*将小的数后移*/if(k[j]<k[j+1]){temp=k[j];k[j]=k[j+1];k[j+1]=k[j];finish=0;}i++;}}}6、调试验证:程序结果:7、实验总结1949年香农在《有噪声时的通信》一文中提出了信道容量的概念和信道编码定理,为信道编码奠定了理论基础。
香农三大定理简答
香农三大定理简答简介在信息论领域,香农三大定理是指由克劳德·香农提出的三个基本定理,分别是信源编码定理、信道编码定理和信道容量定理。
这些定理为我们理解和优化信息传输提供了重要的理论基础。
本文将对香农三大定理进行全面、详细、完整和深入地探讨。
信源编码定理信源编码定理是香农在1948年提出的,它主要研究的是如何对离散无记忆信源进行编码,以最小化所需的平均编码长度。
以下是信源编码定理的关键要点:1.信源熵:信源编码定理首先定义了信源的熵,即信源产生的信息的平均不确定性。
信源熵越大,表示信源产生的信息越随机,编码难度也越大。
2.霍夫曼编码:信源编码定理证明了对于离散无记忆信源,存在一种最优编码方式,即霍夫曼编码。
霍夫曼编码根据信源符号的概率分布,为每个符号分配一个唯一的二进制编码,使得平均编码长度最小。
3.码长上界:信源编码定理还给出了信源编码的码长上界,即对于任何离散无记忆信源,平均编码长度不会超过信源熵加一。
信道编码定理信道编码定理是香农在1949年提出的,它主要研究的是如何对离散无记忆信道进行编码,以提高信息传输的可靠性。
以下是信道编码定理的关键要点:1.信道容量:信道编码定理首先定义了信道的容量,即信道传输的最大信息率。
信道容量取决于信道的特性,如噪声水平和带宽等。
2.误差控制编码:信道编码定理证明了通过引入冗余信息,即误差控制编码,可以在有限的信道容量内实现可靠的信息传输。
常见的误差控制编码方法包括海明码和卷积码等。
3.编码效率:信道编码定理还引入了编码效率的概念,即传输的有效信息比特数与总比特数之比。
编码效率越高,表示在给定的信道容量下,能够传输更多的有效信息。
信道容量定理信道容量定理是香农在1948年提出的,它主要研究的是在给定噪声条件下,信道的最大传输信息率。
以下是信道容量定理的关键要点:1.噪声和信噪比:信道容量定理考虑了信道中存在的噪声,噪声会引入误码率,从而限制了信息的传输率。
验证香农定理实验报告
验证香农定理实验报告引言香农定理是信息论的基石,它描述了在理想条件下,通过无噪声信道传输的信息的极限速率。
然而,在实际应用中,我们需要验证香农定理是否适用于当前的通信系统。
本实验旨在通过实际操作和数据分析,验证香农定理的正确性。
实验目的1. 通过测量信道带宽和信噪比,定量评估系统的传输速率。
2. 对比理论计算得到的最大传输速率与实际测得的传输速率,验证香农定理的正确性。
实验设备与方法设备:1. 一台计算机2. 一个无线局域网路由器3. 一根网线方法:1. 将计算机通过网线连接到无线局域网路由器。
2. 使用网络分析工具测量信道带宽。
3. 制造不同信噪比的环境,并通过计算机传输信息。
4. 测量传输速率。
实验步骤1. 将计算机通过网线连接到无线局域网路由器,并确保连接正常。
2. 使用网络分析工具测量信道带宽,并记录测得的数值。
结果:测得的信道带宽为20Mbps。
3. 制造不同信噪比的环境。
通过在实验室内调整无线信号的接收强度和背景噪声水平,实现不同信噪比。
记录每个信噪比下的相关参数。
结果:信噪比为10dB,背景噪声水平为-80dBm。
4. 在计算机上选择一个文件,并将其复制到另一台计算机上。
记录文件传输所需的时间,并计算传输速率。
结果:传输文件所需时间为10秒。
数据分析与结果根据香农定理,系统的最大传输速率(C)为信道带宽(B)乘以以2为底的信噪比(S)的乘方,即C=Blog(1+S)。
根据步骤2的结果,信道带宽B=20Mbps。
根据步骤3的结果,信噪比S=10dB,转换为线性单位为10^(S/10)=10^(10/10)=10。
根据步骤4的结果,传输时间T=10秒。
根据以上数据,可计算出实际传输速率R=文件大小/T。
通过将实际传输速率R与理论计算得到的最大传输速率C进行比较,即可验证香农定理的正确性。
根据计算:C=20Mbps * log(1+10) ≈47.7Mbps实际传输速率R=文件大小/10 ≈X1Mbps比较R和C的数值,若R接近C,则验证香农定理的正确性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二香农编码的计算与
分析
The Standardization Office was revised on the afternoon of December 13, 2020
实验二 香农编码的计算与分析
一、[实验目的]
1、理解香农第一定理指出平均码长与信源之间的关系。
2、加深理解香农编码具有的重要理论意义。
3、掌握Shannon 编码的原理。
4、掌握Shannon 编码的方法和步骤。
5、熟悉shannnon 编码的各种效率
二、[实验环境]
windows XP,MATLAB 7
三、[实验原理]
香农第一定理:
设离散无记忆信源为
12 (1)
(2)....()S s s sq
P p s p s p sq ⎡⎤⎡⎤=⎢⎥⎢⎥⎣⎦⎣⎦ 熵为H(S),其N 次扩展信源为 12 (1)
(2)....()N q S p p p q P αααααα⎡⎤⎡⎤=⎢⎥⎢⎥⎣⎦⎣⎦ 熵为H(S N )。
码符号集X=(x1,x2,…,xr )。
先对信源N S 进行编码,总可以找到一种编码方法,构成惟一可以码,使S 中每个信源符号所需的平均码长满足:
1N L H S H S N N +>≥()()logr logr
当N →∞时 lim ()N r N L H S N
→∞= N L 是平均码长 1
()N
q N i i i L p αλ==∑ i λ是i α对应的码字长度
四、[实验内容]
1、根据实验原理,设计shannon 编码方法,在给定
条件下,实现香农编码并算出编码效率。
2、请自己构造两个信源空间,根据求Shannon 编码结果说明其物理意义。
五、[实验过程]
每个实验项目包括:1)设计思路2)实验中出现的问题及解决方法;
要求:
1)有标准的实验报告 (10分)
2)程序设计和基本算法合理(30分)
3)实验仿真具备合理性(30分)
4)实验分析合理(20分)
5)能清晰的对实验中出现的问题进行分析并提出解决方案(10分)
S P
s1 s2 s3 s4 s5 s6 s7 =
附录:程序设计与算法描述参考(1))按降序排列概率的函数
%[p,x]=array(P)为按降序排序的函数 %
%P为信源的概率矢量,x为概率元素的下标矢量% %P为排序后返回的信源的概率矢量 %
%x为排序后返回的概率元素的下标矢量 %
%******************************%
function[p,x]=array(P)
n=length(P);
X=1:n;
P=[P;X];
for i=1:n
max=P(1,i);
maxN=i;
MAX=P(:,i);
for j=i:n
if(max<P(1,j))
MAX=P(:,j);
max=P(1,j);
maxN=j;
end
end
if (maxN>1)
if (i<n)
for k=(maxN-1):-1:i
P(:,k+1)=P(:,k);
end
end
end
P(:,i)=MAX;
end
p=P(1,:);
x=P(2,:);
(2)Shannon编码算法
% shannon编码生成器 %
% 函数说明: %
% [W,L,q]=shannon(p) 为 Shannon编码函数 %
% p 为信源的概率矢量,W为编码返回的码字 %
% L 为编码返回的平均码字长度,q 为编码概率 %
% ******************************************************* % function [W,L,q] =shannon(p)
% 提示错误信息 %
if (length(find(p<=0)) ~=0)
error('Not a component'); % 判断是否符合概率分布条件
end
% 1) 排序
if (abs(sum(p)-1)>10e-10)
error('Not a do not add up to 1') %判断是否符合概率和为 1
end
[p,x]=array(p);
% 2) 计算代码组长度l
l=ceil(-log2(p));
% 3) 计算累加概率P
P(1)=0;
n=length(p);
for i=2:n
P(i)=P(i-1)+p(i-1);
end
% 4) 求得二进制代码组W
% a) 将十进制数转为二进制数
for i=1:n
for j=1:l(i)
temp(i,j)=floor(P(i)*2);
P(i)=P(i)*2-temp(i,j);
end
end
% b) 给W赋ASCII码值,用于显示二进制代码组W for i=1:n
for j=1:l(i)
if (temp(i,j)==0)
W(i,j)=48;
else
W(i,j)=49;
end
end
end
L=sum(p.*l); % 计算平均码字长度
H=entropy1(p,2); % 计算信源熵
q=H/L; % 计算编码效率
for i=1:n
B{i}=x(i);
end
% [n,m]=size(W);
% TEMP=32*ones(n,6);
% W=[W,TEMP];
% W=W';
% [n,m]=size(W);
% W=reshape(W,1,n*m);
% W=sprintf('%s',W);
[m,n]=size(W);
TEMP=blanks(m);
W=[W,TEMP',TEMP',TEMP'];
[m,n]=size(W);
W=reshape(W',1,m*n);
s0='很好!输入正确,编码结果如下:'; s1='Shannon编码所得码字W:';
s2='Shannon编码平均码字长度L:';
s3='Shannon编码的编码效率q:';
disp(s0);
disp(s1),disp(B),disp(W);
disp(s2),disp(L);
disp(s3),disp(q);。