信息论编码实验四香农编码

合集下载

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

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

信息论霍夫曼、香农-费诺编码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和编码放在一个二维矩阵中,但具体的实现较为复杂,所以最后改为逐行存放并成功完成了实验。

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

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

信息论与编码课程设计报告设计题目:统计信源熵与香农编码专业班级电信 12-06学号学生指导教师教师评分2021年 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语言的结合中没有清晰的思路,具体实现程序语言的编写较为困难。

在程序的调试中出现的问题无法及时快速的解决,有些错误甚至无法找到适宜的解决方法,以至于不断的修改程序,浪费了大量的时间。

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

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

信息论与编码课程大作业题目:香农编码学生姓名:******学号:&**********专业班级:*******************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)函数图。

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

实验四-香农编码

实验四-香农编码

海南大学信息科学技术学院信息安全专业《信息论与编码》实验报告一、 实验目的:了解掌握香农编码二、 实验环境: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");}}五、实验结果:。

中南大学信息论与编码编码部分实验报告

中南大学信息论与编码编码部分实验报告

信息论与编码编码部分实验报告课程名称:信息论与编码实验名称:关于香农码费诺码Huffman码的实验学院:信息科学与工程学院班级:电子信息工程1201姓名:viga学号:指导老师:张祖平日期:2014年1月3日目录⊙实验目的及要求1.1 实验目的 (4)1.2 开发工具及环境 (4)1.3 需求分析与功能说明 (4)⊙实验设计过程2.1 用matlab实现香农码、费诺码和Huffman编码2.1.1 说明 (6)2.1.2 源代码 (7)2.1.3 运行结果(截图) (19)2.2 用C\C++ 实现香农码2.2.1 说明 (22)2.2.2 源代码 (23)2.2.3 运行结果(截图) (26)2.3 用C\C++ 实现Huffman码2.3.1 说明 (26)2.3.2 源代码 (29)2.3.3 运行结果(截图) (36)2.4 用C\C++ 实现费诺码2.4.1 说明 (37)2.4.2 源代码 (37)2.4.3运行结果结果(截图) (40)⊙课程设计总结 (42)⊙参考资料4.1 课程设计指导书 (43)实验目的及要求1.1 实验目的1.掌握香农码、费诺码和Huffman编码原理和过程。

2.熟悉matlab软件的基本操作,练习使用matlab实现香农码、费诺码和Huffman编码。

3.熟悉C/C++语言,练习使用C/C++实现香农码、费诺码和Huffman编码。

4.应用Huffman编码实现文件的压缩和解压缩。

1.2 开发工具及环境MATLAB 7.0、wps文字、红精灵抓图精灵2010Windows7 系统环境1.3 需求分析与功能说明1、使用matlab实现香农码、费诺码和Huffman编码,并自己设计测试案例。

2、使用C\C++实现香农码、费诺码和Huffman编码,并自己设计测试案例。

3、可以用任何开发工具和开发语言,尝试实现Huffman编码应用在数据文件的压缩和解压缩中,并自己设计测试案例。

香农编码实验报告

香农编码实验报告

中南大学《信息论与编码》实验报告目录一、香农编码 (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++语言有些生疏。

香农编码

香农编码

temp=P[i]; P[i]=P[i+1]; P[i+1]=temp; } } for(int i=0;i<6;i++) cout<<P[i]<<" "; cout<<endl; for(i=0;i<6;i++) { Pax[0]=0.0; Pax[i+1]=Pax[i]+P[i]; } cout<<"概率累加和为:"<<endl; for(i=0;i<6;i++) cout<<Pax[i]<<" "; cout<<endl; for(i=0;i<6;i++) { double m=log(1/P[i])/log(2); if(m-int(m)==0) machang[i]=log(1/P[i])/log(2); else machang[i]=int(m)+1; cout<<P[i]<<"的码长为:"<<machang[i]<<endl; } for(i=0;i<6;i++) { for(int j=0;j<machang[i];j++) { int n=int(Pax[i]*2); cout<<n; if((Pax[i]*2-1)>0) { Pax[i]=Pax[i]*2-1; continue; } if((Pax[i]*2-1)==0) Pax[i]=Pax[i]*2-1; else Pax[i]=Pax[i]*2; } cout<<endl; }

香农编码_??????

香农编码_??????

香农编码
香农编码(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种符号的概率。

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

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

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

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

信息论与编码实验指导书

信息论与编码实验指导书

没实验一 绘制二进熵函数曲线(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 nX H a p H p p p p x p x p X H p p p x x X P X ii i λλλλ-+≥-+≤=--+-=-=≤≤⎩⎨⎧⎭⎬⎫-===⎥⎦⎤⎢⎣⎡∑四、实验内容:用Excel 或Matlab 软件制作二进熵函数曲线。

具体步骤如下: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。

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

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

香农三大定理 简介
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,实验总结:通过该实验,掌握了香农编码。

信息论与编码实验四

信息论与编码实验四

实验4 Huffman编码对英文文本的压缩和解压缩
一、实验内容
根据信源压缩编码——Huffman编码的原理,制作对英文文本进行压缩和解压缩的软件。

要求软件有简单的用户界面,软件能够对运行的状态生成报告,分别是:字符频率统计报告、编码报告、压缩程度信息报告、码表存储空间报告。

二、实验环境
1.计算机
2.Windows 2000 或以上
3.Microsoft Office 2000 或以上
4.VC++ 6.0
三、实验目的
1.掌握Huffman编码的原理
2.掌握VC开发环境的使用(尤其是程序调试技巧)
3.掌握C语言编程(尤其是位运算和文件的操作)
4.掌握数据结构的内容:链表、顺序表、堆栈、最优二叉树
5.掌握结构化程序分析和开发的软件工程原理
四、实验要求
1.提前预习实验,认真阅读实验原理。

2.认真高效的完成实验,实验过程中服从实验室管理人员以及实验指导老
师的管理。

3.认真填写实验报告。

五、实验原理
压缩/解压缩流程
压缩流程:
解压缩流程:
六、参考书
1.《信息论——基础理论及应用》傅祖芸,电子工业出版社
2.《数据结构》,清华大学出版社。

信道的香农极限 编码方式

信道的香农极限 编码方式

信道的香农极限编码方式题目:[信道的香农极限编码方式]一、引言在信息传输过程中,信道是起到承载和传递信息的媒介。

然而,信道本身会带来噪声和干扰,从而导致信息传输的错误和丢失。

为了有效地传输信息,我们需要合适的编码方式来克服信道的限制。

本文将围绕着信道的香农极限以及相关的编码方式展开讨论。

二、信道的香农极限香农极限是由信息论的奠基人克劳德·香农于1948年提出的。

它是指在给定信道带宽和信噪比条件下,信息传输速率的上限。

换句话说,信道的香农极限表明了我们能够在理论上达到的最大传输速率。

信道的香农极限由信道容量来衡量,通常以比特每秒(bps)作为单位。

信道容量取决于信道带宽和信噪比,其计算公式为C = B * log₂(1 + S/N)。

其中,C 代表信道容量,B是信道的带宽(单位为Hz),S是信号的信号功率,N是噪声功率。

三、编码方式为了达到信道的香农极限,我们需要合适的编码方式来提高信息传输的可靠性。

在这一部分,将介绍几种常用的编码方式。

1. 香农编码香农编码是一种可实现信道容量的编码方式。

它利用了信息源的统计特性,通过改变信息的表示方法以及出现次数,将原始信息转换成更适合在信道上传输的编码。

这种编码方式在没有噪声干扰的理想信道中能够实现无差错传输。

2. 罗杰斯-哈特利编码罗杰斯-哈特利编码是一种基于差错纠正码的编码方式。

它通过添加冗余信息来实现对传输数据的差错检测和纠正,从而提高传输的可靠性和稳定性。

这种编码方式常用于无线通信和数字存储领域。

3. 卷积编码卷积编码是一种基于状态机的编码方式。

它利用状态机的状态转移来将输入信息转换为输出码字,并在输出中添加冗余信息。

卷积编码具有较好的误码性能和抗干扰性能,广泛应用于数字通信系统中。

4. 奇偶校验码奇偶校验码是一种最简单的差错检测编码方式。

它通过在传输数据的末尾添加一个奇偶位来实现对传输数据的差错检测。

然而,奇偶校验码只能检测出奇数个比特的差错,无法纠正差错。

信息论编码实验四香农编码

信息论编码实验四香农编码

实验四 香农编码一、实验目的1、理解香农编码的概念。

2、掌握香农编码的一般算法3、掌握香农编码算法中的二进制编码算法。

4、任意给定一个信源模型,编程实现其二进制香农编码,输出编码结果。

二、实验仪器与软件1、PC 机 1台2、C 语言环境或MATLAB7.0环境三、实验原理(1)输入信源符号以及每个符号对应的出现概率。

(2)对输入的信源符号按概率的大小进行排序。

(3)个码字的累加概率表示第,用令i i j x p x p j a ,1),(0)(0+==(4)令)(log 1)(log 22i i i x p k x p -≤≤-(5)的码字位作为点后的用二进制表示,用小数把i j a x k x p )((6)重复(3)-(5)直到求出所有的码字。

四、实验内容(源代码及实验结果)设输入单符号离散信源{a1, a2,a3,a4,a5, a6 ,a7},出现的概率分别是0.2, 0.19, 0.18, 0.17, 0.15, 0.1, 0.01,编程实现二进制香农编码,输出编码结果。

五、实验小结(对本次实验结果进行分析和总结)1、程序代码:求解给定信源符号概率的香农编码n=input('输入信源符号个数n=')p=zeros(1,n);for i=1:np(1,i)=input('输入信源符号概率:');endif sum(p)<1||sum(p)>1error('输入概率不符合概率分布')endy=fliplr(sort(p));%从大到小的排序D=zeros(n,4);%生成7*4的零矩阵D(:,1)=y';%把y赋给零矩阵的第一列for i=2:nD(1,2)=0;%令第一行第二列的元素为0D(i,2)=D(i-1,1)+D(i-1,2);%第二列其余的元素用此式求得,即为累加概率endfor i=1:nD(i,3)=-log2(D(i,1));%求第三列的元素D(i,4)=ceil(D(i,3));%求第四列的元素,对D(i,3)向无穷方向取最小正整数endDA=D(:,2)';%取出D中第二列元素B=D(:,4)';%取出D中第四列元素for j=1:nC=deczbin(A(j),B(j))%生成码字function [C]=deczbin(A,B)%对累加概率求二进制的函数C=zeros(1,B);%生成零矩阵用于存储生成的二进制数,对二进制的每一位进行操作temp=A;%temp赋初值for i=1:B%累加概率转化为二进制,循环求二进制的每一位,A控制生成二进制的位数temp=temp*2;if temp>=1temp=temp-1;C(1,i)=1;elseC(1,i)=0;endend2、实验小结:本次实验顺利完成。

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

实验四 香农编码
一、实验目的
1、理解香农编码的概念。

2、掌握香农编码的一般算法
3、掌握香农编码算法中的二进制编码算法。

4、任意给定一个信源模型,编程实现其二进制香农编码,输出编码结果。

二、实验仪器与软件
1、PC 机 1台
2、C 语言环境或MATLAB7.0环境
三、实验原理
(1)输入信源符号以及每个符号对应的出现概率。

(2)对输入的信源符号按概率的大小进行排序。

(3)个码字的累加概率表示第,用令i i j x p x p j a ,1),(0)(0+==
(4)令)(log 1)(log 22i i i x p k x p -≤≤-
(5)的码字位作为点后的用二进制表示,用小数把i j a x k x p )(
(6)重复(3)-(5)直到求出所有的码字。

四、实验内容(源代码及实验结果)
设输入单符号离散信源{a1, a2,a3,a4,a5, a6 ,a7},出现的概率分别是0.2, 0.19, 0.18, 0.17, 0.15, 0.1, 0.01,编程实现二进制香农编码,输出编码结果。

五、实验小结(对本次实验结果进行分析和总结)
1、程序代码:
求解给定信源符号概率的香农编码
n=input('输入信源符号个数n=')
p=zeros(1,n);
for i=1:n
p(1,i)=input('输入信源符号概率:');
end
if sum(p)<1||sum(p)>1
error('输入概率不符合概率分布')
end
y=fliplr(sort(p));%从大到小的排序
D=zeros(n,4);%生成7*4的零矩阵
D(:,1)=y';%把y赋给零矩阵的第一列
for i=2:n
D(1,2)=0;%令第一行第二列的元素为0
D(i,2)=D(i-1,1)+D(i-1,2);%第二列其余的元素用此式求得,即为累加概率
end
for i=1:n
D(i,3)=-log2(D(i,1));%求第三列的元素
D(i,4)=ceil(D(i,3));%求第四列的元素,对D(i,3)向无穷方向取最小正整数
end
D
A=D(:,2)';%取出D中第二列元素
B=D(:,4)';%取出D中第四列元素
for j=1:n
C=deczbin(A(j),B(j))%生成码字
function [C]=deczbin(A,B)%对累加概率求二进制的函数
C=zeros(1,B);%生成零矩阵用于存储生成的二进制数,对二进制的每一位进行操作
temp=A;%temp赋初值
for i=1:B%累加概率转化为二进制,循环求二进制的每一位,A控制生成二进制的位数temp=temp*2;
if temp>=1
temp=temp-1;
C(1,i)=1;
else
C(1,i)=0;
end
end
2、实验小结:
本次实验顺利完成。

这次的实验主要是针对香农编码,通过这次的实验我进一步理解了香农编码的概念同事也掌握香农编码的一般算法和香农编码算法中的二进制编码算法。

一开始做实验的时候,如果任意给定一个信源模型,要求编程实现其二进制香农编码,输出编码结果对我而言有很大的难度,但是通过这次的实验,这些操作对我而言驾轻就熟不在话下了。

这次实验让我学到了很多,很有意义。

相关文档
最新文档