信息论与编码课程大作业二进制哈夫曼编码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

信息论与编码课程大作业

二进制哈夫曼编码

题目

学生姓名:

学号: 00

专业班级:2010级电子信息班

2013年5 月18 日

二进制哈夫曼编码

1、二进制哈夫曼编码的原理及步骤

1、1信源编码的计算

设有N个码元组成的离散、无记忆符号集,其中每个符号由一个二进制码字

表示,信源符号个数n信源的概率分布P={p(sJ},i=1,…..,n。且各符号xi

n

的以li个码兀编码,在变长字编码时每个符号的平均码长为L p(xi)li ;

i 1

信源熵为:H(X) p(xi)log p(xi)

i 1

n

唯一可译码的充要条件:m Ki 1 ;

i 1

其中m为码符号个数,n为信源符号个数,Ki为各码字长度

构造哈夫曼数示例如下图所示。

1、2二元霍夫曼编码规则

(1)将信源符号依出现概率递减顺序排序。

(2)给两个概率最小的信源符号各分配一个码位“ 0”和“1”,将两个信源符号合并成一个新符号,并用这两个最小的概率之和作为新符号的概率,结果得到一个只包含(n-1 )个信源符号的新信源。称为信源的第一次缩减信源,用si表示。

(3)将缩减信源si的符号仍按概率从大到小顺序排列,重复步骤

(2),得到只含(n-2)个符号的缩减信源s2。

(4)重复上述步骤,直至缩减信源只剩两个符号为止,此时所剩两个符号的概率之和必为1,然后从最后一级缩减信源开始,依编码路径向前返回,就得到各信源符号所对应的码字。

1、3二元哈夫曼编码流程图如下图所示。

2、二元哈夫曼编码程序

p=input( 'please input a number:' ) %提示输入界面n=length(p);

for i=1:n if p(i)<0 fprintf( '\n The probabilities in huffman can not less than 0!\n' );

p=input( 'please input a number:' ) %如果输入的概率数组中有小于0 的值,

end end

if abs(sum(p)-1)>0

fprintf( '\n The sum of the probabilities in huffman can more than 1!\n' ); p=input( 'please input a number:' ) %如果输入的概率数组总和大于 1 ,则重

end q=p;

a=zeros(n-1,n); %生成一个n-1 行n 列的数组

for i=1:n-1

[q,l]=sort(q); %对概率数组q进行从小至大的排序,并且用I数组返回一个q排序前的顺序编号

a(i,:)=[l(1:n-i+1),zeros(1,i-1)]; %由数组l 构建一个矩阵,该矩阵表明概率合并

q=[q(1)+q(2),q(3:n),1]; %将排序后的概率数组q 的前两项,即概率最小的两

end

for i=1:n-1 c(i,1:n*n)=blanks(n*n);

end

c(n-1,n)= 'O' ; %由于a矩阵的第n-1行的前两个元素为进行huffman编码加和运算时所得的最

c(n-1,2*n)= '1' ;

for i=2:n-1 c(n-i,1:n-1)=c(n-i+1,n*(find(a(n-i+1,:)==1))-(n-2):n*(find(a(n-i+1,:)==1)));

c(n-i,n)= 'O' ; %根据之前的规则,在分支的第一个元素最后补O

c(n-i,n+1:2*n-1)=c(n-i,1:n-1);

c(n-i,2*n)= '1' ; %根据之前的规则,在分支的第一个元素最后补 1

for j=1:i-1 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(n-i+1,: )==j+ 1));

end

end %完成huffman 码字的分配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));

%计算每一个huffman 编码的长度

end

disp( ' 二元霍夫曼编码平均码长' )

l=sum(p.*ll) %计算平均码长

%fprintf('\n huffman code:\n');

h

disp( ' 信源熵' )

hh=sum(p.*(-log2(p))) %计算信源熵

%fprintf('\n the huffman effciency:\n');

disp( ' 编码效率' )

t=hh/l %计算编码效率

3、运行结果及分析

当输入数据[,,,,,,,,] 时

3、1 运行结果:

please input a number:[,,,,,,,,]

p =

Columns 1 through 5

Columns 6 through 9

二元霍夫曼编码平均码长

l = h =

1110100

1110101

111011 11100 1111 110 00 10 01

信源熵

hh =

编码效率

3、2分析:

1、在哈弗曼编码的过程中,对缩减信源符号按概率有大到小的顺序重新排列,应使合并后的新符号尽可能排在靠前的位置,这样可使合并后的新符号重复编码次数减少,使短码得到充分利用。

2、哈弗曼编码效率相当高,对编码器的要求也简单得多。

3、哈弗曼它保证了信源概率大的符号对应于短码,概率小的符号对应于长码,每次缩减信源的最后两个码字总是最后一位码元不同,前面的各位码元都相同,每次缩减信源的最长两个码字有相同的码长。

4、哈弗曼的编法并不一定是唯一的。

相关文档
最新文档