【问题标题】:Huffman coding in MATLAB - transmitting the dictionary/treeMATLAB中的霍夫曼编码 - 传输字典/树
【发布时间】:2018-06-16 17:45:00
【问题描述】:

我正在使用 MATLAB 压缩任意向量,它为 Huffman Coding 提供工厂方法:huffmandict、huffmanenco、huffmandeco。

huffmandict 函数生成一个查找表,将我们要编码的信号中的每个符号映射到其对应的码字,该码字需要对信号进行编码和解码。

当您知道输入向量时,生成字典是微不足道的。但是假设我正在压缩以从 Alice 发送给 Bob - 我不能假设 Bob 也知道字典 - 所以 Alice 需要将字典与霍夫曼代码一起发送!

在 MATLAB 中是否有一种方法可以生成字典的比特流表示形式,并将其添加到我们的霍夫曼代码中,以便在另一端对其进行解码?

我的想法是,如果 N 是编码字典的长度,则生成的代码如下所示:

(N encoded as 8 bits)(huffman dict encoded in N bits)(huffman code)

看起来很奇怪,MATLAB 提供了非常强大的工厂方法来进行编码,但随后甚至没有费心让它在数字传输中真正可用,需要做很多额外的工作。

我知道在理论上,通常会构建一棵霍夫曼树 - 有没有办法在 MATLAB 中生成它,然后将这种树转换回字典?

【问题讨论】:

  • 不是最有效的方法,但很容易将字典保存为文件,然后将其读回内存。例如:save('dict.mat','dict','-v6'); f = fopen('dict.mat','rb'); data = uint8(fread(f)); fclose(f); 然后将data 发送给接收者。在接收端写回文件并加载:f = fopen('dict.mat','wb'); fwrite(data); load('dict.mat'); fclose(f);
  • jsonencode / jsondecode 怎么样?

标签: matlab tree compression encode huffman-code


【解决方案1】:

我知道 JPEG 和 gzip 中使用了两种有效的代码表达方法,但据我所知,它们要求字典是规范的,这意味着右侧的每个分支(从 1 开始)都必须更长。 因此,您必须将代码转换为规范形式,因为有 2^n(n 是代码字的数量)设计。 Canonical 具有相同的预期长度。 然后您可以通过其分支的长度来表示每个符号,限制为一个合理的数字,例如 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

要转换为规范形式,您只需将树转换为矢量格式并返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多