编写matlab函数实现huffman编码的算法
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实现

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函数实现哈夫曼编码的算法一、设计目的和意义在当今信息化时代,数字信号充斥着各个角落。
在数字信号的处理和传输中,信源编码是首先遇到的问题,一个信源编码的好坏优劣直接影响到了后面的处理和传输。
如何无失真地编码,如何使编码的效率最高,成为了大家研究的对象。
哈夫曼编码就是其中的一种,哈夫曼编码是一种变长的编码方案。
它由最优二叉树既哈夫曼树得到编码,码元内容为到根结点的路径中与父结点的左右子树的标识。
所以哈夫曼在编码在数字通信中有着重要的意义。
可以根据信源符号的使用概率的高低来确定码元的长度。
既实现了信源的无失真地编码,又使得编码的效率最高。
二、设计原理哈夫曼编码(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编码一实验目的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 中实现哈夫曼编译码: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中实现霍夫曼编码可以通过以下步骤完成: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实现(基于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实现

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 :。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在区域内的随机变量的所有值都被量化为第 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 次扩展码。 采用霍夫曼编码法能够使码的平均长度最短,信息的冗余量最小。然而这种编码 方法所形成的码字很不规整,这样不利于硬件的译码。在很多处理机中,我们采 用一种新的折中的方法,称为扩展编码法。这种方法是由定长编码与霍夫曼编码 法相结合形成的。 有等长扩展法和不等长扩展编码方法, 为了便于实现分级译码, 我们一般采用等长扩展编码法,当然,也可以根据具体需要采用每次扩展位数不 等的不等长扩展法。