费诺编码的matlab实现
信息论常用无失真信源编码设计(含MATLAB程序)
![信息论常用无失真信源编码设计(含MATLAB程序)](https://img.taocdn.com/s3/m/6bf53c95f424ccbff121dd36a32d7375a517c671.png)
《信息论基础》题目:常用无失真信源编码程序设计目录1. 引言 (2)2. 香农编码 (2)2.1 编码步骤 (3)2.2 程序设计 (3)2.3 运行结果 (3)3. 费诺编码 (4)3.1 编码步骤 (5)3.2 程序设计 (5)3.3 运行结果 (5)4. 哈夫曼编码 (6)4.1 编码步骤 (7)4.2 程序设计 (7)4.3 运行结果 (8)5. 结论 (9)6. 参考文献 (10)7. 附录 (11)7.1 香农编码Matlab程序 (11)7.2 费诺编码Matlab程序 (12)7.3 哈夫曼编码Matlab程序 (14)1. 引言信息论(Information Theory)是运用概率论与数理统计的方法研究信息、信息熵、通信系统、数据传输、密码学、数据压缩等问题的应用数学学科。
信息系统就是广义的通信系统,泛指某种信息从一处传送到另一处所需的全部设备所构成的系统。
信息论是关于信息的理论,应有自己明确的研究对象和适用范围[1]。
信息论将信息的传递作为一种统计现象来考虑,给出了估算通信信道容量的方法。
信息传输和信息压缩是信息论研究中的两大领域。
这两个方面又由信息传输定理、信源-信道隔离定理相互联系。
信源编码是一种以提高通信有效性为目的而对信源符号进行的变换,或者说为了减少或消除信源冗余度而进行的信源符号变换。
具体说,就是针对信源输出符号序列的统计特性来寻找某种方法,把信源输出符号序列变换为最短的码字序列,使后者的各码元所载荷的平均信息量最大,同时又能保证无失真地恢复原来的符号序列[2]。
在通信中,传送信源信息只需要具有信源极限熵大小的信息率,但在实际的通信系统中用来传送信息的信息率远大于信源极限熵。
为了能够得到或接近信源熵的最小信息率,必须解决编码的问题,而编码分为信源编码和信道编码,其中的信源编码又分为无失真信源编码和限失真信源编码。
由于无失真信源编码只适用于离散信源,所以本次作业讨论无失真离散信源的三种简单编码,即香农(Shannon)编码、费诺(Fano) 编码和哈夫曼(Huffman) 编码[3]。
用matlab实现香农码和费诺码
![用matlab实现香农码和费诺码](https://img.taocdn.com/s3/m/006000ec998fcc22bcd10d4d.png)
信息论与编码―大作业班级:电信091班姓名:***学号:**********目录一、用matlab实现Shannon编码 (3)1、编码主程序 (3)2、含有的子函数binary (4)3、注意事项 (5)4、例题展示 (5)二、用matlab实现Feno编码 (7)1、编码主程序 (7)2、两个子m文件展示 (9)3、注意事项 (12)4、例题展示 (12)一、用matlab实现Shannon编码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);%生成n*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=binary(A(j),B(j))%生成码字End2、含有的子函数binaryfunction [C]=binary(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;endend3、注意事项正式运行前应该把binary.m文件放到matlab的工作空间中去,以保证主函数能成功调用。
(完整word版)huffman编码的matlab实现
![(完整word版)huffman编码的matlab实现](https://img.taocdn.com/s3/m/5044f73a2b160b4e767fcf96.png)
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足够大时,上述编码几乎没有失真;反之,若这个条件不满足,就不可能实现无失真的编码。
MATLAB中的信号编码与解码技巧
![MATLAB中的信号编码与解码技巧](https://img.taocdn.com/s3/m/de07df71ce84b9d528ea81c758f5f61fb7362808.png)
MATLAB中的信号编码与解码技巧引言现代通信系统中,信号编码和解码是关键技术,它们在数据传输和存储中扮演着至关重要的角色。
MATLAB作为一种强大的数学计算软件和编程环境,提供了丰富的功能和工具,用于信号处理和通信系统建模。
本文将探讨MATLAB中的一些常见信号编码和解码技巧,以提供读者对这一主题的深入理解。
一、数字信号编码1. PCM编码脉冲编码调制(PCM)是一种常用的数字信号编码技术,在语音和音频传输中广泛应用。
MATLAB提供了丰富的函数,可以帮助我们实现PCM编码。
例如,使用`audioread`函数可以读取音频文件,并使用`pcmenco`函数进行PCM编码。
2. Huffman编码霍夫曼编码是一种无损数据压缩算法,可以根据数据的统计特性进行代码设计。
在MATLAB中,`huffmandict`函数可用于生成霍夫曼编码字典,`huffmanenco`函数用于对数据进行编码,`huffmandeco`函数用于解码。
二、模拟信号编码1. AM编码幅度调制(AM)是一种传统的模拟信号编码技术,常用于广播和无线电通信。
在MATLAB中,我们可以使用`ammod`函数实现AM编码,并使用`amdemod`函数进行解调。
2. FM编码频率调制(FM)是另一种常见的模拟信号编码技术,广泛应用于音频和视频传输。
在MATLAB中,`fmmod`函数可用于FM编码,`fmdemod`函数可用于解调。
三、数字信号解码1. PCM解码PCM编码的逆过程是PCM解码,MATLAB中的`pcmdeco`函数可用于解码PCM信号并恢复原始信号。
2. Huffman解码通过使用霍夫曼编码表,我们可以对霍夫曼编码进行解码。
在MATLAB中,`huffmandeco`函数可用于解码数据,并使用`huffmanenco`函数所生成的编码字典。
四、应用实例:数字音频编码数字音频编码是一个实际应用领域,通过对音频信号进行编码和解码,可以实现音频数据的压缩和传输。
huffman 编解码 matlab 仿真源码
![huffman 编解码 matlab 仿真源码](https://img.taocdn.com/s3/m/820d705826d3240c844769eae009581b6bd9bde7.png)
huffman 编解码 matlab 仿真源码(原创实用版)目录1.Huffman 编码概述2.MATLAB 仿真环境搭建3.基于 MATLAB 的 Huffman 编码实现4.基于 MATLAB 的 Huffman 解码实现5.总结正文一、Huffman 编码概述Huffman 编码是一种基于概率的熵编码方法,其主要思想是对于在码元序列中出现频率大的码元给予一个较短的编码,而对于出现频率小的码元则给予一个较长的编码。
这样,在保证信息传输的准确性的同时,可以有效地压缩数据量。
二、MATLAB 仿真环境搭建MATLAB 是一种广泛应用于科学计算和工程设计的软件,其强大的函数库和便捷的操作方式使得其在信号处理、图像处理等领域具有很高的应用价值。
本文以 MATLAB 为平台,实现 Huffman 编码和解码的仿真。
三、基于 MATLAB 的 Huffman 编码实现在 MATLAB 中,可以通过自定义函数实现 Huffman 编码。
首先,需要根据信源符号的概率分布生成一个符号表,然后通过递归的方式构建Huffman 树,最后根据 Huffman 树生成编码表。
编码过程中,从最小概率的两个符号开始,选其中一个支路为 0,另一支路为 1,再将已编码的两支路的概率合并,并重新排队。
一直循环生成码树直到概率归一。
四、基于 MATLAB 的 Huffman 解码实现在 MATLAB 中,可以通过自定义函数实现 Huffman 解码。
首先,根据编码表和编码后的二进制信息流生成一个解码表,然后通过递归的方式从解码表中找到对应的符号,最后将找到的符号输出。
五、总结本文基于 MATLAB 平台,实现了 Huffman 编码和解码的仿真。
通过构建符号表、生成 Huffman 树、生成编码表和解码表以及递归查找符号等步骤,完成了 Huffman 编码和解码的过程。
费诺编码的matlab实现
![费诺编码的matlab实现](https://img.taocdn.com/s3/m/27d2718459eef8c75ebfb34f.png)
多媒体技术实验报告学院:城南学院姓名:学号:指导老师:尹波息符号按其出现的概率依次由大到小排列开来,并将排列好的信源符号按概率值分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:nB(i,1)=A(i);%生成B的第1列end%生成B第2列的元素a=sum(B(:,1))/2;for k=1:n-1if abs(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;endendendif 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-2if abs(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'];endendendendp=q;endC=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;endavlen=sum(L、*A)H=-sum(A、*log2(A));disp(['ENtropy of the source:',num2str(H),'bits']);5、实验结果①实验运行结果(以[0、19,0、18,0、17,0、16,0、13,0、10,0、06,0、01]为例)②计算:信息熵就是多少?上述编码方法的平均码长就是多少?信息熵就是2、7829; 平均码长就是2、88;。
信息论与编码课程作业_huffman编码的matlab_实现
![信息论与编码课程作业_huffman编码的matlab_实现](https://img.taocdn.com/s3/m/02bca5b9a1116c175f0e7cd184254b35eefd1acb.png)
信息论与编码课程作业_huffman编码的matlab_实现信息论与编码课程作业——霍夫曼编码求信源熵和存储前后的信息量的变化一:设计目的:1、学习离散信源平均信息量的计算方法。
2、理解和掌握huffman 编码的基本原理,实现对信源符号的huffman 编码3、熟悉 Matlab 编程;二:设计原理和思路1.信源熵的计算:公式: 21()log a I a p = Matlab 实现:I=log2(1/p) 或I=-log2(p) 熵(平均自信息)的计算公式22111()log log qq i i i i i i H x p p p p ====-∑∑Matlab 实现:HX=sum(-x.*log2(x));或者h=h-x(i)*log2(x(i));2.霍夫曼编码原理;分为两步,首先是码树形成过程:对信源概率进行合并形成编码码树。
然后是码树回溯过程:在码树上分配编码码字并最终得到Huffman 编码。
1、码树形成过程:将信源概率按照从小到大顺序排序并建立相应的位置索引。
然后按上述规则进行信源合并,再对信源进行排序并建立新的位置索引,直到合并结束。
在这一过程中每一次都把排序后的信源概率存入矩阵p 中,位置索引存入矩阵m 中。
这样,由排序之后的概率矩阵 p 以及索引矩阵m 就可以恢复原概率矩阵P 了,从而保证了回溯过程能够进行下去。
2、码树回溯过程:在码树上分配编码码字并最终得到Huffman 编码。
从索引矩阵M 的末行开始回溯。
(1) 在p 的末行2元素位置填入0和1。
(2) 根据该行索引1位置指示,将索引1位置的编码(‘1’)填入上一行的第一、第二元素位置,并在它们之后分别添加‘0’和‘1’。
(3) 将索引不为‘1’的位置的编码值(‘0’)填入上一行的相应位置(第3 列)。
(4) 以m的倒数第二行开始向上,重复步骤(1) ~(3),直到计算至m的首行为止。
三:设计代码:>> clear all;format longdisp(strcat('信息论与编码课程作业——霍夫曼编码求信源熵和存储前后的信息量的变化',13));histgram=zeros(1,255);[c,map]=imread('C:\Documents and Settings\Administrator\桌面\infomation\lenna.bmp');x=rgb2gray(c);[a,b]=size(x);for i=1:afor j=1:bk=x(i,j);histgram(k)=histgram(k)+1;endendf=histgram/a/b;symbols=find(f~=0); %灰度值p=f(symbols); %概率L=length(p);pp=p;%霍夫曼编码m=zeros(L-1,L);for i=1:L-1[p,mark]=sort(p);m(L-i,1:L-i+1)=mark(1:L-i+1);p=[p(1)+p(2),p(3:L),1];endc=cell(L-1,L);c(1,1)={'0'};c(1,2)={'1'};for i=2:L-1;ind=find(m(i-1,:)==1);temp=char(c(i-1,ind));c(i,1)={[temp,'0']};c(i,2)={[temp,'1']};snc=find(m(i-1,:)~=1);for j=3:i+1;con=snc(j-2);c(i,j)=c(i-1,con);endendcodeL=[];averge_long=0;H1=0;disp(strcat('灰度值',32,32,32,'概率',32,32,32,32,32,32,32,32,32,'霍夫曼编码:'));for i=1:L;ind=find(m(L-1,:)==i);code=char(c(L-1,ind));codeLength(i)=length(code);averge_long=averge_long+pp(i)*codeLength(i);H1=H1+pp(i)*log2(1/pp(i));disp(strcat(32,num2str(symbols(i)),32,32,32,num2str(pp(i)),3 2,32, code));enddisp(strcat('信源熵=',num2str(H1),32,32,32,32,'平均码字长度=',num2str(averge_long),32,32,32,32,32,'压缩比=',num2str(8/averge_long)));四:设计运行结果:信息论与编码课程作业——霍夫曼编码求信源熵和存储前后的信息量的变化灰度值概率霍夫曼编码:30 1.5259e-005 101000111100001031 1.5259e-005 101000111100001136 1.5259e-005 101000111100000037 1.5259e-005 101000111100000139 6.1035e-005 1010001111000140 7.6294e-005 1110010101001041 6.1035e-005 0111010111011042 6.1035e-005 0111010111011143 9.1553e-005 1110010101001144 0.00018311 111011101010145 0.00021362 00111101101146 0.00022888 01110101111047 0.00024414 01110101111148 0.00039673 0011110110049 0.00048828 1010001110050 0.00065613 1110010101151 0.00090027 011101011052 0.00086975 001111011153 0.0013123 111001011054 0.0013733 111011101156 0.0018005 01110101057 0.0025177 11010001158 0.0036621 0111111059 0.0033722 0101111060 0.0046539 1100110161 0.0055847 1111010162 0.0061188 001001063 0.0080261 100111064 0.0075226 100001165 0.0083466 101010166 0.0088806 101111167 0.0092773 110011168 0.0095367 110101069 0.0086517 101101070 0.0084229 101011071 0.0075378 100010172 0.0071564 011011173 0.0061493 001001174 0.0056 1111011075 0.0053864 1110110076 0.0045319 1100011177 0.0043488 1011000178 0.0042114 1010111079 0.0039063 1000111180 0.0041199 1010100181 0.0035706 0110101182 0.0039368 1001011083 0.0037537 1000010084 0.003479 0110101086 0.0033417 0101101087 0.0032501 0100110088 0.0034027 0110000189 0.0031128 0011010090 0.0031433 0011110091 0.0036774 0111111192 0.0041046 1010011094 0.0038452 1000111095 0.004364 1011100096 0.0037842 1000110097 0.0037079 1000001198 0.0033722 0101111199 0.0040741 10100001 100 0.0040741 10100010 101 0.0038147 10001101 102 0.0040588 10011111 103 0.0041046 10100111 104 0.004364 10111001 105 0.0048218 11010111 106 0.0052185 11100100 107 0.0049591 11011010 108 0.005188 11100001 109 0.0047455 11010110 110 0.0052032 11100011 111 0.0054474 11110100 112 0.0057526 11111011 113 0.0065308 0100111 114 0.0079346 1001100 115 0.010223 1101111116 0.0095825 1101100 117 0.0089417 1100000 118 0.0086975 1011011 119 0.0081787 1010010 120 0.007782 1001001121 0.0066376 0101011 122 0.0059357 11111111 123 0.0056458 11110111 124 0.0051575 11100000 125 0.0052948 11101001 126 0.005188 11100010 127 0.0059814 0000001 128 0.0058594 11111101 129 0.0065613 0101010 130 0.0062561 0011011 131 0.006897 0110100132 0.0072479 0111011 133 0.0073242 0111110 134135 0.0075226 1000100 136 0.0077515 1001000138 0.008606 1011001139 0.0091095 1100100 140 0.012115 000010141 0.012115 000011142 0.012741 001110143 0.012329 001100144 0.010941 1111001145 0.010147 1101110146 0.0089417 1100001 147 0.0088043 1011101 148 0.0091095 1100101 149 0.010712 1110101150 0.011337 1111100151 0.010513 1110011152 0.012878 010000153 0.012268 001010154 0.013138 010100155 0.012238 001000156 0.012939 010001157 0.012115 000100158 0.012955 010010159 0.012207 000111160 0.011993 000001161 0.013916 011001162 0.012177 000110163 0.012299 001011164 0.0094604 1101001 165 0.0089874 1100010 166 0.0088501 1011110 167 0.0056915 11111010 168 0.0059357 0000000 169 0.0071716 0111001 170 0.0057678 11111100 171 0.0054016 11101111 172 0.0054169 11110001 173 0.0058746 11111110 174 0.0072937 0111100 175 0.0070953 0110110 176177 0.0061035 0001011 178 0.0054016 11110000 179 0.0053864 11101101 180 0.0046692 11010000182 0.0036774 10000000183 0.0033875 01100000184 0.0033264 01011000185 0.0031281 00110101186 0.0035706 01110000187 0.0033264 01011001188 0.0033569 01011011189 0.0036011 01110100190 0.0040436 10011110191 0.0034485 01100010192 0.0036774 10000001193 0.0032654 01001101194 0.0034485 01100011195 0.003006 00010100196 0.0033722 01011100197 0.0036774 10000010198 0.0042419 10110000199 0.0045166 11000110200 0.0041046 10101000201 0.0052643 11101000202 0.0050354 11011011203 0.0045319 11001100204 0.0039825 10011010205 0.0040588 10100000206 0.0039673 10010111207 0.0037537 10000101208 0.0033722 01011101209 0.0026703 111011100210 0.0022125 110100010211 0.0018768 101000110212 0.0015259 000101010213 0.0013428 1110010111214 0.0012665 1110010100215 0.0007782 0011110100216 0.00079346 0011110101217 0.00061035 10100011111218 0.00054932 10100011101219 0.00065613 11101110100220 0.00035095 111011101011 221 0.00033569 111001010101 222 0.00030518 101000111101 223 0.00021362 011101011100 224 0.00016785 1110111010100225 0.00019836 001111011010226 0.00015259 1110010101000227 0.00010681 0111010111010228 6.1035e-005 10100011110010230 3.0518e-005 101000111100110231 1.5259e-005 10100011110011110232 1.5259e-005 10100011110011111233 1.5259e-005 1010001111001110信源熵=7.2193 平均码字长度=7.2492 压缩比=1.1036五:设计新得体会:通过这学期对信息论和编码的学习,以及这次的设计,使我了解了很多东西,也使以前所学的知识得以巩固!,通过这次的设计,进一步学习了离散信源平均信息量、平均码长和压缩比的计算方法。
费诺编码的分析与实现.(DOC)
![费诺编码的分析与实现.(DOC)](https://img.taocdn.com/s3/m/533e504d77232f60ddcca171.png)
吉林建筑大学电气与电子信息工程学院设计题目:费诺编码的分析与实现专业班级:电子信息工程111学生姓名:**学号:********指导教师:吕卅王超设计时间: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个信源符号进行费诺编码, 得出二进制码字,计算平均码长、编码效率、冗余度,并总结费诺编码方法 的特点和应用。
第2章费诺编码的分析与实现2.1设计原理1.编码原理早期的数据压缩来自于人们对概率的了解。
huffman编码用matlab的实现
![huffman编码用matlab的实现](https://img.taocdn.com/s3/m/015e7ae414791711cd79173b.png)
一、实验目的
1、学习Matlab软件的使用和编程;
2、进一步深入理解Huffman编码算法的原理;
3、提高独立进行算法编程的能力.
二、实验环境
硬件:计算机
软件:Windows 2003和MATLAB编程环境。
三、实验内容
1、用Matlab实现Huffman编码算法程序;
end
end
for i=1:n
h(i,1:n)=c(1,n*(find(a(1,:)==i)-1)+1:find(a(1,:)==i)*n)
ll(i)=length(find(abs(h(i,:))~=32))
end
l=sum(p。*ll);
fprintf('\n huffman code:\n’);
(3)视此节点为新符号,其概率等于被合并(缩减)的两个概率之和,参与概率排队。
(4)重复(2)(3)两步骤,直至全部符号都被合并(缩减)到根.
(5)从根出发,对各分枝标记0和1.从根到叶的路径就给出了各个码字的编码和码长。
2、程序设计的原理
(1)程序的输入:以一维数组的形式输入要进行huffman编码的信源符号的概率,在运行该程序前,显示文字提示信息,提示所要输入的概率矢量;然后对输入的概率矢量进行合法性判断,原则为:如果概率矢量中存在小于0的项,则输入不合法,提示重新输入;如果概率矢量的求和大于1,则输入也不合法,提示重新输入。
2、通过这个实验,对huffman编码的具体实现原理了解的更加深刻,在实验的过程中也遇到了一些问题,通过查找资料和相关书籍得到了解决,通过此次试验,了解了Huffman编码的特点,能够运用Huffman编码的基本原理及编码算法的来设计与实现程序。收获颇多,为以后更进一步学习奠定了基础,总的来说,在完成该实验的过程中,学到了比较多的知识,包括使对一些matlab语句的掌握的更加熟练,完成一个算法必须要有一个整体的把握等等。
实验 Huffman编码(含matlab代码)
![实验 Huffman编码(含matlab代码)](https://img.taocdn.com/s3/m/6a697c48c850ad02de8041cf.png)
实验二Huffman编码一实验目的1 通过本实验实现信源编码——Huffman编码2 编写M文件实现,掌握Huffman编码方法二实验要求1 了解matlab中M文件的编辑、调试过程2 编写程序实现Huffman编码算法三实验步骤1 输入Huffman编码程序2 运行程序,按照提示输入相应信息,并记录输入信息,及运行结果。
注:观察结果方法:data(1).Code显示a1的编码,同理显示data(2).Code,a2的编码结果。
3 思考:该程序编出的Huffman码是否是最小码方差的码?为什么?四报告要求五附Huffman编码程序clearN=input('请输入信源符号的个数:') ;for i=1:N%data(1).name=input('请输入各信源符号的名称:');data(i).p=input('请输入各信源符号发生的概率:');endfor i=1:Npp(i)=data(i).p;data(i).imap=i; %各符号在编码过程中的指针data(i).Code=''; %各符号的编码结果endfor j = 1:N % N——信源符号的个数for i = 1:N - jif (pp(i) > pp(i + 1))fT = pp(i);pp(i) = pp(i + 1);pp(i + 1) = fT;for k = 1:Nif data(k).imap == idata(k).imap = i + 1;elseif data(k).imap == i + 1data(k).imap = i;endendendendendp=pp;%%%%%%%%%%%%%%%%%%%%% %// 计算哈夫曼编码表%// 开始编码for i=1:N-1for k = 1:Nif data(k).imap== idata(k).Code = strcat('1',data(k).Code);elseif (data(k).imap== i + 1)data(k).Code = strcat('0',data(k).Code);endendp(i + 1) = p(i + 1)+p(i);for k = 1:Nif (data(k).imap == i)data(k).imap = i + 1;endendfor j = i + 1:N-1if p(j) >p(j + 1)fT =p(j);p(j) = p(j + 1);p(j + 1) = fT;for k = 1:Nif (data(k).imap == j)data(k).imap = j + 1;elseif (data(k).imap == j + 1)data(k).imap = j;endendendendend。
如何利用Matlab技术进行信号编码
![如何利用Matlab技术进行信号编码](https://img.taocdn.com/s3/m/f5604dcff71fb7360b4c2e3f5727a5e9856a27b0.png)
如何利用Matlab技术进行信号编码信号编码(Signal Encoding)是指将信息转换成适合传输或存储的信号形式的过程。
在通信、数据存储、图像处理等领域中,信号编码起着至关重要的作用。
Matlab作为一种强大的数学计算工具和编程语言,能够提供丰富的信号编码技术和算法支持。
本文将介绍如何利用Matlab技术进行信号编码,并深入探讨其中的原理与应用。
一、信号编码概述信号编码是将原始信号转换为特定格式的过程,以便在传输或存储过程中能够准确地恢复出原始信息。
信号编码常用于模拟信号到数字信号的转换,或者用于将原始数字信息进行压缩,以减少传输或存储所需的资源。
常见的信号编码技术包括模拟信号采样与量化、调制与解调、线性编码、熵编码等。
二、模拟信号采样与量化在数字信号处理中,模拟信号采样与量化是将连续时间的模拟信号转换为离散时间的数字信号的过程。
Matlab提供了丰富的函数和工具箱,用于模拟信号的采样与量化。
1. 采样(Sampling)采样是指在时间上对模拟信号进行离散化处理,从而得到一系列的采样值。
Matlab可以使用“sinc”函数进行采样,通过选择合适的采样频率和采样点数,可以保证采样后的信号能够准确地还原原始模拟信号。
2. 量化(Quantization)量化是将采样得到的连续信号值转换为有限级别的离散值。
Matlab中的“quantize”函数可以实现信号的量化过程。
通过选择合适的量化级别和量化算法,可以平衡信号的准确性和编码的复杂度。
三、调制与解调调制与解调是将数字信号转换为模拟信号或将模拟信号转换为数字信号的过程。
调制(Modulation)是通过改变载波的某种属性来传输数字信号的方法,解调(Demodulation)则是将调制后的信号转换回原始信号的过程。
1. 调制在Matlab中,调制可以通过调制函数来实现,常见的调制方式包括频移键控(FSK)、相移键控(PSK)、正交幅度调制(QAM)等。
MATLAB 香农编码和费诺编码
![MATLAB 香农编码和费诺编码](https://img.taocdn.com/s3/m/d86b5873168884868762d678.png)
function varargout = sy(varargin)gui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @sy_OpeningFcn, ...'gui_OutputFcn', @sy_OutputFcn, ...'gui_LayoutFcn', [], ...'gui_Callback', []);if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); elsegui_mainfcn(gui_State, varargin{:});endfunction sy_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject;guidata(hObject, handles);function varargout = sy_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output;function edit1_Callback(hObject, eventdata, handles)function edit1_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction radiobutton2_Callback(hObject, eventdata, handles)set(handles.radiobutton3,'value',0);function radiobutton3_Callback(hObject, eventdata, handles)set(handles.radiobutton2,'value',0);function listbox3_Callback(hObject, eventdata, handles)function listbox3_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction edit3_Callback(hObject, eventdata, handles)function edit3_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction edit4_Callback(hObject, eventdata, handles)function edit4_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction listbox4_Callback(hObject, eventdata, handles)function listbox4_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction edit5_Callback(hObject, eventdata, handles)function edit5_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction pushbutton9_Callback(hObject, eventdata, handles) r1=get(handles.radiobutton2,'value');if r1==1s1=get(handles.edit1,'String')len=length(s1);t=2;q=0;b(1)=s1(1);for i=2:lenfor j=1:i-1if s1(j)==s1(i)q=1;break;endendif q==0b(t)=s1(i);t=t+1;endq=0;endL=length(b)for i=1:La=0;for j=1:lenif b(i)==s1(j)a=a+1;count(i)=a;endendendcount=count/len;p=countl=0;H=-p*(log2(p))';for i=1:L-1for j=i+1:Lif p(i)<=p(j)m=p(j);p(j)=p(i);p(i)=m;endendendfor i=1:La=-log2(p(i));w(i)=fix(a+1);l=l+p(i)*w(i);endn=H/l;P(1)=0;for i=2:LP(i)=0;for j=1:i-1P(i)=P(i)+p(j);endendfor i=1:Lfor j=1:w(i)W(i,j)=fix(P(i)*2);P(i)=P(i)*2-fix(P(i)*2);endout{i,:}=num2str(W(i,:));endset(handles.listbox6,'String',p); for i=1:L-1 %for j=i+1:Lif count(i)<count(j)m=b(j);b(j)=b(i);b(i)=m;endendendset(handles.listbox5,'string',b'); set(handles.edit5,'String',H);set(handles.listbox4,'String',out); set(handles.edit3,'String',l);set(handles.edit4,'String',n);elses1=get(handles.edit1,'String')len=length(s1)t=2;q=0;b(1)=s1(1);for i=2:lenfor j=1:i-1if s1(j)==s1(i)q=1;break;endendif q==0b(t)=s1(i);t=t+1;endq=0;endL=length(b);for i=1:Lfor j=1:lenif b(i)==s1(j)a=a+1;count(i)=a;endendendfor i=1:L-1for j=i+1:Lif count(i)<count(j)m=b(j);b(j)=b(i);b(i)=m;endendendcount=count/len;p=countfor i=1:L-1for j=i+1:Lif p(i)<p(j)m=p(j);p(j)=p(i);p(i)=m;endendendc=fano(p);c1=str2double(c')n=length(c);k=[];for i=1:nk=[k,length(c{i})];endH=-p*(log2(p))';mc=p*k'n=H/mcset(handles.edit5,'String',H);set(handles.listbox4,'String',c1);set(handles.edit3,'String',mc);set(handles.edit4,'String',n);set(handles.listbox5,'string',b');set(handles.listbox6,'string',p);endfunction listbox5_Callback(hObject, eventdata, handles) function listbox5_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction listbox6_Callback(hObject, eventdata, handles) function listbox6_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');end。
费诺编码课程设计
![费诺编码课程设计](https://img.taocdn.com/s3/m/7a3d04cdd5bbfd0a7856730f.png)
吉林建筑大学电气与电子信息工程学院信息理论与编码课程设计报告设计题目:费诺编码专业班级学生姓名:学号:指导教师:设计时间: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 ,各个符号出现的概率为:进行费诺编码,并计算平均码长、编码效率、冗余度。
X P (X )X1, X2, X3, X4, X5, X6, X7, X80.19, 0.18, 0.17, 0.16, 0.13, 0.10, 0.06, 0.01第2章费诺编码2.1设计原理1.编码与信源编码在学过信息论与编码以后,对这方面内容已有了基础的了解。
费诺二进制编码matlab代码
![费诺二进制编码matlab代码](https://img.taocdn.com/s3/m/ac6f9e2aa55177232f60ddccda38376baf1fe0d9.png)
费诺二进制编码是一种有效的数据压缩方法,在通信领域得到广泛应用。
它通过对数据进行编码和解码,可以显著减小数据传输的大小,从而提高传输效率。
在本文中,我将深入探讨费诺二进制编码的原理、方法和实现,并结合Matlab代码进行详细分析。
1. 费诺二进制编码概述费诺二进制编码是一种前缀编码,它通过用短码字表示高频次的符号,用长码字表示低频次的符号来实现数据的压缩。
这种编码方法能够有效地减小数据传输的大小,提高传输效率。
在实际应用中,我们可以通过构建费诺树来实现费诺二进制编码,下面我将详细介绍费诺树的构建方法。
2. 费诺树的构建费诺树是一种特殊的二叉树,它通过将频次较低的符号放在树的较深位置,频次较高的符号放在树的较浅位置来实现数据压缩。
我们可以通过以下步骤来构建费诺树:- 将所有的符号按照频次从小到大进行排序。
- 将频次最小的两个符号合并为一个新的符号,其频次为原来两个符号的频次之和。
- 重复上述步骤,直到所有的符号都被合并成一个符号。
- 按照合并的先后顺序构建费诺树。
3. 费诺编码的实现在构建了费诺树之后,我们可以通过遍历费诺树的路径来确定每个符号的费诺编码。
对于每个符号,从根节点开始遍历费诺树的路径,当走到叶子节点时,记录经过的路径,即为该符号的费诺编码。
通过这种方式,我们可以为每个符号生成对应的费诺编码,从而实现数据的压缩和解压缩。
4. Matlab代码实现下面我将使用Matlab来实现费诺二进制编码的方法,为了简化示例,我们以一个简单的文本数据为例,假设我们有一个包含'A', 'B', 'C', 'D'四个符号的数据序列,并且它们的频次分别为4, 3, 2, 1。
我们首先按照频次对符号进行排序,并根据上述步骤构建费诺树,然后遍历费诺树的路径生成每个符号的费诺编码,最终实现数据的压缩和解压缩。
以下是Matlab代码实现的示例:```matlab% 构建费诺树symbols = {'A', 'B', 'C', 'D'};freq = [4, 3, 2, 1];[~, idx] = sort(freq, 'descend');symbols = symbols(idx);freq = freq(idx);leafNodes = cell2struct(num2cell(freq), symbols, 2); parentNodes = cell(size(symbols));while numel(leafNodes) + numel(parentNodes) > 1% 合并频次最小的两个符号[freq, idx] = sort([struct2array(leafNodes);struct2array(parentNodes)], 'descend');nodes = {leafNodes, parentNodes};nodes = nodes(idx);leafNodes = rmfield(nodes{1}, fieldnames(nodes{1}){1});fieldName = ['node', num2str(numel(parentNodes) + 1)];parentNodes.(fieldName) = freq(1);parentNodes.(fieldName) = nodes{1};parentNodes = rmfield(parentNodes, fieldName);end```以上是该示例的部分Matlab代码,通过对费诺树的构建和遍历,我们可以得到每个符号的费诺编码,从而实现数据的压缩和解压缩。
如何用Matlab进行数据编码与解码
![如何用Matlab进行数据编码与解码](https://img.taocdn.com/s3/m/90273d70c950ad02de80d4d8d15abe23482f0391.png)
如何用Matlab进行数据编码与解码引言:数据编码与解码是信息传输中的重要环节。
在如今信息爆炸的时代,我们需要有效地处理和传输大量的数据。
Matlab作为一种强大的数学计算软件,可以帮助我们实现数据编码与解码的过程。
本文将介绍如何用Matlab进行数据编码与解码的实践方法和技巧。
一、了解数据编码与解码的基本概念数据编码是将原始数据转换成特定的编码形式,以便在传输或存储中使用。
解码是将编码后的数据恢复为原始数据的过程。
在数据编码与解码中,常用的方法包括二进制编码、ASCII编码、压缩编码等。
二、二进制编码与解码二进制编码是将数据转换成由0和1组成的串。
Matlab中可以使用bitget函数将数据转换为二进制码,如下所示:```matlabdata = 123;binary_code = dec2bin(data);```二进制解码是将二进制码恢复为原始数据。
可以使用bin2dec函数将二进制码转换为十进制数,如下所示:```matlabbinary_code = '1111011';data = bin2dec(binary_code);```三、ASCII编码与解码ASCII编码是将字符转换成对应的数值。
在Matlab中可以使用double函数将字符转换为对应的ASCII码,如下所示:```matlabcharacter = 'A';ascii_code = double(character);```ASCII解码是将ASCII码恢复为对应的字符。
可以使用char函数将ASCII码转换为字符,如下所示:```matlabascii_code = 65;character = char(ascii_code);```四、压缩编码与解码压缩编码是将冗余的数据进行压缩以减少存储或传输的空间。
Matlab中可以使用Huffman编码进行压缩编码与解码。
首先需要通过统计频率建立Huffman树,然后根据Huffman树生成编码,并将数据编码为位流。
MATLAB香农编码和费诺编码
![MATLAB香农编码和费诺编码](https://img.taocdn.com/s3/m/a6ee0ce09f3143323968011ca300a6c30c22f1e4.png)
functi on vararg out = sy(vararg in)gui_Si nglet on = 1;gui_St ate = struct('gui_Na me', mfilen ame, ...'gui_Si nglet on', gui_Si nglet on, ...'gui_Op ening Fcn', @sy_Ope ningF cn, ...'gui_Ou tputF cn', @sy_Out putFc n, ...'gui_La youtF cn', [], ...'gui_Ca llbac k', []);if nargin && ischar(vararg in{1})gui_St ate.gui_Ca llbac k = str2fu nc(vararg in{1});endif nargou t[vararg out{1:nargou t}] = gui_ma infcn(gui_St ate, vararg in{:}); elsegui_ma infcn(gui_St ate, vararg in{:});endfuncti on sy_Ope ningF cn(hObjec t, eventd ata, handle s, vararg in) handle s.output = hObjec t;guidat a(hObjec t, handle s);functi on vararg out = sy_Out putFc n(hObjec t, eventd ata, handle s) vararg out{1} = handle s.output;functi on edit1_Callb ack(hObjec t, eventd ata, handle s)functi on edit1_Creat eFcn(hObjec t, eventd ata, handle s)if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');endfuncti on radiob utton2_Cal lback(hObjec t, eventd ata, handle s)set(handle s.radiob utton3,'value',0);functi on radiob utton3_Cal lback(hObjec t, eventd ata, handle s)set(handle s.radiob utton2,'value',0);functi on listbo x3_Ca llbac k(hObjec t, eventd ata, handle s)functi on listbo x3_Cr eateF cn(hObjec t, eventd ata, handle s)if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');endfuncti on edit3_Callb ack(hObjec t, eventd ata, handle s)functi on edit3_Creat eFcn(hObjec t, eventd ata, handle s)if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');endfuncti on edit4_Callb ack(hObjec t, eventd ata, handle s)functi on edit4_Creat eFcn(hObjec t, eventd ata, handle s)if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');endfuncti on listbo x4_Ca llbac k(hObjec t, eventd ata, handle s)functi on listbo x4_Cr eateF cn(hObjec t, eventd ata, handle s)if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');endfuncti on edit5_Callb ack(hObjec t, eventd ata, handle s)functi on edit5_Creat eFcn(hObjec t, eventd ata, handle s)if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');endfuncti on pushbu tton9_Call back(hObjec t, eventd ata, handle s) r1=get(handle s.radiob utton2,'value');if r1==1s1=get(handle s.edit1,'String')len=length(s1);t=2;q=0;b(1)=s1(1);for i=2:lenfor j=1:i-1if s1(j)==s1(i)q=1;break;endendif q==0b(t)=s1(i);t=t+1;endq=0;endL=length(b)for i=1:La=0;for j=1:lenif b(i)==s1(j)a=a+1;count(i)=a;endendendcount=count/len;p=countl=0;H=-p*(log2(p))';for i=1:L-1for j=i+1:Lif p(i)<=p(j)m=p(j);p(j)=p(i);p(i)=m;endendendfor i=1:La=-log2(p(i));w(i)=fix(a+1);l=l+p(i)*w(i);endn=H/l;P(1)=0;for i=2:LP(i)=0;for j=1:i-1P(i)=P(i)+p(j);endendfor i=1:Lfor j=1:w(i)W(i,j)=fix(P(i)*2);P(i)=P(i)*2-fix(P(i)*2);endout{i,:}=num2st r(W(i,:));endset(handle s.listbo x6,'String',p); for i=1:L-1 %for j=i+1:Lif count(i)<count(j)m=b(j);b(j)=b(i);b(i)=m;endendendset(handle s.listbo x5,'string',b'); set(handle s.edit5,'String',H);set(handle s.listbo x4,'String',out); set(handle s.edit3,'String',l);set(handle s.edit4,'String',n);elses1=get(handle s.edit1,'String')len=length(s1)t=2;q=0;b(1)=s1(1);for i=2:lenfor j=1:i-1if s1(j)==s1(i)q=1;break;endendif q==0b(t)=s1(i);t=t+1;endq=0;endL=length(b);for i=1:Lfor j=1:lenif b(i)==s1(j)a=a+1;count(i)=a;endendendfor i=1:L-1for j=i+1:Lif count(i)<count(j)m=b(j);b(j)=b(i);b(i)=m;endendendcount=count/len;p=countfor i=1:L-1for j=i+1:Lif p(i)<p(j)m=p(j);p(j)=p(i);p(i)=m;endendendc=fano(p);c1=str2do uble(c')n=length(c);k=[];for i=1:nk=[k,length(c{i})];endH=-p*(log2(p))';mc=p*k'n=H/mcset(handle s.edit5,'String',H);set(handle s.listbo x4,'String',c1);set(handle s.edit3,'String',mc);set(handle s.edit4,'String',n);set(handle s.listbo x5,'string',b');set(handle s.listbo x6,'string',p);endfuncti on listbo x5_Ca llbac k(hObjec t, eventd ata, handle s) functi on listbo x5_Cr eateF cn(hObjec t, eventd ata, handle s) if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');endfuncti on listbo x6_Ca llbac k(hObjec t, eventd ata, handle s) functi on listbo x6_Cr eateF cn(hObjec t, eventd ata, handle s) if ispc && isequa l(get(hObjec t,'Backgr oundC olor'),get(0,'defaul tUico ntrol Backg round Color'))set(hObjec t,'Backgr oundC olor','white');end。
信息论与编码matlab1
![信息论与编码matlab1](https://img.taocdn.com/s3/m/d407da0390c69ec3d5bb75c5.png)
信息论实验报告姓名胡小辉班级电子信息工程0902 学号 **********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。
实验1 Huffman编码生成器-matlab
![实验1 Huffman编码生成器-matlab](https://img.taocdn.com/s3/m/d5634066a45177232f60a25d.png)
1.计算机
2.Windows 2000或以上
3.MatLab
四、实验原理
Huffman编码算法
为使平均码长最短,必须使最后一步缩减信源有m个信源符号。如果第一步给概率最小的符号分配码元时,所取的符号数就不一定是m个。
对于m进制编码,若所有码字构成全树,可分离的码字数必为m+k(m-1),式中k为非负整数,即缩减次数。
% L为编码返回的平均码字长度,q为编码效率%
%*****************************************%
function [W,L,q]=huffman(P)
if (length(find(P<=0))~=0)
error('Not a prob.vector,negative component'); %判断是否符合概率分布条件
% H为信息熵%
%******************************%
function H=entropy(P,r)
if (length(find(P<=0))~=0)
error('Not a prob.vector,negative component'); %判断是否符合概率分布条件
end
s2='Huffman编码平均码字长度L:';
s3='Huffman编码的编码效率q:';
disp(s0);
disp(s1),disp(B),disp(W);
disp(s2),disp(L);
disp(s3),disp(q);
%函数说明:%
% H=entropy(P,r)为信息熵函数%
huffman编码的matlab实现
![huffman编码的matlab实现](https://img.taocdn.com/s3/m/3816ee4758fafab069dc0234.png)
%生成一个n-1行n列的数组
概率数组q进行从小至大的排序,并且用l数组返回一个数组,该数组表示概率数组q 排序前的顺序编号
%由数组l构建一个矩阵,该矩阵表明概率合并时的顺序,用于后面的编码
%将排序后的概率数组q的前两项,即概率最小的两个数加和,得到新的一组概率序列
end for i=1:n-1
%生成一个n-1行n列,并且每个元素的的长度为n的空白数组,c矩阵用于进行huffman编码,并且在编 码中与a矩阵有一定的对应关系
c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(a(n-i+1,:)==j+1)-1)+1:n*find(a(ni+1,:)==j+1)) %矩阵c中第n-i行第j+1列的值等于对应于a矩阵中第n-i+1行中值为j+1的前面一
个元素的位置在c矩阵中的编码值
end end for i=1:n
霍夫曼编码方法的具体过程是:首先把信源的各个输出符 号序列按概率递降的顺序排列起来,求其中概率最小的两个序 列的概率之和,并把这个概率之和看作是一个符号序列的概 率,再与其他序依概率递降顺序排列(参与求概率之和的这 两个序列不再出现在新的排列之中),然后,对参与概率求和 的两个符号序列分别赋予二进制数字0和1。继续这样的操作, 直到剩下一个以1为概率的符号序列。最后,按照与编码过程 相反的顺序读出各个符号序列所对应的二进制数字组,就可分 别得到各该符号序列的码字。
%完成huffman码字的分配
ind(a(1,:)==i)*n) %用h表示最后的huffman编码,矩阵h的第i行的元素对应于矩阵c的第一行的第i个元素
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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
[5]信源符号所对应的码字即为费诺码。
例:有一幅40个像素组成的灰度图像,灰度共有5级,分别用符号A,B,C,D和E表示。40个像素中出现灰度A的像素数有15个,出现灰度B的像素数有7个,出现灰度C的像素数有7个,其余情况见表。
符号
现的次数
15
7
7
6
5
编码00
01
10
10
110
111
费诺编码方法属于概率匹配编码,具有如下特点:
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'];
多媒体技术实验报告
学院:城南学院
姓名:学号:
指导老师:尹波
时间:2015年11月25日
实验一:费诺编码的matlab实现
1.实验目的
1)掌握费诺编码的思想和具体方法。
2)用MATLAB语言实现费诺编码。
2.实验原理及编码思想:
费诺编码属于概率匹配编码,但不是最佳的编码方法。在编N进制码时首先将信源消息符号按其出现的概率依次由大到小排列开来,并将排列好的信源符号按概率值分N大组,使N组的概率之和近似相同,并对各组赋予一个N进制码元0、1……N-1。之后再针对每一大组内的信源符号做如上的处理,即再分为概率和相同的N组,赋予N进制码元。如此重复,直至每组只剩下一个信源符号为止。此时每个信源符号所对应的码字即为费诺码。
计算:信息熵是多少?上述编码方法的平均码长是多少?
信息熵是2.7829;平均码长是2.88;
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);
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;
具体过程如下:
[1]将信源消息符号按其出现的概率大小依次排列:P1>=P2>=…>=Pn。
[2]依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。
[3]使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。
[4]如此重复,直至每个组只剩下一个信源符号为止。
end
end
B
A
END
for i=1:n
[u,v]=size(char(END(i)));
L(i)=v;
end
avlen=sum(L.*A)
H=-sum(A.*log2(A));
disp(['ENtropy of the source:',num2str(H),'bits']);
5.实验结果
实验运行结果(以[0.19,0.18,0.17,0.16,0.13,0.10,0.06,0.01]为例)
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
%生成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)