> rice | adaptive | compress <
// Rice 编码 —— 带可调参数的自适应整数压缩
>> 功能亮点
可调节参数
通过调整 k 值,针对不同数据分布优化压缩效率。
几何分布数据
对几何或指数分布的数据特别高效。
快速编码
依赖简单的除法与取余运算,易于实现且速度快。
>> 技术细节
Rice 编码的工作原理:
Rice 编码将每个整数 n 用 2^k 相除,得到商 q 和余数 r。商使用一元编码(q 个 1 后跟一个 0),余数用 k 位二进制表示。通过调节参数 k,这种可变长编码可以根据数据分布进行自适应优化。
Rice 编码示例(k=2):
k=2, M=2^2=4 0 → q=0, r=0 → 0|00 → 000 1 → q=0, r=1 → 0|01 → 001 2 → q=0, r=2 → 0|10 → 010 3 → q=0, r=3 → 0|11 → 011 4 → q=1, r=0 → 10|00 → 1000 5 → q=1, r=1 → 10|01 → 1001 6 → q=1, r=2 → 10|10 → 1010 7 → q=1, r=3 → 10|11 → 1011 8 → q=2, r=0 → 110|00 → 11000 k 越大:一元位更少,二进制位更多 k 越小:一元位更多,二进制位更少
为什么选择 Rice 编码?:
- ▸可根据数据分布自适应调整
- ▸实现简单、维护方便
- ▸编码和解码速度都很快
- ▸非常适合传感器等序列数据
- ▸对小整数的压缩效率很高
>> 常见问题
什么是 Rice 编码?
Rice 编码是一种可变长的熵编码方法,对几何分布非常高效。它是 Golomb 编码的一个特例,其中除数 M 被限制为 2 的幂(M = 2^k),这样可以利用位移运算替代除法,获得更高的性能。
k 参数应该如何选择?
最优的 k 取决于数据分布。对于均值为 μ 的数据,可以近似使用 k ≈ log₂(μ × ln(2))。较小的 k(0–2)适合非常小的数值,较大的 k(4–8)更适合数值较大的数据。可以借助分析功能来寻找适合你数据的最优 k。
Rice 与 Golomb 编码有什么区别?
Rice 编码是 Golomb 编码的子集,其中 M 被约束为 2 的幂 (M = 2^k)。这一约束使 Rice 编码可以通过位移运算更快地实现,但在压缩率上可能略逊一筹。Golomb 可以自由选择 M 以获得更高压缩率,而 Rice 在压缩效率和速度之间做了折中。
Rice 编码通常用在什么场景?
Rice 编码广泛用于无损音频压缩(如 FLAC、ALAC)、图像压缩(JPEG‑LS)以及具有几何分布的传感器数据。对于概率呈指数衰减的小型非负整数,Rice 编码尤为高效。
// 计算示例
| n | q | r | k=2 |
|---|---|---|---|
| 0 | 0 | 00 | 000 |
| 1 | 0 | 01 | 001 |
| 2 | 0 | 10 | 010 |
| 3 | 0 | 11 | 011 |
| 4 | 1 | 00 | 1000 |
| 5 | 1 | 01 | 1001 |
| 6 | 1 | 10 | 1010 |
| 7 | 1 | 11 | 1011 |
| 8 | 2 | 00 | 11000 |
// 代码示例
Rice code with parameter k (Golomb code with M = 2^k) q = n >> k quotient, written as q ones followed by a zero r = n & (2^k - 1) remainder, written as k plain bits code = unary(q) + r k = 2, n = 9 -> q = 2, r = 01 -> 110 01 Decode: count the leading 1s (q), skip the 0, read k bits (r), n = (q << k) | r Choose k about log2(mean value): small values -> small k
>> 更多问题
问:Rice 编码与 Golomb 编码有何区别?
答:Rice 编码是 Golomb 编码在参数 M 为 2 的幂(M = 2^k)时的特例,用移位和掩码代替除法,速度很快。
问:如何选择参数 k?
答:k 约取数值平均值的 log2。k 过小会使一元部分过长,过大则在余数部分浪费比特。FLAC 等编码器会按块自适应选择 k。
问:Rice 编码适合什么数据?
答:适合呈几何分布的非负整数,即小值远多于大值。典型场景是无损音频(FLAC)和图像(JPEG-LS)的预测残差。