【问题标题】:Entropy coding (Huffman and Arithmetic/ANS) - mixing codes with non-codes熵编码(霍夫曼和算术/ANS) - 将代码与非代码混合
【发布时间】:2017-07-18 15:39:52
【问题描述】:

使用 Huffman 编码,我们只需生成符号映射 -> 代码。然后,当运行长度编码时,我们使用这个映射来交换一个符号和一个代码。这允许将代码与我们不想编码/压缩的其他一些符号轻松混合。例如,在 JPEG 中,我们编码 [前面零的数量,AC 系数的位数] 并将其放入比特流,然后是 AC 系数位表示。这是霍夫曼编码的一个非常方便的属性。

现在我想问的是,这是否可以用算术编码做类似的事情(在非对称数字系统的上下文中,这就是我正在实现的)?我不知道如何解决这个问题。

【问题讨论】:

    标签: compression huffman-code


    【解决方案1】:

    混合原始比特有多种方法,例如绕过编码参见:https://fgiesen.wordpress.com/2015/12/21/rans-in-practice/ 通常,获得数据压缩帮助的最佳位置是 encode.ru 论坛。

    【讨论】:

      【解决方案2】:

      当然,假设您知道在切换到后续位的其他解释之前要从算术代码/ANS 解码多少符号。这与 Huffman 情况没有什么不同,在这种情况下,您知道在更改对位的解释之前要读取多少个符号。

      【讨论】:

        【解决方案3】:

        @Jarek 杜达: 感谢您的链接。我去了那里,在源代码的帮助下能够实现原始位的写入/读取。不过,我想要求对标准化的工作原理进行一些解释。我当前的 WriteRaw 实现如下所示:

        uint32 _x;
        deque<uint16> _words;
        
        ...
        
        void NCommon::ANSCoder32::WriteRaw(uint16 value, uint8 bitsCount)
        {
            uint32 freq = 1 << (16 - bitsCount);
            uint32 maxX = ((uint32)1 << 16) * freq;
        
            if (_x >= maxX)
            {
                _words.push_back(_x & 0xFFFF);
                _x >>= 16;
            }
        
            _x = (_x << bitsCount) | value;
        }
        

        我知道 freq 和 maxX(基于提供的网站)应该是什么,但不知道为什么要这样定义它们。我真的很欢迎一些解释。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-24
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          • 2011-08-02
          • 2017-04-18
          • 1970-01-01
          相关资源
          最近更新 更多