信息论与编码课程作业_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`。
编写matlab函数实现huffman编码的算法

在区域内的随机变量的所有值都被量化为第 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 所需要的平均码长满足
(完整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实现(完整版).pdf

%哈夫曼编码的 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);%end生成编码表的第一列r=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));t=t-1;end B;%输出编码表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;end B(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)));L(i)=b;endavlen=sum(L.*A)% 平均码长H1=log2(A);H=-A*(H1')% 熵P=H/avlen%编码效率2。
信息论与编码课程作业_huffman编码的matlab_实现

信息论与编码课程作业_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五:设计新得体会:通过这学期对信息论和编码的学习,以及这次的设计,使我了解了很多东西,也使以前所学的知识得以巩固!,通过这次的设计,进一步学习了离散信源平均信息量、平均码长和压缩比的计算方法。
实验 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中实现霍夫曼编码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息论与编码课程作业——霍夫曼编码求信源熵和存储前后的信息量的变化一:设计目的: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)),32,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 111011101155 0.0015411 00010101156 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 0110101085 0.0036011 0111000186 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 134 0.007309 0111101135 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 176 0.006424 0011111177 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五:设计新得体会:通过这学期对信息论和编码的学习,以及这次的设计,使我了解了很多东西,也使以前所学的知识得以巩固!,通过这次的设计,进一步学习了离散信源平均信息量、平均码长和压缩比的计算方法。