玄関コンピュータの部屋各種解説コーナーデータ圧縮法概説

4.6 Jones符号の復号化手順

Jones符号を復号化する手順は以下のとおりです。

  1. 元データに付加されている全ての記号の種類と出現頻度情報から、スケールファクターの値と区間の境界値となる累積頻度を求める。 符号化の例として用いたデータですと、次のようになります。
    Jones符号化
    a:40 b:30 c:20 d:10  全記号数=100
    全記号数と最低出現頻度とEOFを考慮してN=101
  2. スケールファクターNから、N≦2wを満足するNに最も近い2の倍数2wを求める。
    101≦27=128 より w=7
  3. 符号化されたビット列を読み込む。
    ビット列=010000110010111(=8599)
  4. ビット列の最後にビット1をw個追加したものを整数の符号値とする。
    符号値=0100001100101111111111
  5. 整数化した修正区間幅Hと修正半開区間の下限Lを次のように初期設定する。
    L=0  H=2w=27=128
  6. 符号値の上位wビットを整数値としてLに代入する。
    L=0100001=33
  7. この値から最初の記号の整数符号値Fを逆算する。
    F=INT{N×(2L+1)−1
    ───────
    2H
    }=INT{101×(2×33+1)−1
    ─────────
    2×128
    }=26
  8. 元データの区間境界値(累積頻度)より対応する記号を出力する。
    F=26 より復元データ:a
  9. その記号に対応する修正区間の下限F'lと上限F'u、さらに修正区間幅Vを元データの境界値から求める。
    F'l=INT(l
    ──
    ×H+0.5)=INT(0
    ──
    101
    ×128+0.5)=0
    F'u=INT(u
    ──
    ×H+0.5)=INT(40
    ──
    101
    ×128+0.5)=51
    V=F'u−F'l=51−0=51
  10. Vを再分割するために、次の条件を満足する2の倍数で置き換える。
    2w≦V×2m<2w+1
    27=128≦51×22=204<28=256  m=2
  11. この値からH、Lを次のように更新する。
    H←V×2m=51×22=204
    L←(L−F'l)×2m=(26−0)×22=104
  12. 符号値の次の上位mビットを整数値としてLに加算する。
    L←L+10=104+2=106
  13. EOFを復号するまで7.から12.を繰り返す。

4.7 Jones符号の復号化実例

例として、符号化の例で用いた「abcd」の符号値「010000110010111」を復号してみましょう。

  1. 全記号の種類と出現頻度情報から、スケールファクターの値と区間の境界値となる累積頻度を求める。
    Jones符号化
    a:40 b:30 c:20 d:10  全記号数=100
    全記号数と最低出現頻度とEOFを考慮してN=101
  2. スケールファクターN=101から、101≦2wを満足する101に最も近い2の倍数2wを求める。
    101≦27=128 より w=7
  3. 符号化されたビット列を読み込む。
    ビット列=010000110010111(=8599)
  4. ビット列の最後にビット1を7個追加したものを整数の符号値とする。
    符号値=0100001100101111111111
  5. 整数化した修正区間幅Hと修正半開区間の下限Lを初期設定する。
    L=0  H=2w=27=128
  6. 符号値の上位7ビットを整数値としてLに代入する。
    L=0100001=33
  7. この値から最初の記号の整数符号値Fを逆算する。
    F=INT{N×(2L+1)−1
    ───────
    2H
    }=INT{101×(2×33+1)−1
    ─────────
    2×128
    }
      =26(本来の実数符号値=0.2614176)
  8. 元データの区間境界値より対応する記号aを出力する。
    復元データ:a
  9. aに対応する修正区間の下限F'lと上限F'u、さらに修正区間幅Vを元データの境界値から求める。
    F'l=INT(l
    ──
    ×H+0.5)=INT(0
    ──
    101
    ×128+0.5)=0
    F'u=INT(u
    ──
    ×H+0.5)=INT(40
    ──
    101
    ×128+0.5)=51
    V=F'u−F'l=51−0=51
  10. Vを再分割するために、次の条件を満足する2の倍数で置き換える。
    2w≦V×2m<2w+1
    27=128≦51×22=204<28=256  m=2
  11. この値からH、Lを更新する。
    H←V×2m=51×22=204
    L←(L−F'l)×2m=(33−0)×22=132
  12. 符号値の次の上位2ビットを整数値としてLに加算する。
    L←L+10=132+2=134
  13. Lの値から次の記号の整数符号値Fを逆算する。
    F=INT{N×(2L+1)−1
    ───────
    2H
    }=INT{101×(2×134+1)−1
    ──────────
    2×204
    }
      =66(本来の実数符号値=0.6600795)
  14. 元データの区間境界値より対応する記号bを出力する。
    復元データ:ab
  15. 整数符号値からbの影響を取り除くために9.〜11.の手順を繰り返す。
    F'l=INT(l
    ──
    ×H+0.5)=INT(40
    ──
    101
    ×204+0.5)=81
    F'u=INT(u
    ──
    ×H+0.5)=INT(70
    ──
    101
    ×204+0.5)=141
    V=F'u−F'l=141−81=60
    27=128≦60×22=240<28=256  m=2
    H←V×2m=60×22=240
    L←(L−F'l)×2m=(134−81)×22=212
  16. 符号値の次の上位2ビットを整数値としてLに加算する。
    L←L+01=212+1=213
  17. Lの値から次の記号の整数符号値Fを逆算する。
    F=INT{N×(2L+1)−1
    ───────
    2H
    }=INT{101×(2×213+1)−1
    ──────────
    2×240
    }
      =89(本来の実数符号値=0.8889344)
  18. 元データの区間境界値より対応する記号cを出力する。
    復元データ:abc
  19. 整数符号値からcの影響を取り除くために9.〜11.の手順を繰り返す。
    F'l=INT(l
    ──
    ×H+0.5)=INT(70
    ──
    101
    ×240+0.5)=166
    F'u=INT(u
    ──
    ×H+0.5)=INT(90
    ──
    101
    ×240+0.5)=214
    V=F'u−F'l=214−166=48
    27=128≦48×22=192<28=256  m=2
    H←V×2m=48×22=192
    L←(L−F'l)×2m=(213−166)×22=188
  20. 符号値の次の上位2ビットを整数値としてLに加算する。
    L←L+01=188+1=189
  21. Lの値から次の記号の整数符号値Fを逆算する。
    F=INT{N×(2L+1)−1
    ───────
    2H
    }=INT{101×(2×188+1)−1
    ──────────
    2×192
    }
      =99(本来の実数符号値=0.9891187)
  22. 元データの区間境界値より対応する記号dを出力する。
    復元データ:abcd
  23. 整数符号値からdの影響を取り除くために9.〜11.の手順を繰り返す。
    F'l=INT(l
    ──
    ×H+0.5)=INT(90
    ──
    101
    ×192+0.5)=171
    F'u=INT(u
    ──
    ×H+0.5)=INT(100
    ──
    101
    ×192+0.5)=190
    V=F'u−F'l=190−171=19
    27=128≦19×23=152<28=256  m=3
    H←V×2m=19×23=152
    L←(L−F'l)×2m=(189−171)×23=144
  24. 符号値の次の上位3ビットを整数値としてLに加算する。
    L←L+111=144+7=151
  25. Lの値から次の記号の整数符号値Fを逆算する。
    F=INT{N×(2L+1)−1
    ───────
    2H
    }=INT{101×(2×151+1)−1
    ──────────
    2×152
    }
      =100(本来の実数符号値=0.9900991)
  26. 元データの区間境界値より対応する記号はEOFなので、ここで復号を終了する。
    最終的な復元データ:abcd

4.8 算術符号化の特徴