文档库 最新最全的文档下载
当前位置:文档库 › 费诺编码的matlab实现

费诺编码的matlab实现

费诺编码的matlab实现
费诺编码的matlab实现

信息论与编码实验费诺编码的matlab实现

学院:----

班级:----

姓名:----

学号:----

摘要:

用预先规定的方法将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机、电视、遥控和通讯等方面广泛使用。其中费诺编码有广泛的应用,通过本次实验,了解编码的具体过程,通过编程实现编码,利用matlab实现费诺编码。

关键字:信息论,费诺编码,matlab

正文:

费诺编码也是一种常见的信源编码方法。信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同,并各赋于一个二元码符号”0”和”1”.然后,将每一大组的信源符号再分成两组,使同一组的两个小组的概率和近于相同,并又分别赋予一个二元码符号.依次下去,直至每一个小组只剩下一个信源符号为止.这样,信源符号所对应的码符号序列则为编得的码字.

费诺编码的matlab实现

编码如下:

clc;

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:n

B(i,1)=A(i);%生成B的第1列

end

%生成B第2列的元素

a=sum(B(:,1))/2;

for k=1:n-1

if abs(sum(B(1:k,1))-a)<=abs(sum(B(1:k+1,1))-a)

break;

end

end

for i=1:n%生成B第2列的元素

if i<=k

B(i,2)=0;

else

B(i,2)=1;

end

end

%生成第一次编码的结果

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:n

if x==-1

break;

else

if B(q,j-1)==x

y=1;

continue;

else

y=0;

break;

end

end

end

if y==1

q=q+1;

end

if q==p|q-p==1

B(p,j)=-1;

else

if q-p==2

B(p,j)=0;

END(p)=[char(END(p)),'0'];

B(q-1,j)=1;

END(q-1)=[char(END(q-1)),'1'];

else

a=sum(B(p:q-1,1))/2;

for k=p:q-2

if abs(sum(B(p:k,1))-a)<=abs(sum(B(p:k+1,1))-a);

break;

end

end

for i=p:q-1

if i<=k

B(i,j)=0;

END(i)=[char(END(i)),'0'];

else

B(i,j)=1;

END(i)=[char(END(i)),'1'];

end

end

end

end

p=q;

end

C=B(:,j);

D=find(C==-1);

[e,f]=size(D);

if e==n

j=0;

else

j=j+1;

end

end

B

A

END

for i=1:n

[u,v]=size(char(END(i)));

L(i)=v;

end

avlen=sum(L.*A)

实验总结:

信息论与编码实验程序与结果图(matlab)

信源熵实验程序: clc; close all; clear; linwidd=1 fontt=20 p0=0; pd=1; N=20 p=linspace(p0,pd,N); I=-log2(p); plot(p,I,'k'); title('I=-log2(p)函数图'); xlabel('p');ylabel('I'); clc; close all; clear; linwidd=1 fontt=20 p0=0; pd=1; N=20 p=linspace(p0,pd,N); H=-p.*log2(p)-(1-p).*log2(1-p); plot(p,H,'k'); title('H=-p.*log2(p)-(1-p).*log2(1-p)函数图'); xlabel('p');ylabel('H'); 信道容量实验程序: clc; close all; clear; linwidd=1 fontt=20 p0=0; pd=1; N=20 p=linspace(p0,pd,N); r=4 c=log2(r)+(1-p).*log2(1-p)+p.*log2(p/(r-1)); plot(p,c,'k'); title('强对称信道容量数值模拟图');

有噪信道编码--费诺不等式程序:结果图clc;close all;clear; r=3;p0=0.00001;pd=0.99999;N=2000; p=linspace(p0,pd,N); q=1-p; H=-p.*log2(p)-q.*log2(q); hold on HH=H+p.*log2(r-1) title('费诺不等式示意图');box on xlabel('PE'); ylabel('H(X/Y)'); plot(p,HH,'k:') hold on hold on fill([p,1],[HH,0],[0.6,0.6,0.6]) stem((r-1)/r,1.59,'--.r') text(0.66,1.6,'最大值') 香农编码程序: clc;clear all;close all; p=[0.2 0.19 0.18 0.17 0.15 0.1 0.01]; if sum(p)<1||sum(p)>1 error('输入概率不符合概率分布') end [p index]=sort(p,'descend'); n=length(p); pa=zeros(n,1); for ii=2:n pa(ii)=pa(ii-1)+p(ii-1); end k=ceil(-log2(p));%码字长度计算 c=cell(1,n);%生成元胞数组,用来存不同长度的码字 for ii=1:n c{ii}=''; tmp=pa(ii); for jj=1:k(ii) tmp=tmp*2; if tmp>=1 tmp=tmp-1; %c{ii}{jj}='1'; c{ii}=[char(c{ii}),'1']; else %c{ii}{jj}='0'; c{ii}=[char(c{ii}),'0']; end end end c(index)=c;%换回原来的顺序 codelength=zeros(1,n);%码长初始化 for ii=1:n fprintf(['第',num2str(ii),'个消息对应为']); disp(c{ii});%显示码字 codelength(ii)=length(c{ii});% end n_average=sum(codelength.*p) %平均码长 fprintf('平均码长为');disp(n_average); H=-sum(p.*log2(p)); fprintf('信源熵');disp(H); x=H/(n_average.*log2(2)) fprintf('编码效率');disp(x); figure h=stem(1:n,codelength);% axis([0 n+1 0 n+1]); set(h,'MarkerFaceColor','blue','linewidth',2) 实验结果 第1 个消息对应为000 第2个消息对应为001 第3个消息对应为011 第4个消息对应为100 第5个消息对应为101 第6个消息对应为1110 第7个消息对应为1111110 n_average = 3.1400 平均码长为 3.1400 信源熵 2.6087 x =0.8308 编码效率 0.8308

信息论实验用matlab实现哈夫曼码编译码

信息论与编码基础课程 实验报告 实验名称:Huffman码编译码实验 姓名:学号: 组别:专业: 指导教师:班队: 完成时间:成绩:

Huffman码编译码实验 一.实验目的和要求 熟悉matlab软件编程环境及工具箱,掌握Huffman码编译码方法的基本步骤,利用matlab实现Huffman码的编译码。 二.试验内容和原理 内容:利用matlab编程实现文本的二进制Huffman码的编译码。 任务:构造Huffman树。 原理:在各字符出现概率不均匀的情况下,根据这些概率构造一棵用于编码的Huffman树。它用最短的二进制位表示出现概率最高的字符,而用较长的为表示出现概率低的字符,从而使平均码长缩短,并且保持编码的唯一可译性。三.操作方法和实验步骤 对一随机英文文本文件进行Huffman编译码仿真,给出各个字母的概率,码字,平均信息量,平均码长,编码效率以及编码序列输出。 (一)编码序列获取 使用fopen函数读取.txt文本文件中的数据存储为字符串,使用length获取其长度,使用unique获取字符个数。 (二)获取编码概率矩阵 使用strfind函数获取字符个数并计算各个符号的概率,根据哈夫曼编码原理依次获得各步骤中得到的概率,赋值给概率矩阵,使用find查 找合并概率在的下标并存储到该列的最后一位,如有两个以上优先存储较 大的那个下标。 (三)获取编码矩阵 依据哈夫曼编码原理,根据获取的概率矩阵倒序编码。最后一列直接编码0和1,取出最后一行中记录合并概率下标的数,由于该合并概率在 上一列中肯定在最后两行,故优先编码,在字符串尾部加0和1;剩余编

huffman编码的matlab实现

Huffman编码的matlab实现 一、信源编码介绍 为了减少信源输出符号序列中的剩余度、提高符号的平均信息量,对所施行的变换。具体说,就是针对信源输出符号序列的统计特性来寻找某种方法,把信源输出符号序列变换为最短的码字序列,使后者的各码元所载荷的平均信息量最大,同时又能保证无失真地恢复原来的符号序列。 既然信源编码的基本目的是提高码字序列中码元的平均信息量,那么,一切旨在减少剩余度而对信源输出符号序列所施行的变换或处理,都可以在这种意义下归入信源编码的范畴,例如过滤、预测、域变换和数据压缩等。当然,这些都是广义的信源编码。 一般来说,减少信源输出符号序列中的剩余度、提高符号平均信息量的基本途径有两个:①使序列中的各个符号尽可能地互相独立;②使序列中各个符号的出现概率尽可能地相等。前者称为解除相关性,后者称为概率均匀化。 信源编码的一般问题可以表述如下: 信源编码 若某信源的输出为长度等于M的符号序列集合式中符号A为信源符号表,它包含着K个不同的符号,A={ɑk|k=1,…,K},这个信源至多可以输出K M个不同的符号序列。记‖U‖=KM。所谓对这个信源的输出 信源编码 进行编码,就是用一个新的符号表B的符号序列集合V来表示信源输出的符号序列集合U。若V的各个序列的长度等于 N,即式中新的符号表B共含L个符号,B={b l|l=1,…,L}。它总共可以编出L N个不同的码字。类似地,记‖V‖=LN。为了使信源的每个输出符号序列都能分配到一个独特的码字与之对应,至少应满足关系‖V‖=L N≥‖U‖=KM或者N/M≥log K/log L 下面的几个编码定理,提供了解决这个矛盾的方法。它们既能改善信息载荷效率,又能保证码字唯一可译。 离散无记忆信源的定长编码定理 对于任意给定的ε>0,只要满足条件N/M≥(H(U)+ε)/log L 那么,当M足够大时,上述编码几乎没有失真;反之,若这个条件不满足,就不可能实现无失真的编码。式中H(U)是信源输出序列的符号熵。 信源编码 通常,信源的符号熵H(U)

费诺编码的matlab实现

多媒体技术实验报告 学院:城南学院 姓名:学号: 指导老师:尹波 时间:2015年11月25日 1.实验目的

- 1)掌握费诺编码的思想和具体方法。 2)用MA TLAB语言实现费诺编码。 2.实验原理及编码思想: 费诺编码属于概率匹配编码,但不是最佳的编码方法。在编N进制码时首先将信源消息符号按其出现的概率依次由大到小排列开来,并将排列好的信源符号按概率值分N大组,使N组的概率之和近似相同,并对各组赋予一个N进制码元0、1……N-1。之后再针对每一大组内的信源符号做如上的处理,即再分为概率和相同的N组,赋予N进制码元。如此重复,直至每组只剩下一个信源符号为止。此时每个信源符号所对应的码字即为费诺码。 具体过程如下: [1] 将信源消息符号按其出现的概率大小依次排列:P1>=P2>=…>=Pn。 [2] 依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。 [3] 使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。 [4] 如此重复,直至每个组只剩下一个信源符号为止。 [5] 信源符号所对应的码字即为费诺码。 例:有一幅40个像素组成的灰度图像,灰度共有5级,分别用符号A,B,C,D和E 表示。40个像素中出现灰度A的像素数有15个,出现灰度B的像素数有7个,出现灰度C 的像素数有7个,其余情况见表。

- 费诺编码方法属于概率匹配编码,具有如下特点: 1、概率大,则分解次数小;概率小则分解次数多。这符合最佳码原则。 2、码字集合是唯一的。 3、分解完了,码字出来了,码长也有了,即先有码字后有码长。 因此,费诺编码方法又称为子集分解法。 3. 程序设计思路

matlab的编码大全

附录Matlab源程序 附录A 信息熵 % 函数说明:% % H=entropy(P,r) 为信息熵函数% % P为信源的概率矢量, r为进制数% % H为信息熵% %****************************** % function H=entropy(P,r) 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 H=(sum(-P.*log2(P)))/(log2(r)+eps); 附录B 离散无记忆信道容量的迭代计算 % 信道容量C的迭代算法% % 函数说明:% % [CC,Paa]=ChannelCap(P,k) 为信道容量函数% % 变量说明:% % P:输入的正向转移概率矩阵,k:迭代计算精度% % CC:最佳信道容量,Paa:最佳输入概率矩阵% % Pa:初始输入概率矩阵,Pba:正向转移概率矩阵% % Pb:输出概率矩阵,Pab:反向转移概率矩阵% % C:初始信道容量,r:输入符号数,s:输出符号数% %************************************************** % function [CC,Paa]=ChannelCap(P,k) % 提示错误信息 if (length(find(P<0)) ~=0) error('Not a prob.vector,negative component'); % 判断是否符合概率分布条件end

费诺编码

西华数学与计算机学院上机实践报告 课程名称:信息与编码理论年级:2007级上机实践成绩: 指导教师:李月卉姓名:何龙 上机实践日期:2010.5.20上机实践名称:费诺编码学号: 312007********* 上机实践编号:2上机实践时间:14:30-15:50一、目的 通过上机实践,实现常用的信源编码方案,以加深对编码理论的理解,促进对本课程所学知识的理解和把握。 二、内容与设计思想 1)充分掌握信源编码方案之一的费诺编码算法设计; 2)以教材例题为算例,将该算法用代码实现; 3)以至少2组算例验证程序; 4)理解,总结费诺编码算法。 三、使用环境 实验室PC 标准配置,winXP,matlab/C/C++/Frotran 等 四、核心代码及调试过程 核心代码: void fano(float p[],int a[N][N],int n,int m,int k) { float g=0.0,h=0.0,d,b,c; int i,j,flase; if(ng) { d=h-p[i];b=h-g;c=g-d; if(c>b) { for(j=n;j<=i;j++) a[j][k]=0;

fano(p,a,n,i,k+1); for(j=i+1;j<=m;j++) a[j][k]=1; fano(p,a,i+1,m,k+1); } else { for(j=n;j<=i-1;j++) a[j][k]=0; fano(p,a,n,i-1,k+1); for(j=i;j<=m;j++) a[j][k]=1; fano(p,a,i,m,k+1); } break; } } } } 调试过程: (1)当输入信源符号个数为:3 输入各信源符号概率分别为:0.2 0.3 0.5时 (2)当输入信源符号个数为:3 输入各信源符号概率分别为:0.3 0.3 0.3时 (3)当输入信源符号个数为:4 输入各信源符号概率分别为:0.1 0.2 0.3 0.4 时

信息论与编码--费诺编码与哈弗曼编码比较

信源编码的比较 ——哈弗曼编码与费诺编码 姓名: 班级: 学号:

一、实验目的: 1、实现常用的信源编码方案,以加深对编码理论的理解,促进对本课程所学知识的理解和把握。 2、课程实验主要为设计性实验,要求掌握Matlab使用方法。 3、通过信源编译码,理解信源编码的主要目的,掌握信源编码的方法和手段,掌握费诺编码和霍夫曼编码方法 二、实验设备: 装有matlab的计算机 三、实验原理: 信源编码主要可分为无失真信源编码和限失真信源编码。无失真信源编码主要适用于离散信源或数字信号,如文本、表格及工程图纸等信源,它们要求进行无失真地数据压缩,要求完全能够无失真地可逆恢复。 香农码、费诺码、哈夫曼码都考虑了信源的统计特性,使经常出现的信源符号对应较短的码字,使信源的平均码长缩短,从而实现了对信源的压缩。 费诺码比较适合于对分组概率相等或接近的信源编码。 哈夫曼码对信源的统计特性没有特殊要求,编码效率比较高,对编码设备的要求也比较简单,因此综合性能优于香农码和费诺码。(1)费诺码属于概率匹配编码,编码过程如下: 1、将信源发出的N个消息符号按其概率的递减次序依次排列。

2、将依次排列的信源符号依概率分成两组,使两个组的概率和近于相同,并对各组赋予一个二进制代码符号“0”和“1”(编m进制码就分成m组)。 3、将每一个大组的信源符号进一步再分成两组,使划分后的两个组的概率和近于相同,并又分别赋予两组一个二进制符号“0”和“1” 4、如此重复,直至每组值只剩下一个信源符号为止 5、信源符号所对应的码符号序列即为费诺码 (2)霍夫曼编码过程: 1、将信源发出的N个消息符号按其概率的递减次序依次排列。 2、取概率最小的两个符号分别配以0和1两个码元,并将这两个符号的概率相加作为一个新概率,与未分配码元的符号重新按概率排队 3、对重排后的两个概率最小符号重复步骤2 4、不断重复上述过程,直到最后两个符号配以0和1为止 5、重最后一级开始,向前返回得到各个信源符号所对应的码元序列,即相应的码字。 四、实验内容: 1、哈弗曼编码 对如下信源进行哈弗曼编码,并计算编码效率。 X s1 s2 s3 s4 s5 s6 s7 P 0.09 0.18 0.23 0.17 0.1 0.07 0.16 (1)计算信源的信息熵,并对信源概率进行排序

费诺编码的matlab实现

信息论与编码实验费诺编码的matlab实现 学院:---- 班级:---- 姓名:---- 学号:----

摘要: 用预先规定的方法将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机、电视、遥控和通讯等方面广泛使用。其中费诺编码有广泛的应用,通过本次实验,了解编码的具体过程,通过编程实现编码,利用matlab实现费诺编码。 关键字:信息论,费诺编码,matlab 正文: 费诺编码也是一种常见的信源编码方法。信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同,并各赋于一个二元码符号”0”和”1”.然后,将每一大组的信源符号再分成两组,使同一组的两个小组的概率和近于相同,并又分别赋予一个二元码符号.依次下去,直至每一个小组只剩下一个信源符号为止.这样,信源符号所对应的码符号序列则为编得的码字. 费诺编码的matlab实现 编码如下: clc; 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:n B(i,1)=A(i);%生成B的第1列 end %生成B第2列的元素 a=sum(B(:,1))/2; for k=1:n-1 if abs(sum(B(1:k,1))-a)<=abs(sum(B(1:k+1,1))-a) break; end end for i=1:n%生成B第2列的元素 if i<=k B(i,2)=0; else B(i,2)=1; end end %生成第一次编码的结果 END=B(:,2)'; END=sym(END); %生成第3列及以后几列的各元素

香农费诺编码的matlab的实现

信息论与编码作业香农--费诺编码的matlab实现 班级: 姓名: 学号:

摘要: 将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机、电视、遥控和通讯等方面广泛使用。其中费诺编码有广泛的应用,通过本次设计,了解编码的具体过程,通过编程实现编码,利用matlab实现费诺编码。 关键字:信息论,费诺编码,matlab 正文: 费诺编码也是一种常见的信源编码方法。信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同,并各赋于一个二元码符号”0”和”1”.然后,将每一大组的信源符号再分成两组,使同一组的两个小组的概率和近于相同,并又分别赋予一个二元码符号.依次下去,直至每一个小组只剩下一个信源符号为止.这样,信源符号所对应的码符号序列则为编得的码字. 香农--费诺编码的matlab实现 编码如下: clc; clear; N=input('N=');%输入信源符号的个数 for i=1:N fprintf('第%d个',i); A(i)=input('p=');%输入信源符号概率分布矢量,p(i)<1 if A(i)<=0 error('不符合概率分布') end end A=fliplr(sort(A));%降序排列 [m,n]=size(A); for i=1:n B(i,1)=A(i);%生成B的第1列 end %生成B第2列的元素 a=sum(B(:,1))/2; for k=1:n-1 if abs(sum(B(1:k,1))-a)<=abs(sum(B(1:k+1,1))-a) break; end end for i=1:n%生成B第2列的元素 if i<=k

香农编码费诺编码

实验目的:通过该实验,掌握通过计算机实验可变长信源编码方法,进一步熟悉香农编码,费诺编码以及霍夫曼编码方法。 实验环境: Matlab7.1 实验内容及过程: 1.对于给定的信源的概率分布,用MA TLAB语言实现香农编码。 2. 对于给定的信源的概率分布,用MA TLAB语言实现霍夫曼编码。 3. 对于给定的信源的概率分布,用MATLAB语言实现游程编码。 以下为M文件: 1. function 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 = 0 ; for i = 2:n pa(i) = pa(i - 1) + p(i - 1) ; end k = ceil(-log2(p)) ; c = cell(1,n) ; for i = 1:n c{i} = '' ; tmp = pa(i) ; for j = 1:k(i) tmp = tmp * 2 ; if tmp >= 1 tmp = tmp - 1 ; c{i}(j) = '1' ; else c{i}(j) = '0' ; end end end c = fliplr(c) ; c(index) = c ; 2. function c = huffman(p) n = size(p , 2) ; if n == 1 c = cell(1,1) ; c{1} = '' ; return end [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 + p2 ; c = huffman(p) ; c{n+1} = strcat(c{n} , '1') ; c{n} = strcat(c{n} , '0') ; index = [index , i1 , i2] ; c(index) = c ; 3.

费诺编码的MATLAB语言实现

《信息处理与编码》结课大作业 学号: 班级: 姓名: 成绩:

费诺编码的MATLAB语言实现 1.前言: 无失真的信源编码定理既是存在性定理又是构造性定理,即它给出了构造新源编码的原理性方法,使构造出的码其平均码长与信源统计特性相匹配。 2.正文: 费诺编码也是一种常见的信源编码方法。将信源消息(符号)按其出现的概率由小到大依次排列;将依次排列好的信源符号按概率值分为两大组,使两个组的概率和近于相同,并对各组分别赋于一个二进制码元”0”和”1”;将每一大组的信源符号再进一步分成两组,使划分后的两组的概率和近于相同,并又分别赋予一个二进制符号”0”和”1”;如此重复,直至每个小组只剩下一个信源符号为止;信源符号所对应的码字即为费诺码. 编码如下: clc; 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:n B(i,1)=A(i); end a=sum(B(:,1))/2; for k=1:n-1 if abs(sum(B(1:k,1))-a)<=abs(sum(B(1:k+1,1))-a) break; end end for i=1:n

if i<=k B(i,2)=0; else B(i,2)=1; end end END=B(:,2)'; END=sym(END); j=3; while (j~=0) p=1; while(p<=n) x=B(p,j-1); for q=p:n if x==-1 break; else if B(q,j-1)==x y=1; continue; else y=0; break; end end end if y==1 q=q+1; end if q==p|q-p==1 B(p,j)=-1; else if q-p==2 B(p,j)=0; END(p)=[char(END(p)),'0']; B(q-1,j)=1; END(q-1)=[char(END(q-1)),'1']; else a=sum(B(p:q-1,1))/2; for k=p:q-2 if abs(sum(B(p:k,1))-a)<=abs(sum(B(p:k+1,1))-a); break; end

费诺编码的matlab实现

多媒体技术实验报告 学院:城南学院 姓名:学号: 指导老师:尹波 息符号按其出现的概率依次由大到小排列开来,并将排列好的信源符号按概率值分N大组,使N组的概率之与近似相同,并对各组赋予一个N进制码元0、1……N-1。之后再针对每一大组内的信源符号做如上的处理,即再分为概率与相同的N组,赋予N进制码元。如此重复,直至每组只剩下一个信源符号为止。此时每个信源符号所对应的码字即为费诺码。 具体过程如下: [1] 将信源消息符号按其出现的概率大小依次排列:P1>=P2>=…>=Pn。 [2] 依次排列的信源符号按概率值分为两大组,使两个组的概率之与近似相同,并对各组赋予一个二进制码元“0”与“1”。 [3] 使划分后的两个组的概率之与近似相同,并对各组赋予一个二进制符号“0”与“1”。 [4] 如此重复,直至每个组只剩下一个信源符号为止。 [5] 信源符号所对应的码字即为费诺码。 例:有一幅40个像素组成的灰度图像,灰度共有5级,分别用符号A,B,C,D与E表示。40个像素中出现灰度A的像素数有15个,出现灰度B的像素数有7个,出现灰度C的像素数有7个,其余情况见表。

费诺编码方法属于概率匹配编码,具有如下特点: 1、概率大,则分解次数小;概率小则分解次数多。这符合最佳码原则。 2、码字集合就是唯一的。 3、分解完了,码字出来了,码长也有了,即先有码字后有码长。 因此,费诺编码方法又称为子集分解法。 3、程序设计思路

4、程序代码 clc; clear; A=[0、19,0、18,0、17,0、16,0、13,0、10,0、06,0、01]; A=fliplr(sort(A));%降序排列 [m,n]=size(A); for i=1:n B(i,1)=A(i);%生成B的第1列 end

费诺编码的C语言实现

摘要: 用预先规定的方法将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机、电视、遥控和通讯等方面广泛使用。其中费诺编码有广泛的应用,通过本次实验,了解编码的具体过程,通过编程实现编码,利用C语言实现费诺编码。 关键字:信息论,费诺编码,C语言 正文: 费诺编码也是一种常见的信源编码方法。信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同. 费诺编码的C语言实现 设有一个离散信源,概率分布P(x)保存在in.dat文件中,实现对文件的读取,并根据P(x)给出对应的费诺编码,将结果保存在另一文件out.dat中。 程序代码: #include #include #include #define N 8 struct event { int n; double x; int code[N]; int low; }; FILE *fp1,*fp2; struct event A[N+1]; void inputcode(struct event *a,int b)/*input code*/ { a->code[a->low]=b; (a->low)++; } void outcode(struct event a)/*output code*/ { int i; for(i=0;i

matlab的信源编码

三种信源编码的MATLAB实现 香农编码 a =[0.25,0.25,0.2,0.15,0.1,0.05]; len=length(a); p=zeros(1,len); for i=2:len p(i)=p(i-1)+a(i-1); end for i=1:len if -log(a(i))/log(2)-fix(-log(a(i))/log(2))==0 k(i)=-log(a(i))/log(2); else k(i)=fix(-log(a(i))/log(2))+1; end end n=0; for i=1:len n=n+1; c(n)=k(i); for m=1:k(i) n=n+1; c(n)=fix(p(i)*2); p(i)=p(i)*2-fix(p(i)*2); end end >> c c = Columns 1 through 13 2 0 0 2 0 1 3 1 0 0 3 1 0 Columns 1 4 through 25 1 4 1 1 0 1 5 1 1 1 1 0 2,2,3,3,4,5分别表示码长 费诺编码 主程序: a=[0.25,0.25,0.2,0.15,0.1,0.05];len=length(a);mi=depart(a);temp=zeros(1,len);temp=a; for i=1:len

c(i)=' '; end dowith(1,mi,a,temp) 子函数 function dowith(nu,mi,a,temp) len=length(a); if nu<=mi &&mi>1 c=0 for i=1:mi b(i)=a(i); end a=zeros(1,mi); for i=1:mi a(i)=b(i); end len=mi; mi=depart(a); dowith(nu,mi,a,temp); else if nu>mi c=1 if mi==1&&len==2 c=0; a=temp;len=length(a);mi=depart(a); for i=1:len c(i)=' '; end else if mi==1&&nu==2 c=0; a=temp; len=length(a); mi=depart(a); for i=1:len c(i)=' '; end else j=1; for i=(mi+1):len; b(j)=a(i);

费诺编码的分析与实现

吉林建筑大学 电气与电子信息工程学院 设计题目:费诺编码的分析与实现专业班级:电子信息工程111 学生姓名:马超 学号:10211115 指导教师:吕卅王超 设计时间:2014.11.24-2014.12.5

第1章 概述 1.1设计的作用、目的 《信息论与编码》是一门理论与实践密切结合的课程,通过理论课程学习如何计算信道容量,包括对信道的认识,以及传输速率的计算,计算最佳编码,编码效率等等。再通过课程设计加深对知识的认识,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。 通过完成具体编码算法的程序设计和调试工作,提高对MATLAB 等类似软件的认识程度,掌握MATLAB 等类似软件的各种操作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法。 1.2设计任务及要求 1. 理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法; 2. 掌握费诺编码方法的基本步骤及优缺点; 3. 深刻理解信道编码的基本思想与目的,理解线性分组码的基本原理与编码 过程; 4. 能够使用MATLAB 或其他语言进行编程,编写的函数要有通用性。 1.3设计内容 一个有8个符号的信源X ,各个符号出现的概率分别为: ? ? ????=??????02.005.008.01.01.02.02.025.0)(87654321x x x x x x x x X P X 运用MATLAB 软件,编写适当的程序,对以上8个信源符号进行费诺编码, 得出二进制码字,计算平均码长、编码效率、冗余度,并总结费诺编码方法 的特点和应用。

费诺编码教学规划

吉林建筑大学 电气与电子信息工程学院信息理论与编码课程设计报告 设计题目:费诺编码 专业班级 学生姓名: 学号: 指导教师: 设计时间:2014.11.24-2014.12.5

第1章概述 1.1设计的作用、目的 《信息论与编码》是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。 通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法。 1.2设计任务及要求 1.理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法;2.根据费诺编码算法,考虑一个有多种可能符号(各种符号发生的概率不同)的信源,得到费诺编码; 3.掌握费诺编码的优缺点; 4.能够使用MATLAB或其他语言进行编程,编写的函数要有通用性,要理解每个函数的具体意义和适用范围,对主要函数的功能和参数做详细说明。 1.3设计内容 费诺编码属于概率匹配编码,但不是最佳的编码方法。在编N进制码时首先将信源消息符号按其出现的概率依次由小到大排列开来,并将排列好的信源符

号按概率值分N 大组,使N 组的概率之和近似相同,并对各组赋予一个N 进制码元0、1……N-1。之后再针对每一大组内的信源符号做如上的处理,即再分为概率和相同的N 组,赋予N 进制码元。如此重复,直至每组只剩下一个信源符号为止。此时每个信源符号所对应的码字即为费诺码。 针对同一信源,费诺码要比香农码的平均码长小,消息传输速率大,编码效率高。 一个有8个符号的信源X ,各个符号出现的概率为: 进行费诺编码,并计算平均码长、编码效率、冗余度。 第2章 费诺编码 2.1 设计原理 1. 编码与信源编码 在学过信息论与编码以后,对这方面内容已有了基础的了解。为了进行更深入的了解,我查阅了很多资料,我认为通信的根本问题是如何将信源输出的信息在接收端的信宿精确地或近似地复制出来,而这最重要的一步就是信源的编码,一个好的开端才能为以后的传输及接受、解码提供有利得条件。而我也对各种信源编码方式产生了浓厚的兴趣。 1.1首先要了解什么是信源编码 为了减少信源输出符号序列中的剩余度、提高符号的平均信息量,对信源输 X P (X ) X1, X2, X3, X4, X5, X6, X7, X8 0.19, 0.18, 0.17, 0.16, 0.13, 0.10, 0.06, 0.01

信息论与编码matlab

信息论实验报告 姓名胡小辉 班级电子信息工程0902 学号 0909091112

1.实验目的 1、掌握哈夫曼编码、费诺编码、汉明码原理; 2、熟练掌握哈夫曼树的生成方法; 3、学会利用matlab、C语言等实现Huffman编码、费诺编码以及hamming编码。 2.实验原理 Huffman编码: 哈夫曼树的定义:假设有n个权值,试构造一颗有n个叶子节点的二叉树,每个叶子带权值为wi,其中树带权路径最小的二叉树成为哈夫曼树或者最优二叉树; 实现Huffman编码原理的步骤如下: 1. 首先将信源符号集中的符号按概率大小从大到小排列。 2. 用0和1表示概率最小的两个符号。可用0表示概率小的 符 号,也可用1表示概率小的符号,但整个编码需保持一致。 3. 将这两个概率最小的符号合并成一个符号,合并符号概率 为 最小概率之和,将合并后的符号与其余符号组成一个N-1的新信源符号集,称之为缩减符号集。 4. 对缩减符号集用步骤1,2操作 5. 以此类推,直到只剩两个符号,将0和1分别赋予它们。 6. 根据以上步骤,得到0,1赋值,画出Huffman码树,并从 最 后一个合并符号回朔得到Huffmaan编码。 费诺编码: 费诺编码的实现步骤: 1、将信源消息符号按其出现的概率大小依次排列:。

2、将依次排列的信源符号按概率值分为两大组,使两个组的 概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。 3、将每一大组的信源符号再分为两组,使划分后的两个组的 概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。 4、如此重复,直至每个组只剩下一个信源符号为止。 5、信源符号所对应的码字即为费诺码。 hamming编码: 若一致监督矩阵H 的列是由不全为0且互不相同的所有二进制m(m≥2的正整数)重组成,则由此H矩阵得到的线性分组码称为[2m-1,2m-1-m,3]汉明码。 我们通过(7,4)汉明码的例子来说明如何具体构造这种码。设分组码(n,k)中,k = 4,为能纠正一位误码,要求r≥3。现取r=3,则n=k+r=7。我们 用a 0a l a 2 a 3 a 4 a 5 a 6 表示这7个码元,用S 1 、S 2 、S 3 表示由三个监督方程式计算得到的校 正子,并假设三位S 1、S 2 、S 3 校正子码组与误码位置的对应关系如表1所示。 表1 校正子和错码位置关系 由表可知,当误码位置在a 2、a 4 、a 5 、a 6 时,校正子S 1 =1;否则S 1 =0。因此有S 1 =a 6⊕a 5 ⊕a 4 ⊕a 2 ,同理有S 2 =a 6 ⊕a 5 ⊕a 3 ⊕a 1 和S 3 =a 6 ⊕a 4 ⊕a 3 ⊕a 。在编码时a 6 、 a 5、a 4 、a 3 为信息码元,a 2 、a 1 、a 为监督码元。则监督码元可由以下监督方程唯 一确定 a 6⊕a 5 ⊕a 4 ⊕a 2 = 0 a 6⊕a 5 ⊕a 3 ⊕a 1 = 0 (1.1.1) a 6⊕a 4 ⊕a 3 ⊕a 0 = 0

matlab费诺编码程序

%函数f1存放于 function x=f1(i,j,p,r) global x; x=char(x); if(j<=i) return; else > q=0; for t=i:j %对于区间[i,j]自上而下求累加概率值 q=p(t)+q;y(t)=q; end for t=i:j%把所有自上而下的累加概率值与该区间总概率值减该累加概率值之差取绝对值存在一数组 v(t)=abs(y(t)-(q-y(t))); end for t=i:j | if(v(t)==min(v)) %求该数组中最小的一个值来确定分界点位置 for k=i:t %赋值码字 x(k,r)='0'; end for k=(t+1):j x(k,r)='1'; end d=t; 《 f1(i,d,p,r+1); %递归调用及相互调用 f2(d+1,j,p,r+1); f1(d+1,j,p,r+1); f2(i,d,p,r+1); else end end end ? return;

%函数f2存放于 function x=f2(i,j,p,r) global x; x=char(x); if(j<=i) return; else { q=0; for t=i:j %对于区间[i,j]自上而下求累加概率值 q=p(t)+q;y(t-i+1)=q; end for t=1:j-(i-1)%把所有自上而下的累加概率值与该区间总概率值减该累加概率值之差取绝对值存在一数组 v(t)=abs(y(t)-(q-y(t))); end for t=1:j-(i-1) … if(v(t)==min(v)) %求该数组中最小的一个值来确定分界点位置 d=t+i-1; for k=i:d %赋值码字 x(k,r)='0'; end for k=(d+1):j x(k,r)='1'; end @ f2(d+1,j,p,r+1);%递归调用及相互调用 f1(i,d,p,r+1); f2(i,d,p,r+1); f1(d+1,j,p,r+1); else end end end ? return;

香农编码的MATLAB实现

香农编码的MATLAB实现 指导教师:张坤(讲师) 专业:信息与计算科学(08级) 成员:张深海(组长) 陈子姣 赵静 范亚茹

实验目的: 用香农编码法编成二进制变长码,写出编码过程的Matlab程序。 实验内容: 香农编码方法: p?p?...?p;)将信源消息符号按其出现的概率大小依次排列为(1n12?lb(p)?k??lb(p)?1k;为)确定满足下列不等式的整数码长(2iiiii?1?i)?p(aP个消息的累加概率)(3为了编成唯一可译码,计算第;ki1k?P变换成二进制数;(4)将累加概率i kP二进制数的小数点后位即为该消息符号的二进制码字。(5)取ii实验步骤: (1)用p = fliplr(p)语句对p进行从大到小的排序; 用for循环计算第i个消息的累加概率;(2) 调用c = cell(1,n) ,(3)将码字存在元胞数组中; 二进制转换;)(4得到该消息符号的二进制码字。(5) 实验结果: Matlab程序: function c = shannon(p) [p , index] = sort(p) ; p = fliplr(p) ;%从大到小 n = length(p) ; pa = 0 ;%累加概率 for i = 2:n pa(i) = pa(i - 1) + p(i - 1) ; end k = ceil(-log2(p)) ;%码字长度计算 c = cell(1,n) ;%生成元胞数组,存码字,是cell,跟上一行不一样 for i = 1:n c{i} = '' ;, tmp = pa(i) ; for j = 1:k(i) tmp = tmp * 2 ; if tmp >= 1 tmp = tmp - 1 ; c{i}(j) = '1' ; else

相关文档