我正在使用MATLAB压缩任意向量,MATLAB为霍夫曼编码提供工厂方法:huffmandict,huffmanenco,huffmandeco。
huffmandict函数产生一个查找表,将我们要编码的信号中的每个符号映射到其对应的码字,该码字是编码然后解码信号所需的。
当您知道输入向量时,生成字典很简单。但是说我正在压缩从Alice发送到Bob - 我不能认为Bob也知道字典 - 所以Alice需要发送字典和huffman代码!
MATLAB中是否有一种方法可以生成字典的比特流表示,以便我们的霍夫曼代码可以在另一端进行解码?
我在想的是如果N是编码字典的长度,结果代码看起来像是
(N encoded as 8 bits)(huffman dict encoded in N bits)(huffman code)
似乎很可能MATLAB为编码提供了非常强大的工厂方法,但是后来甚至懒得让它在数字传输中实际可用而且还有很多额外的工作。
我理解在理论中,经常会构建一个霍夫曼树 - 有没有办法在MATLAB中生成这个,然后将这个树转换回字典?
答案 0 :(得分:1)
我知道JPEG和gzip中使用了两种有效的代码表达方法,但据我了解,它们要求字典是规范的,这意味着右侧的每个分支(以1开头)都必须更长。 因此,由于存在2 ^ n(n是代码字的数量)设计,因此必须将代码转换为规范形式。 规范具有相同的预期长度。 然后,您可以通过每个符号的分支长度来表示每个符号,将其限制为合理的数字,例如2 ^ 4(每个符号4位)。 好的,让我们看一下要发送矢量的代码:
for i = 1:size(dict,1)
L(i) = numel(dict{i,2})
end
在接收端,您需要做更多的事情(我假设您的代码字标签中有一些固定的顺序):
k = 0;
for l = 1:16
k = k * 2;
for j = find(L==l)
d{j,1} = j;
d{j,2} = de2bi(k, 'left-msb', l);
k = k + 1;
end
end
要转换为规范形式,您只需要将树转换为矢量格式并返回。