高效的Rice解码实现

时间:2013-04-11 14:17:38

标签: c implementation compression

我做了一个Rice解码器(和编码器)的天真实现:

void rice_decode(int k) {
    int i = 0
    int j = 0;
    int x = 0;
    while(i < size-k) {
        int q = 0;
        while(get(i) == 0) {
            q++;
            i++;
        }
        x = q<<k;
        i++;
        for(j=0; j<k; j++) {
            x += get(i+j)<<j;
        }
        i += k;
        printf("%i\n", x);
        x = 0;
    }
}

输入位集的大小为sizeget(i)返回位集的i位的基元,以及k Rice参数。由于我关注的是性能,我还使用预计算进行了更精细的实现,这更快。但是,当我在-O3中打开gcc标记时,天真的实现实际上优于后者。

我的问题是:确实知道Rice编码器/解码器的任何现有有效实现(我更关心解码)比这更好(我能找到的那些更慢或可比较)?或者,您是否有任何聪明的想法可以使解码比预计算更快?

2 个答案:

答案 0 :(得分:0)

Rice编码可以视为variable-length codes.的变体因此,在过去,我使用基于表格的技术生成自动/状态机,可以快速解码固定的霍夫曼代码和米编码。快速搜索fast variable-length codesfast huffman的网络会产生许多适用的结果,其中一些是基于表格的。

答案 1 :(得分:0)

这里有一些适用的教科书。

while (get(i) == 0) { q++; i++;}找到流中设置的最低有效位。

可以用-data & data代替,它返回单个位集。那可以用一些hash + LUT转换为索引'q'(例如一个涉及37的模数 - 或者使用带有crc32的SSE4指令,我敢打赌可以简单地做LUT[crc32(-data&data) & 63];

下一个循环for(j=0; j<k; j++) x += get(i+j)<<j; OTOH应该替换为x+= data & ((1<<k)-1);,因为只需从流中获取k位并将它们视为无符号整数。

最后一个移位data>>=(q+k);并从输入流中读取足够的字节。