信源编码是数字通信中的重要一环。信源编码的主要任务是减少冗余,提高编码效率。
其中Huffman编码是很重要的一种算法,其基本原理是为概率较小的信源输出分配较大的码字,为哪些概率出现较大的信源输出分配较短的码字。
霍夫曼编码的具体步骤如下:
1)将信源符号的概率按减小的顺序排队。
2)把两个最小的概率相加,并继续这一步骤,始终将较高的概率分支放在右边,直到最后变成概率1。
3)画出由概率1处到每个信源符号的路径,顺序记下沿路径的0和1,所得就是该符号的霍夫曼码字。
4)将每对组合的左边一个指定为0,右边一个指定为1(或相反)。
具体理论详见:
https://blog.csdn.net/xgf415/article/details/52628073
function [h,l] = huffmancode(P)
%Huffmancode
if ~isempty(find(P<0, 1))
error('没有检测到') %判断是否符合概率分布的条件
end
if(abs(sum(P)-1)>10e-10)
error('没有检测到')
end
n=length(P);
for i=1:n-1
for j=i:n
if P(i)<=P(j)
p=P(i);P(i)=P(j);P(j)=p;
end
end
end
disp('概率分布'),P;
Q=P;
m=zeros(n-1,n);
for i=1:n-1
[Q,l]=sort(Q);
m(i,:)=[l(1:n-1),zeros(1:i-1)];
Q=[Q(1)+Q(2),Q(3:n),1];
end
for i=1:n-1
c(i,:)=blanks(n*n);
end
%计算各个元素码字
c(n-1,n)='0';
c(n-1,2*n)='1';
for i=2:n-1
c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-n+1,:)==1))-(n-2):n*(find(m(n-i+1,:)==1)));
c(n-i,n)='0';
c(n-i,n+1:2*n-1)=c(n-i,1:n-1);
c(n-i,2*n)='1';
for j=1:i-1
c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(m(n-i+1,:)==j+1)-1)+1:n*find(m(n-i+1,:)==j+1));
end
end
for i=1:n
h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n);
ll(i)=length(find(abs(h(i,:))~=32));
end
l=sum(P.*ll);