信息论 实验四 香农编码

合集下载

编码理论实验报告

编码理论实验报告

一、实验目的1. 理解编码理论的基本概念和原理;2. 掌握哈夫曼编码和香农编码的方法;3. 熟悉编码效率的计算方法;4. 培养编程能力和实践操作能力。

二、实验原理1. 编码理论:编码理论是研究信息传输、存储和处理中信息压缩和编码的理论。

其目的是在保证信息传输质量的前提下,尽可能地减少传输或存储所需的数据量。

2. 哈夫曼编码:哈夫曼编码是一种根据字符出现频率进行编码的方法,字符出现频率高的用短码表示,频率低的用长码表示,从而达到压缩数据的目的。

3. 香农编码:香农编码是一种基于信息熵的编码方法,根据字符的概率分布进行编码,概率高的字符用短码表示,概率低的字符用长码表示。

4. 编码效率:编码效率是指编码后数据长度与原始数据长度的比值。

编码效率越高,表示压缩效果越好。

三、实验内容1. 使用MATLAB软件实现哈夫曼编码和香农编码;2. 对给定信源进行编码,并计算编码效率;3. 对比哈夫曼编码和香农编码的效率。

四、实验步骤1. 编写哈夫曼编码程序:首先,统计信源中各个字符的出现频率;然后,根据频率构造哈夫曼树;最后,根据哈夫曼树生成编码。

2. 编写香农编码程序:首先,计算信源熵;然后,根据熵值生成编码。

3. 编码实验:对给定的信源进行哈夫曼编码和香农编码,并计算编码效率。

4. 对比分析:对比哈夫曼编码和香农编码的效率,分析其优缺点。

五、实验结果与分析1. 哈夫曼编码实验结果:信源:'hello world'字符频率:'h' - 2, 'e' - 1, 'l' - 3, 'o' - 2, ' ' - 1, 'w' - 1, 'r' - 1, 'd' - 1哈夫曼编码结果:'h' - 0'e' - 10'l' - 110'o' - 1110' ' - 01'w' - 101'r' - 100'd' - 1001编码效率:1.52. 香农编码实验结果:信源:'hello world'字符频率:'h' - 2, 'e' - 1, 'l' - 3, 'o' - 2, ' ' - 1, 'w' - 1, 'r' - 1, 'd' - 1香农编码结果:'h' - 0'e' - 10'l' - 110'o' - 1110' ' - 01'w' - 101'r' - 100'd' - 1001编码效率:1.53. 对比分析:哈夫曼编码和香农编码的效率相同,均为1.5。

信息论霍夫曼、香农-费诺编码

信息论霍夫曼、香农-费诺编码

信息论霍夫曼、香农-费诺编码LT二、实验原理:1、香农-费诺编码首先,将信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同,并各赋于一个二元码符号”0”和”1”.然后,将每一大组的信源符号再分成两组,使同一组的两个小组的概率和近于相同,并又分别赋予一个二元码符号。

依次下去,直至每一个小组只剩下一个信源符号为止。

这样,信源符号所对应的码符号序列则为编得的码字。

译码原理,按照编码的二叉树从树根开始,按译码序列进行逐个的向其叶子结点走,直到找到相应的信源符号为止。

之后再把指示标记回调到树根,按照同样的方式进行下一序列的译码到序列结束。

如果整个译码序列能够完整的译出则返回成功,否则则返回译码失败。

2、霍夫曼编码霍夫曼编码属于码词长度可变的编码类,是霍夫曼在1952年提出的一种编码方法,即从下到上的编码方法。

同其他码词长度可变的编码一样,可区别的不同码词的生成是基于不同符号出现的不同概率。

生成霍夫曼编码算法基于一种称为“编码树”(coding tree)的技术。

算法步骤如下:(1)初始化,根据符号概率的大小按由大到小顺序对符号进行排序。

(2)把概率最小的两个符号组成一个新符号(节点),即新符号的概率等于这两个符号概率之和。

(3)重复第2步,直到形成一个符号为止(树),其概率最后等于1。

(4)从编码树的根开始回溯到原始的符号,并将每一下分枝赋值为1,上分枝赋值为0。

三、实验环境matlab7.1四、实验内容1、对于给定的信源的概率分布,用香农-费诺编码实现图像压缩2、对于给定的信源的概率分布,用霍夫曼编码实现图像压缩五、实验过程1.香农-费诺编码编码1function c=shannon(p)%p=[0.2 0.15 0.15 0.1 0.1 0.1 0.1 0.1] %shannon(p)[p,index]=sort(p)p=fliplr(p)n=length(p)pa=0for i=2:npa(i)= pa(i-1)+p(i-1) endk=ceil(-log2(p))c=cell(1,n)for i=1:nc{i}=”tmp=pa(i)for j=1:k(i)tmp=tmp*2if tmp>=1tmp=tmp-1 c{i(j)='1'elsec{i}(j) = '0' endendendc = fliplr(c)c(index)=c编码2clc;clear;A=[0.4,0.3,0.1,0.09,0.07,0.04]; A=fliplr(sort(A));%降序排列[m,n]=size(A);for i=1:nB(i,1)=A(i);%生成B的第1列end%生成B第2列的元素a=sum(B(:,1))/2;for k=1:n-1ifabs(sum(B(1:k,1))-a)<=abs(sum(B(1:k+1, 1))-a)break;endendfor i=1:n%生成B第2列的元素if i<=kB(i,2)=0;elseB(i,2)=1;endend%生成第一次编码的结果END=B(:,2)';END=sym(END);%生成第3列及以后几列的各元素j=3;while (j~=0)p=1;while(p<=n)x=B(p,j-1);for q=p:nif x==-1break;elseif B(q,j-1)==xy=1;continue;elsey=0;break;endendif y==1q=q+1;endif q==p|q-p==1B(p,j)=-1;elseif q-p==2B(p,j)=0;END(p)=[char(END(p)),'0'];B(q-1,j)=1;END(q-1)=[char(END(q-1)),'1']; elsea=sum(B(p:q-1,1))/2;for k=p:q-2abs(sum(B(p:k,1))-a)<=abs(sum(B(p:k+1, 1))-a);break;endendfor i=p:q-1if i<=kB(i,j)=0;END(i)=[char(END(i)),'0'];elseB(i,j)=1;END(i)=[char(END(i)),'1'];endendendendendC=B(:,j);D=find(C==-1);[e,f]=size(D);if e==nj=0;elsej=j+1;endendBAENDfor i=1:n[u,v]=size(char(END(i))); L(i)=v;avlen=sum(L.*A)2. 霍夫曼编码function c=huffman(p)n=size(p,2)if n==1c=cell(1,1)c{1}=''returnend[p1,i1]=min(p)index=[(1:i1-1),(i1+1:n)] p=p(index)n=n-1[p2,i2]=min(p)index2=[(1:i2-1),(i2+1:n)] p=p(index2);i2=index(i2)index=index(index2)p(n)=p1+p2c=huffman(p)c{n+1}=strcat(c{n},'1')c{n}=strcat(c{n},'0') index=[index,i1,i2]c(index)=c。

实验四_香农编码

实验四_香农编码

实验名称:实验四香农编码一、实验目的:加深对香农公式的理解及其具体的实现过程。

二、实验内容与原理:内容:计算二进制香农编码三、实验步骤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.运行结果及分析(本程序先定义了码字长度的最大值和信源概率的个数,然后有设定了概率的和的范围。

信息论与编码实验报告

信息论与编码实验报告

NANCHANG UNIVERSITY信息论与编码实验报告(2018年11月27日)学院:信息工程学院系电子信息工程系专业班级:学生姓名:学号:指导教师:目录实验一自信息量和熵源.............................................................................................. 实验二准对称信道容量.............................................................................................. 实验三费诺不等式...................................................................................................... 实验四香农编码.......................................................................................................... 实验五费诺编码.......................................................................................................... 实验六霍夫曼编码......................................................................................................实验一自信息量和熵源一、实验要求1、画出I=-的函数图;2、画出H(p)=-p-(1-p)函数图。

二、实验原理及理论分析自信息量:一个事件的自信息量就是对其不确定性的度量。

信息论与编码实验报告

信息论与编码实验报告

信息论与编码实验报告一、实验目的本实验主要目的是通过实验验证信息论与编码理论的基本原理,了解信息的产生、传输和编码的基本过程,深入理解信源、信道和编码的关系,以及各种编码技术的应用。

二、实验设备及原理实验设备:计算机、编码器、解码器、信道模拟器、信噪比计算器等。

实验原理:信息论是由香农提出的一种研究信息传输与数据压缩问题的数学理论。

信源产生的消息通常是具有统计规律的,信道是传送消息的媒体,编码是将消息转换成信号的过程。

根据信息论的基本原理,信息的度量单位是比特(bit),一个比特可以表示两个平等可能的事件。

信源的熵(Entropy)是用来衡量信源产生的信息量大小的物理量,熵越大,信息量就越多。

信道容量是用来衡量信道传输信息的极限容量,即信道的最高传输速率,单位是比特/秒。

编码是为了提高信道的利用率,减少传输时间,提高传输质量等目的而进行的一种信号转换过程。

常见的编码技术有霍夫曼编码、香农-费诺编码、区块编码等。

三、实验步骤1.运行编码器和解码器软件,设置信源信息,编码器将信源信息进行编码,生成信道输入信号。

2.设置信道模拟器的信道参数,模拟信道传输过程。

3.将信道输出信号输入到解码器,解码器将信道输出信号进行解码,恢复信源信息。

4.计算信道容量和实际传输速率,比较两者的差异。

5.改变信道参数和编码方式,观察对实际传输速率的影响。

四、实验结果与分析通过实验,我们可以得到不同信道及编码方式下的信息传输速率,根据信道参数和编码方式的不同,传输速率有时会接近信道容量,有时会低于信道容量。

这是因为在真实的传输过程中,存在信噪比、传输距离等因素导致的误码率,从而降低了实际传输速率。

在实验中,我们还可以观察到不同编码方式对传输速率的影响。

例如,霍夫曼编码适用于信源概率分布不均匀的情况,可以实现数据压缩,提高传输效率。

而区块编码适用于数据容量较大的情况,可以分块传输,降低传输错误率。

此外,通过实验我们还可以了解到信息论中的一些重要概念,如信源熵、信道容量等。

信息论与编码实验报告-Shannon编码

信息论与编码实验报告-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编码的实验原理以及编码过程。

实验四-香农编码

实验四-香农编码

海南大学信息科学技术学院信息安全专业《信息论与编码》实验报告一、 实验目的:了解掌握香农编码二、 实验环境:CodeBlocks三、 实验要求编程,对某一离散无记忆信源实现香农编码,输出消息符号及其对应的码字。

设离散无记忆信源⎭⎬⎫⎩⎨⎧=⎪⎪⎭⎫ ⎝⎛01.010.015.017.018.019.020.0)(7654321a a a a a a a X p X ,∑==ni ia p 11)(。

二进制香农编码过程如下: 1、将信源发出的N 个消息符号按其概率的递减次序依次排列。

2、按下式计算第i 个消息的二进制代码组的码长,并取整。

3、为了编成唯一可译码,首先计算第i 个消息的累加概率4、将累加概率Pi (为小数)变成二进制数5、除去小数点,并根据码长li ,取小数点后li 位数作为第i 个消息的码字。

四、 实验过程:代码:#include<stdio.h>#include<math.h>void main(){int i,n, j,k;float sum=0;float p[100]={0}; //无记忆信源X 的概率分布float m;float Pa[100]={0}; //累加概率的数组int l[100];char c[100][100];printf("请输入信源X的个数:");scanf("%d",&n);printf("请输入p[X]的概率分布\n");for(i=0;i<n;i++)scanf("%f",&p[i]);for(i=0;i<=n;i++) //判断概率和为1sum=sum+p[i];while(sum!=1){printf("错误输入,请重输\n");printf("请输入x的个数\n");scanf("%d",&n);printf("\n");printf("请输入p[i]的概率分布\n");for(i=0;i<n;i++)scanf("%f",&p[i]);for(i=0;i<n;i++)sum=sum+p[i];}for(j=0;j<n-1;j++) //将概率按从大到小排序 for(i=0;i<n-1-j;i++)if(p[i]<p[i+1]){m=p[i];p[i]=p[i+1];p[i+1]=m;}printf("p[i]由大到小的顺序为\n:");for(i=0;i<n;i++)printf("%5.2f",p[i]);printf("\n");Pa[0]=0;for(j=1;j<n+1;j++) //计算累加概率{Pa[j]=Pa[j-1]+p[j-1];}printf("累加和Pi为:");for(j=0;j<n;j++)printf("%5.2f",Pa[j]);printf("\n");printf("码长:");for(i=0;i<n;i++) //计算码长{m=log(1/p[i])/log(2);if(m==(int)m)l[i]=(int)m;elsel[i]=(int)(m+1);}for(i=0;i<n;i++)printf(" %d ",l[i]);printf("\n");for(i=0;i<n;i++) //将累加概率转换成二进制数{for(k=0;k<l[i];k++){Pa[i]=Pa[i]*2;if(Pa[i]>=1){Pa[i]=Pa[i]-1;c[i][k]='1';}else{c[i][k]='0';}}}for(i=0;i<n;i++){for(k=0;k<l[i];k++)printf("%c",c[i][k]);printf("\n");}}五、实验结果:。

香农编码的原理 -回复

香农编码的原理 -回复

香农编码的原理-回复香农编码,也被称为经典编码或香农-福斯特编码,是一种用于无失真数据压缩的编码方法,由克劳德·香农于1948年提出。

该编码方法可以将信息通过二进制数据流传输,以尽可能少的比特数来表示。

为了理解香农编码的原理,需要先了解信息理论的一些基本概念。

首先是信息的概率和信息量。

信息的概率指的是某个事件发生的概率;而信息量是一种度量,表示以二进制形式表示的信息所需要的比特数。

根据信息量的定义,信息量与事件发生的概率成反比。

在香农编码中,我们将每个字符映射到一个唯一的二进制序列,以尽可能少的比特数来表示。

这个序列由两部分组成:前缀码和编码字。

前缀码是一种特殊的编码形式,其中没有任何一个编码字是另一个编码字的前缀。

这样可以确保在解码时不会出现歧义。

那么,如何构建香农编码呢?下面是一步一步的过程:1. 统计字符的出现频率:首先,对待编码的字符进行统计,计算每个字符在信息中出现的频率。

频率越高的字符,其信息量越小,因为它们出现的概率高。

2. 构建概率分布表:将字符按照出现频率的顺序排列,并计算每个字符的出现概率。

概率分布表的目的是为了确定每个字符在编码中所占的比特数。

3. 构建编码树:通过概率分布表,构建一棵编码树。

在构建编码树时,将概率最小的两个字符进行合并,形成一个新的节点,该节点的概率为这两个字符的概率之和。

重复这个过程,直到所有的字符都合并成一个节点。

4. 分配编码字:在编码树的每个分支上分配编码字。

一般来说,向左分支分配0,向右分支分配1。

将编码树中每个叶子节点的编码字串联起来,就是每个字符的编码。

5. 编码和解码:使用构建好的编码对信息进行编码。

在解码时,通过比较编码串与编码表中的编码,逐个识别并解码字符。

香农编码的优点在于,可以根据不同字符的频率分配变长的编码,减小了信息的传输成本。

在统计学上,香农编码接近于理论上的信息上限,即信息熵。

同时,通过构建前缀码,可以确保在解码时不会出现二义性。

香农编码实验报告

香农编码实验报告

中南大学《信息论与编码》实验报告目录一、香农编码 (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年香农在《有噪声时的通信》一文中提出了信道容量的概念和信道编码定理,为信道编码奠定了理论基础。

信息论实验报告香农编码

信息论实验报告香农编码

目录实验目的: (2)实验要求: (2)程序算法: (2)程序运行结果: (4)程序操作步骤: (5)试验中遇到的困难及解决方法: (5)实验心得及体会: (5)实验目的:1.进一步熟悉使用C++编程语言及软件。

2.进一步认识shannon编码过程,并能在学习中灵活运用。

实验要求:要求:(a) 允许使用的编程语言:C、C++、Basic、Pascal、Fortran、Java、Perl、Tk/Tcl(b) 输入:信源符号个数q、信源符号s0,...,sq−1,信源概率分布p0,...,pq−1。

(c) 输出:信源符号与码字的对应关系表(编码表)。

(d) 源程序格式整齐清晰,注释简单明了。

程序算法:(a) 将q 个信源符号按其概率的递减次序排列:p(s0) > p(s1) > ... > p(sq−1)(b) 计算出各个信源符号的累加概率:(c) 按下式计算第i 个消息的二元代码组的码长li:(d) 将累加概率F(si)(十进制小数)变换成二进制小数。

根据码长li 取小数点后li 个二进制符号作为第i 个消息的码字。

程序代码:#include <iostream>#include <math.h>using namespace std;void InsertSort(double r[],char m[] ,int n)//直接插入排序算法按照概率从大到小排列符号和相应概率{for(int i=1;i<n;i++){r[n]=r[i]; //设置哨兵m[n]=m[i]; //设置哨兵for(int j=i-1;(r[n]>r[j])&&(j>=0);j--)//寻找插入位置{r[j+1]=r[j];//记录后移m[j+1]=m[j];//记录后移}r[j+1]=r[n];m[j+1]=m[n];}}void Leijia(double p[], int s)//将当前概率及之前概率相加{for(int r=1;r<s;r++)p[r]=p[r-1]+p[r];}void main(){int geshu,erjinzhi[100][100];int z=0,g=0;double gailv[100],L[100];char fuhao[100];cout<<"请输入需要编码的字符个数(小于100)"<<endl; cin>>geshu;cout<<"请按照先后顺序输入符号"<<endl;for(int i=0;i<geshu;i++)cin>>fuhao[i];cout<<"请输入各相应符号的概率"<<endl;for(int j=0;j<geshu;j++)cin>>gailv[j];InsertSort( gailv,fuhao, geshu);for(z=0;z<geshu;z++){L[z]=-log(gailv[z])/log(2);L[z]=ceil(L[z]);//向上取整求所需要的位数}Leijia( gailv, geshu);for( z=0;z<geshu;z++)//求相应的二进制编码{gailv[z]=gailv[z]-floor(gailv[z]);for( g=0;g<L[z];g++){if((gailv[z]*2)>=1){erjinzhi[z][g]=1;gailv[z]=(gailv[z]*2)-1;}else{erjinzhi[z][g]=0;gailv[z]=gailv[z]*2;}}}cout<<"各信源符号及相应码字分别为"<<endl; for(z=0;z<geshu;z++){cout<<fuhao[z]<<'\t';for( g=0;g<L[z];g++)cout<< erjinzhi[z][g];cout<<endl;}}程序运行结果:程序操作步骤:1.按照提示输入所要编码的符号个数并回车2.按顺序输入要求个数的符号并回车3.按顺序输入各符号相应的概率并回车4.即可得到各符号相应的shannon编码试验中遇到的困难及解决方法:本次试验相对而言比较简单,但由于长时间没有联系C++语言有些生疏。

香农编码计算简单例题

香农编码计算简单例题

香农编码计算简单例题香农编码是一种无损数据压缩算法,它通过为出现频率较高的符号分配较短的编码,而为出现频率较低的符号分配较长的编码,从而实现对数据进行压缩。

下面我将给出一个简单的例题来说明香农编码的计算过程。

假设我们有一个消息,由以下5个符号组成,A、B、C、D、E。

它们的出现频率分别是,A(0.4)、B(0.3)、C(0.2)、D(0.08)、E(0.02)。

首先,我们需要按照出现频率从高到低对符号进行排序:1. A(0.4)。

2. B(0.3)。

3. C(0.2)。

4. D(0.08)。

5. E(0.02)。

然后,我们为每个符号分配一个二进制编码。

编码的长度取决于符号的出现频率,频率越高,编码越短。

接下来,我们按照以下步骤计算香农编码:1. 将频率最高的符号A分配一个初始编码0。

2. 计算下一个符号B的编码。

由于A的编码长度为1,我们将B的编码设置为A的编码加上1,即编码为10。

3. 接着计算符号C的编码。

C的频率为0.2,小于A和B的频率之和(0.4+0.3=0.7),所以C的编码长度应为2。

C的编码为B的编码加上1,即编码为11。

4. 然后计算符号D的编码。

D的频率为0.08,小于A、B和C的频率之和(0.4+0.3+0.2=0.9),所以D的编码长度应为3。

D的编码为C的编码加上1,即编码为111。

5. 最后计算符号E的编码。

E的频率为0.02,小于A、B、C和D的频率之和(0.4+0.3+0.2+0.08=0.98),所以E的编码长度应为3。

E的编码为D的编码加上1,即编码为1111。

最终,我们得到了每个符号的香农编码:A: 0。

B: 10。

C: 11。

D: 111。

E: 1111。

这样,我们就完成了对给定消息的香农编码计算。

需要注意的是,香农编码是一种理想情况下的编码方案,它假设消息中的符号是独立且符合特定的概率分布。

在实际应用中,可能会存在一些特殊情况需要进行调整。

此外,为了保证解码的正确性,编码和解码的过程需要进行同步。

香农编码_??????

香农编码_??????

香农编码
香农编码(Shannon coding)是一种基于信息论的无失真压缩算法。

它由克劳德·香农于1948年提出,是一种前缀
编码方法,用于将一串符号串压缩成更短的编码串。

香农编码的基本思想是根据符号的出现概率分配不同长度
的编码。

出现概率高的符号分配较短的编码,出现概率低
的符号分配较长的编码。

这样,编码串的平均长度就可以
降低,实现了数据的无失真压缩。

具体的步骤如下:
1. 计算每个符号的出现概率。

2. 按照概率从高到低对符号进行排序。

3. 给较高概率的符号分配较短的编码,较低概率的符号分
配较长的编码。

可以使用二叉树进行编码,每个符号对应
树上的一个叶子节点,编码为从根节点到叶子节点的路径。

4. 根据编码生成压缩后的编码串。

由于香农编码是一种无失真压缩算法,可以保证压缩后的数据能够完全恢复成原始数据。

然而,香农编码会导致编码长度不固定,需要附加一些额外的信息来标识编码的边界,这会增加一定的开销。

为了解决这个问题,后续发展出了其他压缩算法,如哈夫曼编码。

信息论课程实验报告—Shannon编码

信息论课程实验报告—Shannon编码

: 六、实验器材(设备、元器件) 实验器材(设备、元器件)
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 香农码,并求其平均码长和编码效率。
else k[i]=temp+1; } } void code(int *k,double *pa,string *str,int n) { for(int i=0;i<n;i++) { double s=pa[i]; for(int j=0;j<k[i];j++) { s=2*s; if(s>=1) { str[i]+="1"; s=s-1; } else str[i]+="0"; } } } void main() { int n; cout<<"信源符号个数 n= "; cin>>n; double *p=new double[n]; cout<<"信源符号的概率依次为(以回车表示概率的结束): "; for(int i=0;i<n;i++) { cin>>p[i]; } bubble(p,n); double *pa=new double[n]; leijia(p,pa,n); int *k=new int[n]; length(p,k,n); string *str=new string[n]; code(k,pa,str,n); cout<<setw(10)<<"pa(i)"<<setw(10)<<"Pa(a,j)"<<setw(10)<<"Ki"<<setw(10)<<"码字"<<endl; for(i=0;i<n;i++) { cout<<setw(10)<<p[i]<<setw(10)<<pa[i]<<setw(10)<<k[i]<<setw(10)<<str[i]<<endl; } }

香农编码

香农编码
for(int i=0;i<f;i++)
cin>>p[i];
}
排序函数:void sort(double p[])
{
double t;
for (int i=0;i<f;i++)
{
for(int j=f-1;j>i;j--)
{
if (p[j]>p[j-1])
{t=p[j];p[j]=p[j-1];p[j-1]=t;}
{
x=pp[i];
for(int m=1;m<l[i]+1;m++)
{
x=x*2.0;
if(x>=1.0){c[j]=1;x=x-1.0;}
else{c[j]=0;}
j++;
}
}
}
输出函数:
void output(int l[],int c[],double p[],double pp[])
{
int m=0;
cout<<endl;
m=m+j;
}}
求解结果:
例5.1.2的求解结果
五、总结
一上机才发现,自己C和C++又该复习了,主要是很多语法怎么使用都记不太清楚了,但是以前通过复习的资料,自己还是很快很够把握一些基本的知识了,所以编写程序不是特别的难了,对于香农编码而言,主要是弄清楚各个步骤,像求码长、累加和、概率排序,每个模块建立一个函数,使得程序简单易读,自己的思路也更清晰明了。编码的原理我们都很清楚,主要就是在一些C和C++基本知识上的巩固才能做好这次的实验。
二进制香农编码的步骤如下:(1)、将信源符号按概率从大到小的顺序排列(2)、对第j个前的概率进行累加得到pa(aj)(3)、由-logp(ai) ki<1-logp(ai)求得码字长度ki (4)、将pa(aj)用二进制表示,并取小数点后ki位作为符号ai的编码。

香农编码定理

香农编码定理

香农编码定理香农编码定理是一种信息论中的定理,它描述了在给定一系列符号和它们出现的概率的情况下,如何设计一个最优的编码方案。

这个定理由克劳德·香农在1948年提出,并被认为是信息论的基石之一。

在现代通信中,信息的传输、存储和处理是非常重要的。

编码是其中的一个关键环节,而编码的目的是将信息转化为二进制(或其他进制)形式的数据。

例如,将人类语言转化为可以被计算机理解的形式,或者将数字音乐文件压缩为更小的文件格式。

香农编码定理的核心思想是用更少的比特数来代表一个出现频率较高的符号,用更多的比特数来代表一个出现较低的符号。

这样做能够达到节省存储和传输空间的目的。

这个编码方案是通过构建一颗二叉树来实现的。

在这个二叉树中,每一个叶子节点代表一个符号,而从根节点到叶子节点路径上的编码实际就是用0和1来表示符号出现的频率。

假设有n个符号,每一种符号的出现概率分别为p1、p2、p3......pn。

通过香农编码定理,可以得到一个最优的编码方案,使得整个编码的长度最短。

这个最优的编码方案可以表示为H(S)≤L(S)≤H(S)+1,其中H(S)是符号熵,L(S)是这个编码的平均长度。

符号熵(也称为信息熵)指的是每一个符号所能够传递的信息的平均值,它可以用公式E=-Σi=1 to np(i) log2p(i)来计算,其中p(i)代表第i种符号的概率。

符号熵是香农编码定理的核心概念,它表示了一个平均的信息量,即需要多少比特来表示一个符号的信息。

通过香农编码定理,我们可以得出一个最优的编码方案,即每一个符号的编码长度都是整数位的比特数。

这个编码方案可以用于压缩数据,使得数据传输的速度更快,同时也可以节省存储空间。

总之,香农编码定理在现代通信和计算机科学中具有非常重要的作用,它为我们提供了一种最优的编码方案,使得数据能够被更加高效地传输和处理。

信息论与编码基础--香浓三大定理

信息论与编码基础--香浓三大定理

香农三大定理 简介
H(S) = H(3/4,1/4) = 0.811(bit/sign)
N=1
L1 = 1 (code/sign) H (S ) R1 = = 0.811 (bit/code) L1 H (S ) η1 = = 0.811 L1 ⋅ log 2
信息论与编码基础
例:二元DMS进行无失真编码
香农三大定理 简介
单词间隔 —————— 000000
{A,B,…,Z}
二进符号
信源编码器I
码符号集{点/划/字母间隔/单词间隔}
信源编码器II
码符号集{0,1}
信息论与编码基础
1、信源编码器 b、举例
3)中文电报信源编码器 “中”
“0022”
香农三大定理 简介
“01101 01101 11001 11001”
H ( S ) 1 LN H ( S ) + > ≥ log r N N log r
信息论与编码基础
香农三大定理 简介
2、香农第一定理(可变长无失真信源编码定理)
且当 N → ∞ 时有: lim
N →∞
LN H ( S ) = = H r (S) N log r
表述二:若R′>H(S),就存在惟一可译变长编码;若R′<H(S),
s1 S P( s) = 3 4 s2 1 4
香农三大定理 简介
H(S) = H(3/4,1/4) = 0.811(bit/sign)
{0,10,110,111}
N=2 L2 = 1.688 (code/2-sign) H (S ) R2 = = 0.961 (bit/code) L2 / 2 H (S ) η2 = = 0.961 L2 / 2 ⋅ log 2

信息论实验四香农编码

信息论实验四香农编码

信息论实验四香农编码实验四香农编码1、实验目的:掌握香农编码的方法2、实验内容:对信源进行二进制香农编码。

并计算其平均码长,信源熵,和编码效率。

三、实验步骤(1)将信源符号按概率从大到小的顺序排列。

(2)用Pa(i)表示第i个码字的累加概率(3)确定满足下列不等式的整数K(i),并令K(i)为第i个码字的长度(4)将Pa(i)用二进制表示,并取小数点后K(i)位最为a(i)的编码四、实验数据及结果分析(1)将信源符号按概率从大到小的顺序排列。

0.25 0.2 0.15 0.1 0.05);(2)用Pa(i)表示第i个码字的累加概率。

0 0.2500 0.5000 0.7000 0.8500 0.9500)(3)确定满足下列不等式的整数K(i)。

2 3 3 4 5)(4)将Pa(i)用二进制表示,并取小数点后K(i)位最为a(i)的编码0001100101110111110(5)计算其平均码长,信源熵,和编码效率平均码长 L=2.7信源熵 H=2.4232编码效率 xiaolv=0.89749五、代码附录N=input('N='); %输入信源符号的个数s=0;L=0;H=0;Pa=zeros(1,6);for i=1:NP(i)=input('P=');%输入信源符号概率分布 s=s+P(i); endif s~=1error('不符合概率分布');endP=sort(P,'descend');Pa(1)=0;for i=2:NPa(i)=Pa(i-1)+P(i-1);enddisp(Pa);for i=1:Na=-log2(P(i));if mod(a,1)==0 %计算第i个码字的长度 K(i)=a; elseK(i)=fix(a+1);endL=L+P(i)*K(i); %计算平均码长H=H-P(i)*log2(P(i));%计算信源熵Endxiaolv=H/L; %计算编码效率for i=1:Nfor j=1:K(i)W(i,j)=fix(Pa(i)*2);Pa(i)=Pa(i)*2-fix(Pa(i)*2);fprintf('%d',W(i,j));endfprintf('\n');end6,实验总结:通过该实验,掌握了香农编码。

信息论与编码实验——香浓编码C语言程序

信息论与编码实验——香浓编码C语言程序

#include<stdio.h>#include<math.h>void main(){int n=4,t[4],tt[4],i;//定义个变量,其中k[100]是储存码长的数组,tt[100]是储存码字的数组double A[4],I[4];//p[100]是储存概率的数组,A[100]是储存累加和的数组,I[100]是储存自信息量的数组double sum,m,d;double p[4]={0.5,0.1,0.1,0.3};for(i=1;i<n+1;i++){int r=i-1;for(int j=i;j<n+1;j++){if(p[j]>p[r]){ r=j;m=p[i-1];p[i-1]=p[r];p[r]=m;}}}printf("信源符号按概率从大到小排列为:\n");for(i=0;i<n;i++)printf("%f/",p[i]);printf("\n");//求累加和for(i=0;i<n;i++){A[-1]=p[-1]=0.0;A[i]=A[i-1]+p[i-1];}printf("信源符号的累加和为:\n");for(i=0;i<n;i++)printf("%f/",A[i]);printf("\n");//求自信息量for(i=0;i<n;i++){I[i]=(-1)*(log(p[i])/log(2));}printf("各个信源符号的自信息量为:") ; // cout<<"各个信源符号的自信息量为:"<<endl;for(i=0;i<4;i++)printf("%f/",I[i]); //cout<<I[i]<<" ";printf("\n");//cout<<endl;for(i=0;i<4;i++){if(I[i]==(int)I[i])t[i]=I[i];else if(I[i]!=(int)I[i])t[i]=(int)I[i]+1;printf("%d ",t[i]);}printf("\n");//求码字for( i=0;i<4;i++){d=A[i];for(int j=0;j<n;j++){if(d<=0.5){if(d==int(d))d=0;elsed=d*2;tt[j]=int(d);}else if(d>0.5){if(d==int(d))d=0;elsed=(d-int(d))*2;tt[j]=int(d);}}printf("编码为");for(j=0;j<t[i];j++)printf("%d",tt[j]);printf("\n");}}。

信息论与编码实验四

信息论与编码实验四

信息论与编码实验四
实验4huffman编码对英文文本的压缩和解压缩
一、实验内容
根据信源放大编码――huffman编码的原理,制作对英文文本展开放大和解压缩的软件。

建议软件存有直观的用户界面,软件能对运转的状态分解成报告,分别就是:字符频率统计数据报告、编码报告、放大程度信息报告、码表存储空间报告。

二、实验环境
1.计算机
2.windows2000或以上
3.microsoftoffice2000或以上
4.vc++6.0三、实验目的
1.掌握huffman编码的原理
2.掌控vc研发环境的采用(尤其就是程序调试技巧)
3.掌控c语言编程(尤其就是位运算和文件的操作方式)
4.掌控数据结构的内容:链表、顺序表中、堆栈、最优二叉树
5.掌控结构化程序分析和研发的软件工程原理四、实验建议
1.提前预习实验,认真阅读实验原理。

2.深入细致高效率的顺利完成实验,实验过程中顺从实验室管理人员以及实验指导旧
师的管理。

3.深入细致核对实验报告。

五、实验原理
压缩/解压缩流程
放大流程:
读取扫描文本文件――〉统计字符频率――〉生成码字――〉保存压缩文件解压缩流程:
加载读取压缩文件――〉抽取字符频率――〉分解成码树――〉留存文本文件六、参考书
1.《信息论――基础理论及应用》傅祖芸,电子工业出版社
2.《数据结构》,清华大学出版社。

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

实验四 香农编码
一、实验目的:
掌握香农编码的方法
二、实验内容:
对信源123456,,,,,()0.250.250.020.150.10.05a a a a a a X P X ⎧⎫⎛⎫=⎨⎬ ⎪⎝⎭⎩⎭
进行二进制香农编码。

并计算其平均码长,信源熵,和编码效率。

三、实验步骤
(1)将信源符号按概率从大到小的顺序排列。

(2)用Pa (i )表示第i 个码字的累加概率
(3)确定满足下列不等式的整数K (i ),并令K (i )为第i 个码字的长度
22log ()()1log ()Pa i K i Pa i -≤<-
(4)将Pa (i )用二进制表示,并取小数点后K (i )位最为a (i )的编码
四、实验数据及结果分析
(1)将信源符号按概率从大到小的顺序排列。

P=(0.25 0.25 0.2 0.15 0.1 0.05);
(2)用Pa (i )表示第i 个码字的累加概率。

Pa=(0 0.2500 0.5000 0.7000 0.8500 0.9500)
(3)确定满足下列不等式的整数K (i )。

K=(2 2 3 3 4 5)
(4)将Pa (i )用二进制表示,并取小数点后K (i )位最为a (i )的编码
00
01
100
101
1101
11110
(5)计算其平均码长,信源熵,和编码效率
平均码长 L=2.7
信源熵H=2.4232
编码效率xiaolv=0.89749
五、代码附录
N=input('N='); %输入信源符号的个数
s=0;L=0;H=0;
Pa=zeros(1,6);
for i=1:N
P(i)=input('P=');%输入信源符号概率分布
s=s+P(i);
end
if s~=1
error('不符合概率分布');
end
P=sort(P,'descend');
Pa(1)=0;
for i=2:N
Pa(i)=Pa(i-1)+P(i-1);
end
disp(Pa);
for i=1:N
a=-log2(P(i));
if mod(a,1)==0 %计算第i个码字的长度
K(i)=a;
else
K(i)=fix(a+1);
end
L=L+P(i)*K(i); %计算平均码长
H=H-P(i)*log2(P(i));%计算信源熵
End
xiaolv=H/L; %计算编码效率
for i=1:N
for j=1:K(i)
W(i,j)=fix(Pa(i)*2);
Pa(i)=Pa(i)*2-fix(Pa(i)*2);
fprintf('%d',W(i,j));
end
fprintf('\n');
end
六,实验总结:
通过该实验,掌握了香农编码。

其中对于小数二进制的转换更是有了深刻的
了解。

由编码效率的值可知,其编码效率并不是很高,当不等式
22log ()()1log ()Pa i K i Pa i -≤<-左边的等号成立时,
香农编码有很高的编码效率。

相关文档
最新文档