编写matlab函数实现huffman编码的算法

合集下载

r元huffman编码的matlab实现

r元huffman编码的matlab实现

r元huffman编码的matlab实现在数据压缩中,Huffman编码是一种常用的编码方式,它可以通过对不同字符出现频率的统计来生成一个不同长度的编码表,从而实现数据的压缩和解压缩。

而r元Huffman编码则是在Huffman编码的基础上增加了一个参数r,用于指定编码表中每个编码的长度必须是r的倍数。

这种编码方式在某些应用中,如无线传感器网络中的数据传输,有着更好的适用性和效率。

本文将介绍如何使用MATLAB实现r元Huffman编码。

具体步骤如下:1. 首先,需要先对数据进行预处理,将数据划分为长度为r的组,对每个组进行编码。

可以使用MATLAB中的reshape函数来完成这一步骤。

2. 对每个编码组进行频率统计,得到每个符号出现的频率。

3. 根据频率生成Huffman树,并构建编码表。

4. 将每个编码组按照编码表进行编码,生成压缩后的数据。

5. 对压缩后的数据进行解压缩,得到原始数据。

下面是一个简单的r元Huffman编码的MATLAB实现示例:```matlabfunction [compressed_data, codebook] =rHuffman_encode(input_data, r)% 输入参数:% input_data: 待压缩的数据,一个一维向量% r: 编码长度,一个正整数% 输出参数:% compressed_data: 压缩后的数据,一个一维向量% codebook: 编码表,一个结构体数组,每个结构体包含一个符号和对应编码% 预处理数据,将数据划分为长度为r的组num_groups = floor(length(input_data)/r);input_data = input_data(1:num_groups*r);input_data = reshape(input_data, r, num_groups)';% 对每个组进行频率统计freq = hist(input_data(:), unique(input_data(:)));% 生成Huffman树,并构建编码表tree = huffTree(freq);codebook = huffCode(tree);% 对每个编码组进行编码compressed_data = [];for i=1:num_groupsgroup_code = codebook([codebook.symbol] ==input_data(i,1)).code;for j=2:rgroup_code = [group_code, codebook([codebook.symbol] == input_data(i,j)).code];endcompressed_data = [compressed_data, group_code];endendfunction decoded_data = rHuffman_decode(compressed_data, codebook, r)% 输入参数:% compressed_data: 压缩后的数据,一个一维向量% codebook: 编码表,一个结构体数组,每个结构体包含一个符号和对应编码% r: 编码长度,一个正整数% 输出参数:% decoded_data: 解压缩后的数据,一个一维向量% 根据编码表进行解码decoded_data = [];while ~isempty(compressed_data)code = compressed_data(1:r);for i=1:length(codebook)if strcmp(code, codebook(i).code)decoded_data = [decoded_data, codebook(i).symbol];compressed_data = compressed_data(r+1:end);break;endendendend```以上代码实现了r元Huffman编码的两个基本函数:编码函数`rHuffman_encode`和解码函数`rHuffman_decode`。

(完整word版)huffman编码的matlab实现

(完整word版)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足够大时,上述编码几乎没有失真;反之,若这个条件不满足,就不可能实现无失真的编码。

Matlab函数实现哈夫曼编码算法

Matlab函数实现哈夫曼编码算法

编写Matlab函数实现哈夫曼编码的算法一、设计目的和意义在当今信息化时代,数字信号充斥着各个角落。

在数字信号的处理和传输中,信源编码是首先遇到的问题,一个信源编码的好坏优劣直接影响到了后面的处理和传输。

如何无失真地编码,如何使编码的效率最高,成为了大家研究的对象。

哈夫曼编码就是其中的一种,哈夫曼编码是一种变长的编码方案。

它由最优二叉树既哈夫曼树得到编码,码元内容为到根结点的路径中与父结点的左右子树的标识。

所以哈夫曼在编码在数字通信中有着重要的意义。

可以根据信源符号的使用概率的高低来确定码元的长度。

既实现了信源的无失真地编码,又使得编码的效率最高。

二、设计原理哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。

uffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。

而哈夫曼编码的第一步工作就是构造哈夫曼树。

哈夫曼二叉树的构造方法原则如下,假设有n个权值,则构造出的哈夫曼树有n个叶子结点。

n 个权值分别设为w1、w2、…、wn,则哈夫曼树的构造规则为:(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;(3)从森林中删除选取的两棵树,并将新树加入森林;(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

具体过程如下图1产所示:(例)图1 哈夫曼树构建过程哈夫曼树构造成功后,就可以根据哈夫曼树对信源符号进行哈夫曼编码。

具体过程为先找到要编码符号在哈夫曼树中的位置,然后求该叶子节点到根节点的路径,其中节点的左孩子路径标识为0,右孩子路径标识为1,最后的表示路径的01编码既为该符号的哈夫曼编码。

实验 Huffman编码(含matlab代码)

实验 Huffman编码(含matlab代码)

实验二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实现

Matlab 中实现哈夫曼编译码:n=input('Please input the total number: ');hf=zeros(2*n-1,5);hq=[];for ki=1:nhf(ki,1)=ki;hf(ki,2)=input('Please input the frequency: ');hq=[hq,hf(ki,2)];endfor ki=n+1:2*n-1hf(ki,1)=ki;mhq1=min(hq);m=size(hq);m=m(:,2);k=1;while k<=m%del min1if hq(:,k)==mhq1hq=[hq(:,1:(k-1)) hq(:,(k+1):m)];m=m-1;breakelsek=k+1;endendk=1;while hf(k,2)~=mhq1|hf(k,5)==1%find min1 location k=k+1;endhf(k,5)=1;k1=k;mhq2=min(hq);k=1;while k<=m%del min2if hq(:,k)==mhq2hq=[hq(:,1:(k-1)) hq(:,(k+1):m)];m=m-1;breakelseendendk=1;while hf(k,2)~=mhq2|hf(k,5)==1%find min2 locationk=k+1;endhf(k,5)=1;k2=k;hf(ki,2)=mhq1+mhq2;hf(ki,3)=k1;hf(ki,4)=k2;hq=[hq hf(ki,2)];endclcchoose=input('Please choose what you want:\n1: Encoding\n2: Decoding\n3:.Exit\n');while choose==1|choose==2if choose==1a=input('Please input the letter you want to Encoding: ');k=1;while hf(k,2)~=ak=k+1;if k>=ndisplay('Error! You did not input this number.');breakendendif k>=nbreakendr=[];while hf(k,5)==1kc=n+1;while hf(kc,3)~=k&hf(kc,4)~=kkc=kc+1;endif hf(kc,3)==kelser=[1 r];endk=kc;endrelsea=input('Please input the metrix you want to Decoding: ');sa=size(a);sa=sa(:,2);k=2*n-1;while sa~=0if a(:,1)==0k=hf(k,3);elsek=hf(k,4);enda=a(:,2:sa);sa=sa-1;if k==0display('Error! The metrix you entered is a wrong one.');breakendendif k==0breakendr=hf(k,2);endchoose=input('Please choose what you want:\n1: Encoding\n2: Decoding\n3:.Exit\n');clc;endif choose~=1&choose~=2clc;end。

霍夫曼编码matlab

霍夫曼编码matlab

霍夫曼编码matlab在Matlab中实现霍夫曼编码可以通过以下步骤完成:1. 构建霍夫曼树,首先,你需要根据输入的数据统计每个符号出现的频率。

然后,使用这些频率构建霍夫曼树。

你可以使用Matlab中的数据结构来表示霍夫曼树,比如使用结构体或者类来表示节点。

2. 生成霍夫曼编码,一旦构建了霍夫曼树,你可以通过遍历树的方式生成每个符号对应的霍夫曼编码。

这可以通过递归或者迭代的方式实现。

3. 对数据进行编码和解码,使用生成的霍夫曼编码对输入的数据进行编码,然后再对编码后的数据进行解码。

这可以帮助你验证霍夫曼编码的正确性。

以下是一个简单的示例代码,用于在Matlab中实现霍夫曼编码: matlab.% 假设有一个包含符号频率的向量 freq 和对应符号的向量symbols.% 构建霍夫曼树。

huffTree = hufftree(freq);% 生成霍夫曼编码。

huffCodes = huffenco(symbols, huffTree);% 对数据进行编码。

data = [1 0 1 1 0 1 1 1]; % 你的输入数据。

encodedData = huffenco(data, huffCodes);% 对数据进行解码。

decodedData = huffmandeco(encodedData, huffTree);需要注意的是,以上代码仅为简单示例,实际应用中可能需要根据具体情况进行调整和完善。

同时,对于大规模数据的处理,也需要考虑到内存和性能方面的优化。

希望这个简单的示例能够帮助你在Matlab中实现霍夫曼编码。

霍夫曼编码的MATLAB实现

霍夫曼编码的MATLAB实现

霍夫曼编码的MATLAB实现%哈夫曼编码的MATLAB实现(基于0、1编码):clc;clear;A=[0.3,0.2,0.1,0.2,0.2];信源消息的概率序列A=fliplr(sort(A));%按降序排列T=A;[m,n]=size(A);B=zeros(n,n-1);%空的编码表(矩阵)for i=1:nB(i,1)=T(i);%生成编码表的第一列endr=B(i,1)+B(i-1,1);%最后两个元素相加T(n-1)=r;T(n)=0;T=fliplr(sort(T));t=n-1;for j=2:n-1%生成编码表的其他各列for i=1:tB(i,j)=T(i);endK=find(T==r);B(n,j)=K(end);%从第二列开始,每列的最后一个元素记录特征元素在%该列的位置r=(B(t-1,j)+B(t,j));%最后两个元素相加T(t-1)=r;T(t)=0;T=fliplr(sort(T));endB;%输出编码表END1=sym('[0,1]');%给最后一列的元素编码END=END1;t=3;d=1;for j=n-2:-1:1%从倒数第二列开始依次对各列元素编码for i=1:t-2if i>1 & B(i,j)==B(i-1,j)d=d+1;elsed=1;endB(B(n,j+1),j+1)=-1;temp=B(:,j+1);x=find(temp==B(i,j));END(i)=END1(x(d));endy=B(n,j+1);END(t-1)=[char(END1(y)),'0'];END(t)=[char(END1(y)),'1'];t=t+1;END1=END;endA%排序后的原概率序列END%编码结果for i=1:n[a,b]=size(char(END(i)));endavlen=sum(L.*A)%平均码长H1=log2(A);H=-A*(H1')%熵P=H/avlen%编码效率提取这一列两个最小值相加在后一列中的位置以及其编码。

Huffman编码(哈夫曼编码)的Matlab实现

Huffman编码(哈夫曼编码)的Matlab实现

clea r allf printf (' Re a ding data、、、')d ata= imreadC camera man、tif');da t a=uin t 8 (da t a) ;%读入数据,井将数据限制为u i n t 8fprintfC Done!\n')%编码压缩fprintf pre s sing da t a、、、):[z i pp e d, info] = n orm 2 huff (data):fprintfC D one!\n )%解压缩fp rin t f (* pressing data、、、');u nzi p ped=h u ff 2 n o r m(zi p ped, in f 0 );f p r intf (' Done!\n* )%测试就能否无失貞.isOK=i s e qua 1 (data(:)»unz i pp ed(:))%显示压缩效果whos da t a z ippe d u n z i ppedfun c ti 0 n [zi pp ed, info] =norm2 h u f f ( v e c t or)if ~isa( Y ect o r,' uint 8 *)»er r or C i npu tar gume n t must be a uint 8 vector*)endvecto r =ve c t o r (:)':%将输入向量转换为行向量f=freq u en c y (vec t or);%讣算个元素出现猖概率sirabo I s=fi n d (f"=0);f=f(simbols);%W元素按出现得概率排列[f, s 0 rti n d ex] = s ot (f ):simbols = simbols( s ortindex):%产生码字ge n e r ate the c odeword as the 5 2 bi t s of a do u bl elen= 1 e ng t h( s imb o Is);s i mb 0 ls_in d ex=num2cell (1: len);c odew 0rd_tmp= c elKle n , 1 ):wh i le le n g t h ( f )〉1,ind exl= s imb o ls_index⑴;index 2 =simb o 1 s _in d ex{ 2 };codeword_tm p (i n dexl)=a d dnod e( c odeword_tmp (ind e xl) .u i n t8(0)); c 0 d e w 0 rd_ t mp( ind ex2) = a ddno d e (co d e word_tm p (index 2 ), u i ntS (1 )):f=[sum (f(1:2)) fC3:end)];simbols_in d e x=[{[ i n d e x 1 i n d e x2]} simb o ls_ i ndex (3:e n d )];%将数据重新排列,就是两个右点得频率尽量与前一个iT点得频率想肖r esort da t a in orde r to h av e two no d es w i th ! ov e r fr e que n cy asfirst to[ft so r ti n dex]=sort(f):sim b ols_index=s i mbols_index(so r tindex):end$对应相应得元素与码字codew ord =cell( 2 56 :1);c odew 0 rd (sim b ols)=codew o rd_tmp :%讣算总得字符串长度len=0:for index=l : length (vector) >le n =1 e n+ 1 ength (codew ord {doubl e (vector (index) )+1)): end%产生01序列st r ing=repraa t (u i n t8(0)» I en);poin t er= I :for inde x =1:1 e ngth(vect or),co d e=cod eword{dou b 1 e(v e ct o r (inde x ))+1};le n =length(co de);strin s (pointer+(0 :len-l)) =code;poin t e r=poin t er+len :en d%如果需要,加零len= 1 ength ( s tring);p ad=8-mod (1 e n, 8);辻 pad> 0 ,s t ring=[ s tring u in t 8(zeros (1 , pad))];end财呆存实际有用得码字cod e wo r d=co d ew o rd (simbo 1 s);c ode I en=z e r o s (s i ze (codeword ));weigh t s=2、* (0:23);max c ode I e n= 0 ;fo r ind ex 1; length ( cod ew ord), len=lengt h (cod e word{i n de x });ifen dend co d eword= [code wor d {:}] 1 e n>m a s c od e 1 e n,max cod e le n =len :n d1 e n>0rc 0 de=sum(w e ig li t s ( codeword {index} ==1)):cod e =bitset(cod e , le n +1);cod eword {i nd ex} =code :co d ele n (ind e x) =len;e if%汁算压缩后得向量co ls= I eng t h( s tri n g) / 8 ;s t r i ng= r eshape (strin g , 8, co 1 s);weights=2、* ( 0 : 7 );zip p e d = U intS (weights*d o u b 1 e (st ring)):%存储一个稀疏矩阵h uf f c 0 des=sp arse (1, 1);% init s p arse ma t r ixfor in d e x=l: nu me 1 ( c odeword),huffcod e s( c o dewo r d (ind e x), 1 ) =s i m b ols (index):end瓯产生信息结构体i nfox pad = pad ;info、rati o =cols、/leng t h(v e c tor):i n fox 1 en g th=l e ngth(vec t or);info, max c od e len=maxc o de 1 en;fun c t i 0 n codewor d _new=a d dno d e (co d eword_old, item)codew ord _ne w=cell ( s iz e (cod e word_ol d )):for index=l;lens t hCcodewor d _old),c 0de w 0 rd_new{in dex}=Eitemcod ewo r d _old{i n de x }];endfu n c t ion v e c t or=huf f 2norm (zipped, info)%HVFF2X0R>I Huffman 解码器%IIVFF2N0RM(X, INFO)根据倚息体结构info返回向星zipped得解码结果%%矩阵参数以X(:)形成输入i f 2 i S a ( Z i P ped,' uintS*).error (' i n pu t a r gumen t mus t be a uintS vector')end%产生01序列1 e n=l e ngth(zi p p ed);str i ng=repma t (uint 8 (0) ,1, len^ * 8 );b it i n dex= 1 :8;for i n d e s+1:I en,s t r in s (b i tindes+g、* (ind e x -1)) =uint8( b itget ( z ipped(index), bitind ex));end%调整字符串st r ing= I 0 gica 1 (st r ing (:)');% remove 0 padd i n g1 e n =lengt h ( s t ring);%解码weig h t s =2、* (0:51):V ecto r =re p mat (uintS ( 0 ) , 1 , in f o, length);vec t orind e x=l;c 0 deinde x =1:c 0 de=O;for i n d ex=l: le n ,code=bit s et(coder cod e i n des, s t r i ng (ind ex));] codein d e x=c o de i n d ex+ 1 ;byte=dec o de ( b i t set ( c o de, codei n dex), i n f o):if by t e>0- % V e ctor ( V ector i n d ex) =byte-l;cod ei n d e x= 1 :code = 0;vecto r i n d e X = V ect o rindex+ 1 ;endendfu n Ct i 0 n b yt e =d e code (code, i nfo)b y te=in f o、huf f cod e s (code);func t ion f=frequ e ncy (v e ct o r )幣FREQUENCY计算元素出现概率I f^isa(v e ctor,' u i nt8'),e rror ('input a r gum ent mu st b e a uin t 8 vector') endf =repm a t (Or 1* 2 5 6);%扫描向量len= length (vec t or);for ind e s= 0 :256, %f (ind ex+1) =sum(ve c tor==uint8(i n de x ));end%归一化f=f、/ 1 e n :。

Huffman编码及译码的MATLAB实现

Huffman编码及译码的MATLAB实现

Huffman编码及译码的MATLAB实现沈逸峰(上海师范大学信息与机电工程学院,上海200333)摘要:本论文首先介绍了Huffman编码的原理以及与其它编码相比它的优势随在,随后基于Huffman编码的原理,利用MATLAB编译出26个英文字母加空格的Huffman码表以及相应的编码和译码程序。

关键词:Huffman,MATLABImplement of Huffman code and decode in MatlabShen Yi-feng(School of Information and Engineering.Shanghai NormalUniversity.Shanghai.200333)Abstract:This article has mainly introduced the theory of Huffman Code and the advantage of this code.Then, we use MATLAB to find the code table for the English alphabet and space based on Huffman Code theory. Finally, we design the code and decode program for these alphabet and space based on the same theory.Key words:Huffman, MATLAB1.引言Huffman编码属于信源编码,由于信源符号之间存在分布不均匀和相关性,致使信源存在冗余度。

因此信源编码的主要任务就是减少冗余,从而提高编码的效率。

信源编码的关键是信息论中的两个基本定理[1]:无失真编码定理和限失真编码定理,其中,无失真编码定理可看成是可逆编码的基础,即当信源符号变换为代码后,可从代码无失真地恢复原信号,本文所研究的Huffman编码即是一种基于无失真编码定理的最佳无失真信源编码2.Huffman编码简介及其优势Huffman 是一种可变字长编码,即编码后信源符号的码长是不一样的,一般而言出现概率高的信源符号码长较短,而出现概率小的信源符号码长较长。

huffman编码用matlab的实现

huffman编码用matlab的实现

Huffman编码用MTLAB的实现及编码注释一、实验目的1、学习Matlab软件的使用和编程;2、进一步深入理解Huffman编码算法的原理;3、提高独立进行算法编程的能力.二、实验环境硬件:计算机软件:Windows 2003和MATLAB编程环境。

三、实验内容1、用Matlab实现Huffman编码算法程序;2、要求程序输出显示所有的码字以及编码效率;3、设计简单的输入界面(可以是简单的文字提示信息),程序运行时提示用户输入代表信源符号概率的向量;要对用户输入的概率向量进行合法性检查。

四、实验原理1、二进制Huffman编码的基本原理及算法(1)把信源符号集中的所有符号按概率从大到小排队。

(2) 取概率最小的两个符号作为两片叶子合并(缩减)到一个节点.(3)视此节点为新符号,其概率等于被合并(缩减)的两个概率之和,参与概率排队.(4)重复(2)(3)两步骤,直至全部符号都被合并(缩减)到根。

(5) 从根出发,对各分枝标记0和1。

从根到叶的路径就给出了各个码字的编码和码长。

2、程序设计的原理(1)程序的输入:以一维数组的形式输入要进行huffman编码的信源符号的概率,在运行该程序前,显示文字提示信息,提示所要输入的概率矢量;然后对输入的概率矢量进行合法性判断,原则为:如果概率矢量中存在小于0的项,则输入不合法,提示重新输入;如果概率矢量的求和大于1,则输入也不合法,提示重新输入。

(2)huffman编码具体实现原理:1>在输入的概率矩阵p正确的前提条件下,对p进行排序,并用矩阵L记录p排序之前各元素的顺序,然后将排序后的概率数组p的前两项,即概率最小的两个数加和,得到新的一组概率序列,重复以上过程,最后得到一个记录概率加和过程的矩阵p以及每次排序之前概率顺序的矩阵a。

2〉新生成一个n—1行n列,并且每个元素含有n个字符的空白矩阵,然后进行huffman编码:将c矩阵的第n-1行的第一和第二个元素分别令为0和1(表示在编码时,根节点之下的概率较小的元素后补0,概率较大的元素后补1,后面的编码都遵守这个原则)然后对n-i—1的第一、二个元素进行编码,首先在矩阵a中第n-i行找到值为1所在的位置,然后在c矩阵中第n-i行中找到对应位置的编码(该编码即为第n-i—1行第一、二个元素的根节点),则矩阵c的第n—i行的第一、二个元素的n-1的字符为以上求得的编码值,根据之前的规则,第一个元素最后补0,第二个元素最后补1,则完成该行的第一二个元素的编码,最后将该行的其他元素按照“矩阵c中第n-i行第j+1列的值等于对应于a矩阵中第n—i+1行中值为j+1的前面一个元素的位置在c矩阵中的编码值”的原则进行赋值,重复以上过程即可完成huffman编码。

霍夫曼编码的matlab实现

霍夫曼编码的matlab实现

霍夫曼编码的matlab实现霍夫曼编码的matlab实现一、实验内容:用Matlab语言编程实现霍夫曼(Huffman)编码。

二、实验原理及编码思想: 霍夫曼(Huffman)编码算法是满足前缀条件的平均二进制码长最短的编-源输出符号,而将较短的编码码字分配给较大概率的信源输出。

算法是:在信源符号集合中,首先将两个最小概率的信源输出合并为新的输出,其概率是两个相应输出符号概率之和。

这一过程重复下去,直到只剩下一个合并输出为止,这个最后的合并输出符号的概率为1。

这样就得到了一张树图,从树根开始,将编码符号1 和0 分配在同一节点的任意两分支上,这一分配过程重复直到树叶。

从树根到树叶途经支路上的编码最后就构成了一组异前置码,就是霍夫曼编码输出。

以本教材P36例题3-2信源为例:离散无记忆信源:U u1 u2 u3 u4 u5P(U) = 0.4 0.2 0.2 0.1 0.1解:概率信符s编码过程 i P(s) i码字W i第一次第二次第三次1W=0 0.4 0.6 S0.4 0.4 11A(1) 1 W=10 S0.4 0.2 0.2 22 0 0.4 1 W=111 S 0.2 0.2 330 0.2 1 W=1101 S 0.1 440.2 0W=1100 S 0.1 550通过上表的对信源缩减合并过程,从而完成了对信源的霍夫曼编码。

三、程序设计思路分为两步,首先是码树形成过程:对信源概率进行合并形成编码码树。

然后是码树回溯过程:在码树上分配编码码字并最终得到霍夫曼编码。

1、码树形成过程:将信源概率按照从小到大顺序排序并建立相应的位置索引。

然后按上述规则进行信源合并,再对信源进行排序并建立新的位置索引,直到合并结束。

在这一过程中每一次都把排序后的信源概率存入矩阵G中,位置索引存入矩阵Index中。

这样,由排序之后的概率矩阵 G以及索引矩阵Index就可以恢复原概率矩阵P了,从而保证了回溯过程能够进行下去。

基于matlab对哈夫曼编码的实现

基于matlab对哈夫曼编码的实现

在MATLAB中实现哈夫曼编码需要先建立哈夫曼树,然后基于这颗哈夫曼树生成对应的哈夫曼编码。

以下是使用MATLAB实现哈夫曼编码的简单步骤:
假设你有一个要编码的符号集合symSet和这些符号的概率集合probSet。

1.计算频率和概率: 首先,我们需要计算每个符号的频率和概率。

freq = histc(symSet, symSet); % 计算频率
prob = freq / sum(freq); % 计算概率
2.构建哈夫曼树: 使用huffTree函数构建哈夫曼树。

[huffTree, huffCodes] = huffTree(prob);
3.生成哈夫曼编码: 使用huffmanenco函数生成哈夫曼编码。

huffmanCodes = huffmanenco(symSet, huffTree);
4.测试: 使用生成的哈夫曼编码对原始数据进行编码和解码。

originalData = symSet(randperm(length(symSet), 1000)); % 随机生成1000个原始数据
encodedData = huffmanenco(originalData, huffTree); % 对原始数据进行编码
decodedData = huffDeco(encodedData, huffCodes); % 解码编码后的数据
5.比较解码后的数据与原始数据: 检查解码后的数据是否与原始数据匹配。

以上是MATLAB实现哈夫曼编码的基本步骤,具体的代码可能需要根据你的数据和需要进行一些调整。

基于MATLAB的霍夫曼程序设计

基于MATLAB的霍夫曼程序设计

本科课程设计基于MATLAB的霍夫曼编码设计院(系)名称专业名称学生姓名学号指导教师完成时间2016.12.31基于MATLAB 的霍夫曼编码设计霍夫曼编码是一种无损的统计编码方法,利用信息符号概率分布特性改变字长进行编码。

霍夫曼编码适用于多元独立信源,对于多元独立信源来说它是最佳码。

1 基本原理霍夫曼编码是一种利用信息符号概率分布特征的变字长的编码方法,即对于出现概率大的信息符号编以短字长的码,对于出现概率小的信息符号编以长字长的码。

如果码字长度严格按照所对应符号出现概率大小逆序排列,则编码结果的平均码字长度一定小于任何其他排列形式。

霍夫曼编码则是严格按照信源符号出现的概率大小来构造码字,因此这种编码方式形成的平均码字长度最短。

霍夫曼编码系统主要分为压缩对象输入、概率统计、构造Huffman 树、生成Huffman树、压缩编码环节组成,如图所示霍夫曼解码系统构成。

编程依据霍夫曼的编程步骤进行,实现对数据的压缩及其压缩参数的计算。

2霍夫曼编码的步骤:2.1将信源符号按出现概率从大到小排成一列,然后把最末两个符号的概率相加, 合成一个概率。

2.2 把这个符号的概率与其余符号的概率按从大到小排列,然后再把最末两个符号的概率加起来,合成一个概率。

2.3 重复上述做法,直到最后剩下两个概率为止。

2.4 从最后一步剩下的两个概率开始逐步反向进行编码。

没步只需对两个分支各赋予压缩图像输出图像输入一个二进制码,如对概率大的赋予码0,对概率小的赋予码1。

3 实例分析设输入信源L1,L2,L3,L4的概率分别为:0.5,0.19,0.19,0.12编码结果为:L1=0,L2=11,L3=100,L4=10,根据所给参数求得信息源熵为:平均码字长度为:编码效率为:%3.9881.178.1)(===R X H η78.1)12.0log 12.019.0log 19.019.0log 19.05.0log 5.0(log )(2222412=+++-=-=∑=k k k p P X H ∑==⨯+⨯+⨯+⨯==4181.1312.0319.0219.015.0k k k P B R冗余度为:017.0983.011=-=-=ηy压缩比为:4 程序%霍夫曼编码 李晓东130524050close all;clear all;clc; %关闭所有图形窗口,清楚工作空间所有变量,清除命令行 A=[0.5,0.19,0.19,0.12]; %信源消息的概率序列 A=fliplr(sort(A)); %按降序排列 T=A;[m,n]=size(A);B=zeros(n,n-1); %空的编码表(矩阵) for i=1:nB(i,1)=T(i); %生成编码表的第一列 endr=B(i,1)+B(i-1,1); %最后两个元素相加 T(n-1)=r; T(n)=0;T=fliplr(sort(T)); t=n-1;for j=2:n-1 %生成编码表的其他各列 for i=1:t B(i,j)=T(i); endK=find(T==r);B(n,j)=K(end); %从第二列开始,每列的最后一个元素记录特征元素在盖烈的位置 r=(B(t-1,j)+B(t,j)); %最后两个元素相加 T(t-1)=r; T(t)=0;T=fliplr(sort(T)); t=t-1; endB; %输出编码表END1=sym('[0,1]'); %给最后一列的元素编码 END=END1; t=3; d=1;for j=n-2:-1:1 for i=1:t-2if i>1&B(i,j)==B(i-1,j)11.181.12===R d rd=d+1;elsed=1;endB(B(n,j+1),j+1)=-1;temp=B(:,j+1);x=find(temp==B(i,j));END(i)=END1(x(d));endy=B(n,j+1);END(t-1)=[char(END1(y)),'0'];END(t)=[char(END1(y)),'1'];t=t+1;END1=END;enddisp('排序后的原概率序列P:');disp(A) %排序后的原概率序列disp('编码结果END')disp(END); %编码结果for i=1:n[a,b]=size(char(END(i)));L(i)=b;enddisp('平均码子长度')avlen=sum(L.*A);disp(avlen); %平均码长H1=log2(A);disp('信息熵')H=-A*(H1');disp(H) %熵disp('编码效率')A=H/avlen;disp(A) %编码效率5 运行结果排序后的原概率序列P:0.5000 0.1900 0.1900 0.1200编码结果END[ 0, 11, 100, 101]平均码子长度1.8100信息熵1.7775编码效率0.9821 6 程序截图。

huffman编码的matlab实现

huffman编码的matlab实现

%生成一个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个元素

编写matlab函数实现哈弗曼编码算法

编写matlab函数实现哈弗曼编码算法

西南科技大学课程设计报告课程名称:数字通信课程设计设计名称:编写Matlab函数实现哈夫曼编码的算法*名:***学号: ********班级:通信0802指导教师:胥磊(老师)起止日期:2011.6.28-2011.7.4西南科技大学信息工程学院制课程设计任务书学生班级:通信0802 学生姓名:林正红学号:20084866 设计名称:编写Matlab函数实现哈夫曼编码的算法起止日期:2011.6.28-2011.7.4 指导教师:胥磊(老师)课程设计学生日志课程设计考勤表课程设计评语表编写Matlab函数实现哈夫曼编码的算法一、设计目的和意义通过使用matlab编写哈夫曼编码的算法,以及最终算法实现的整个过程中,让我们学习Matlab 软件的使用和编程;进一步深入理解Huffman 编码算法的原理;提高独立进行算法编程的能力。

在此过程中,还需要用到数字电视原理里面的相关内容。

所以也能进一步了解关于熵编码,前缀码,信息量和信息熵,无失真信源编码定理,变字长编码等概念有更清晰的认识,也可以通过实验中的数据与等字长编码进行比较,体现出来变字长编码的优越性。

二、设计原理1、熵编码熵编码即编码过程中按熵原理不丢失任何信息的编码,解码后能无失真地恢复原图像。

信息熵为信源的平均信息量。

常见的熵编码有:行程编码(RLE)、LZW 编码、香农(Shannon)编码、哈夫曼(Huffman)编码和算术编码(arithmetic coding)。

熵编码的基本原理就是给出现概率较大的符号一个较短码字,而给出现概率较小的符号2、哈夫曼编码在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称"熵编码法"),用于数据的无损耗压缩。

这一术语是指使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。

这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 i N , Ri 被称为量化间隔,且在每个区域内选择一个点作量化级数。这样落
在区域内的随机变量的所有值都被量化为第 i 个量化级数,用 X i 来表示,这就意 味着:
x Ri ( x) xi
显而易见,这类量化引入了失真,其均方误差为:
d i 1 ( x xi ) 2 f x( x)dx

这称为 Kraft 不等式。
q
i 1
r li 1
(8)
由上式可知,给定 r 和 q,只要允许码字长度可以足够长,则码长总可以满 足 Kraft 不等式而得到即时码,Kraft 不等式指出了即时码的码长必须满足的条 件。后来 McMillan 证明对于唯一可译码得码长也必须满足此不等式。在码长的 选择上唯一可译码并不比即时码有更宽松的条件。对于唯一可译码,该不等式又 称为 McMillan 不等式。 唯一可译码存在的充要条件是:
展信源进行编码, 当 N 趋向于无穷时, 平均码长可以趋进该极限值。 还可以证明, 如果我们不确切知道信源的概率分布,我们用估计的概率分布去进行编码时,平 均码长会加长,但是如果估计的偏差不大的话,平均码长也不会增加太多。 2.4 无失真编码算法 2.4.1 无失真信源编码定理 设单符号、离散、无记忆信源的熵为 H(S),若用二进制码对其做变字长、非 续长编码,一定可以找到一种编码方式,其平均码长满足:

q
i 1
r li 1
(9)
其中 r 为码符号个数,为码字长度,q 为信源符号个数 无失真变长信源编码定理 离散无记忆信源 S 的 N 次扩展信源 S N ,其熵为 H (S N ) ,并且编码器的码元 符号集为 A : {a1 , a2 ,..., aq } 对信源 S N 进行编码,总可以找到一种编码方法,构成唯 一可译码,使信源 S 中每个符号 Si 所需要的平均码长满足
(11)
可见要提高传输效率,基本任务就是要改造信源,使其熵值最大化,此时η 趋于 1,而这个过程就是信源最佳化得过程。信源熵 H(X)最大化实质上就是寻求一种 最佳的概率分布。 根据熵函数的性质,在离散信源情况下,当各个符号间彼此独立而出现的概
率相等时,信源熵达到最大值。因此,一般的熵值最大化应当包括两个步骤: 1、符号独立化,解除符号间的相关性; 2、各符号概率均匀化。 为了衡量各种编码是否已达到极限情况,我们定义变长码的编码效率。 设对信源 S 进行无失真编码所得到的平均码长为 L ,则 L H r ( S ) ,定义 H (s) r (12) L 为编码效率, 1 。我们可以采用声码器技术,模式识别技术,变换编码技术以 及相关编码技术等近几年来发展起来的效率较好的压缩信源方法来解除关联、压 缩信源和提高传输效率。经过解除相关性之后,如果再使各符号的概率均匀化, 就能进一步改造有剩余信源的输出,去掉冗余度,提高熵速率,使传输率接近信 道容量进而使传输效率接近 1。如香农-范诺编码,霍夫曼编码。这列编码的基本 思想就是使各符号的概率均匀化,即出现概率大的符号编成短码,出现概率较小 的符号编成长码,只是由于具体方法不同,得到的效果也不同。 2.7 二元霍夫曼编码规则 (1)将信源符号依出现概率递减顺序排序。 (2)给两个概率最小的信源符号各分配一个码位“0”和“1”,将两个信 源符号合并成一个新符号,并用这两个最小的概率之和作为新符号的概率,结果 得到一个只包含(n-1)个信源符号的新信源。称为信源的第一次缩减信源,用 s1 表示。 (3)将缩减信源 s1 的符号仍按概率从大到小顺序排列,重复步骤二,得到 只含(n-2)个符号的缩减信源 s2。 (4)重复上述步骤,直至缩减信源只剩两个符号为止,此时所剩两个符号 的概率之和必为 1,然后从最后一级缩减信源开始,依编码路径向前返回,就得 到各信源符号所对应的码字。 2.8 多元霍夫曼编码规则 由二进制霍夫曼编码的方法很容易推广到 r 进制的情况,只是编码的过程中 构成缩减信源时,每次都是将 r 个概率最小的信源符号合并,然后分别用码符号 0,1,...,(r-1)表示。 为了充分利用短码,使霍夫曼码的平均码长最短,必须使最后一个缩减信源 恰好有 r 个信源符号,因此对于 r 元霍夫曼码,信源 S 符号个数 q 必须满足
H ( S ) LN H ( S ) 1 log(r ) N log(r ) N
当 N 时则有
(10)
LN qN H r(S ) ,λ 式中 L N i 1 P(Si )i ,其中 i 是扩展信源的 N
LN 是 N
信源符号 Si 所对应的码字长度, 因此是扩展信源中每个符号的平均码长, 而
N Ri
(2)
(3)
其中 f(x)是信源随机变量的概率密度函数。信号量化噪声比(SQNR)为:
E[ X 2 ] SQNR 10 log10 d
(4)
信源编码的主要目的是减少冗余,提高编码效率。信源编码可分为两类:无失真 编码和有失真编码。无失真编码只对信源冗余度进行压缩,不会改变信源的熵, 又称冗余度压缩编码,它可以保证码元序列经译码后能无失真的恢复成信源符号 序列,如 huffman 编码,香农编码。有失真编码在允许的失真范围内把编码后的 信息率压缩到最小,有失真信源编码的失真范围受限,所以又称为限失真信源编 码。 信源编码就是把信源符号序列变换到码符号序列的一种映射。若要实现无失 真编码,那么这种映射必须是一一对应的、可逆的。一般来说,人们总希望把信 源所有的信息毫无保留的传递到接受端,即实现无失真传输,所以首先要对信源 实现无失真编码。 信源编码有以下三种主要方法: (1)匹配编码 根据信源符号的概率不同,编码的码长不同 ,这样使平均码长最短。将要讲 到的霍夫曼编码就是概率匹配编码。 (2)变换编码 先对信号进行变换,从一种信号空间变换为另一种信号空间,然后针对变换 后的信号进行编码。一般是把分布在时空域的信号(如时域的语音信号和平面空 间的图像信号原 来相关性很强的原始信号经过变换后,得到的变换域系数相互独立,并且能量集 中在少数低序系数上,这样只需对少量的变换域的系数进行编码,达到数据压缩 的目的。常用的变换编码有 DFT、沃尔什变换、小波变换等。 (3)识别编码 识别编码主要用于印刷或打字机等有标准形状的文字、符号和数据的编码, 比如中文文字和语音的识别。 变换编码和识别均为有失真的信源编码。 最原始的信源编码就是莫尔斯电码,另外还有 ASCII 码和电报码都是信源编 码。但现代通信应用中常见的信源编码方式有:霍夫曼编码、算术编码、L-Z 编 码,这三种都是无损编码。而霍夫曼编码作为变长码满足变长信源编码定理。该 编码定理是香农信息论中非常重要的一个定理,它指出,要做到无失真的信源编 码,信源每个符号所需要的平均码元数就是信源的熵值,如果小于这个值,则唯 一可译码不存在,可见,熵是无失真信源编码的极限值。定理还指出,通过对扩
H (S ) m H (S ) 1
(5)
不等式左边表明,信源的熵是作无失真二进制变字长编码平均码长的下限。 如果用符号等于其信息量得码长
mk lbp(ak )
编码,则可以使平均码长达到其下限——熵
m K 1 p (ak )mk k 1 p (a1 )lbp(ak ) H ( S )
信源 S 中单个信源符号所需的平均码长。这里要注意
LN 与 LN 的区别:它们都是 N
单个信源符号所需的码符号的平均数,但是
LN V 的含义是,为了得到这个平均 N
值,不是对单个信源符号进行编码,而是对 N 个信源符号序列进行编码,然后对 N 求平均。 该定理指出,要做到无失真信源编码,每个信源符号平均所需最少的 r 元码 元数就是信源的熵值。 若编码的平均码长小于信源的熵值, 则唯一可译码不存在, 在译码或反变换时必然要带来失真或差错,同时定理还指出,通过对扩展信源进 行变长编码,当 N 时,平均码长 L 可达到这个极限值。可见,信源的信息熵 H(S)是无失真信源编码码长的极限值,也可认为信源熵是表示每个信源符号平均 所需最少的码元符号数。 2.5 信源最佳化 通信系统的传输效率就是指给定信道的信道容量利用率,它表示信道的实际 传信率与信道容量的比值,可以写成: R C
编写 Matlab 函数实现哈夫曼编码的算法
一、 设计目的和意义
在通信的数字化过程中,对于连续的原始语音图像等模拟信号,如果要以数 字化的方式进行传输,在发送端必须进行模/数(A/D)转换,将原始信号转变为 离散的数字信号。模拟信号在数字化之后一般会导致传输信道带宽明显增加,这 样就会占用更多的信道资源,传输效率也会随之较低,有时甚至无法实现实时传 输。 为了提高传输效率,一方面需要采用压缩编码技术,在保证一定信号质量的 前提下,尽可能地去除信号中的冗余信息,从而减少信号速率和传输所用带宽。 另一方面,即使是原本就以数字形式存在的数据和文字信息,也同样存在一个需 要通过压缩编码降低信息冗余提高传输效率的问题。由于这些处理都是针对信源 发送信息所进行的,因此一般将其称为信源编码。 信源编码的基本目的是提高码字序列中码元的平均信息量,那么,一切旨在 减少剩余度而对信源输出符号序列所施行的变换或处理,都可以在这种意义下归 入信源编码的范畴,例如过滤、预测、域变换和数据压缩等。作为现代数据无损 压缩的灵魂算法,霍夫曼编码广泛应用于各种图像、音频、视频及各种多媒体信 息的压缩环境中。 本次课程设计的意义在于使我们对我们使用 matlab 工具来实现通信系统的 模拟设计,同时也使我们明白信源在调制前做编码的重要性。
q (r 1) r
(13)
其中 表示信源缩减次数。如果不满足上式,则可以在最后增补一些概率为零的 信源符号,因此上式又可以写成
q i (r 1) r
(14)
i 为增加的信源符号数,并且是满足上式的最小正整数或 0。这样处理后得到的 r 元霍夫曼码可充分利用短码,一定是紧致码。 4.3 扩展信源霍夫曼编码 对离散无记忆信源的 N 次扩展信源进行编码便得到 N 次扩展码。 采用霍夫曼编码法能够使码的平均长度最短,信息的冗余量最小。然而这种编码 方法所形成的码字很不规整,这样不利于硬件的译码。在很多处理机中,我们采 用一种新的折中的方法,称为扩展编码法。这种方法是由定长编码与霍夫曼编码 法相结合形成的。 有等长扩展法和不等长扩展编码方法, 为了便于实现分级译码, 我们一般采用等长扩展编码法,当然,也可以根据具体需要采用每次扩展位数不 等的不等长扩展法。
相关文档
最新文档