パケットでできているバイナリストリームを圧縮しています
パケットは、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
...
私の現在のlossles-compressionスキームは、ニブルに基づいています。基本的に、前のサンプルから変更されたニブルをエンコードする制御バイトを使用しています(シングルビットを使用)。変更がある場合は、変更されたニブルを圧縮ストリームに含めます。それ以外の場合は、解凍時に前のサンプルから再構築されます。
これが私が提供したサンプルストリームがどのように圧縮されるかです:
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%未満)限り、代替手段です。この特定のデータストリームの場合、ビット位置の数値の重みは関係ないため、上位ビットで発生するエラーは次のようになります。まったく心配ありません。
よろしくお願いします!