%huff2man源程序
function x=huff2mat(y)
%huff2man解码一个Huffman编码的矩阵
%x=huff2man(y)解码一个Huffman编码的16比特的结构y
%field:
%y.min x的最小值+32768
%y.size x的大小
%y.hist x的直方图
%y.code Huffman编码
%输出x是双精度
if ~isstruct(y) | ~isfield(y,'min') | ~isfield(y,'size') | ...
~isfield(y,'hist') | ~field(y,'code')
error('The input must be a structure as returned by MAT2HUFF');
end
sz=double(y.size);m=sz(1);n=sz(2);
xmin=double(y.min)-32768;%得到x的最小值
map=huffman(double(y.hist));%得到Huffman编码
%为Huffman解码程序创造一个二维调查表
%code包含源符号字符串与连接编码符合,
%当'link'包含映射(+)是给编码符号字符串加上0和1,映射(-)是给解码Huffman编码词放在map中。
%数组'left'是一列编码,目前给link入口加工的。
code=cellstr(char('','0','1'));%设置开始条件
link=[2;0;0];left=[2 3];
fiund=0;tofind=length(map);%处理变量
while length(left) & (found<tofind)
look=find(strcmp(map,code{left(1)}));%map是否是字符串?
if look%是的
link(left(1))=-look;%指出 Huffman图
left=left(2:end);%删除当前编码
found=found+1;%found编码的增量
else
len=length(code);%不是的话,加上2编码与指标
link(left(1))=len+1;%在编码中加指标
link=[link;0;0];%加未加工的编码
code{end+1}=strcat(code{left(1)},'0');
code{end+1}=strcat(code{left(1)},'1');
left=left(2:end);%删除加工编码
left=[left len+1 len+2];%加2个未加工编码
end
end
x=unravel(y.code',link,m*n);%使用C拆散解码
x=x+xmin-1;%调整x最小值的补偿
x=reshape(x,m,n);%是向量成为一个数组
huff2man.m
最新推荐文章于 2021-12-12 23:08:32 发布