【发布时间】:2012-11-01 04:55:26
【问题描述】:
我正在压缩一个由数据包组成的二进制流
一个数据包由 256 个 32 位整数(样本)组成。问题是大多数整数与前一个整数相比仅更改了几位(通常,与流中的前一个样本相比最多更改 0 - 4 位)。
这是一个例子:
3322 2222 2222 1111 1111 1110 0000 0000 BIT POSITIONS
1098 7654 3210 9817 6543 2109 8765 4321
--------------------------------------------------------
1100 1001 1110 0010 0001 0101 0110 1101 Sample 1
* *
1100 1001 1110 1010 0001 0101 0110 0101 Sample 2 changes: bit 19, 4
1100 1001 1110 1010 0001 0101 0110 0101 Sample 3 changes: none
* * *
1100 0001 1110 1011 0001 0101 0010 0101 Sample 4 changes: bit 27, 17, 7
...
我目前的无损压缩方案是基于半字节的。基本上我使用的是一个控制字节,我正在编码 - 使用单个位 - 它的半字节从前一个样本发生了变化;如果有变化,我会将修改后的半字节包含在压缩流中,否则它们将在解压时从之前的样本中重建。
这是我提供的示例流的压缩方式:
Control Byte: 11111111 // all nibbles change, since this is first sample
Data: 1100 1001 1110 0010 0001 0101 0110 1101 // data for all nibbles
Control Byte: 00010001 // only nibbles 3 and 7 have changes
Data: 1010 0101 // data for nibbles 3 and 7
Control Byte: 00000000 // no nibbles are changing
Data: // no data is required
Control Byte: 01010010 // nibbles 1, 3 and 6 have changes
Data: 0001 1011 0010 // nibbles 1, 3 and 6
...
使用此方案,我们有 256 字节(控制字节)的固定开销,平均可变压缩数据长度为 260 字节(从样本到样本变化的半字节)。考虑到未压缩数据包的长度为 1024 字节,这实际上给了我们 50% 的平均压缩率。
这还不错,但我的直觉是有可能有更好的方法。有没有人知道更好的压缩策略,它利用了很少有位从样本到样本的变化这一事实?只要解压缩后的误码率很小(小于 3%),有损压缩就是一种替代方案——对于这个特定的数据流,位位置的数值权重是无关紧要的,因此在较高位中发生的错误是完全不用担心。
提前谢谢大家!
【问题讨论】:
-
数据包中样本的顺序重要吗?如果没有,您可以在每个数据包内进行排序以最小化控制字节数。
-
@cmh,好建议 - 不幸的是,订单或样品是相关的 :(
标签: algorithm compression