以下、添付図面を参照して本発明に係る圧縮処理装置、伸長処理装置、圧縮処理用プログラム、伸長処理用プログラムの実施形態を説明する。各図において同一の構成要素には同一の符号を付して重複する説明を省略する。図1に、本発明に係る圧縮処理装置100と伸長処理装置200と実施形態の構成図を示す。圧縮処理装置100には、圧縮処理手段110と圧縮コード生成手段120が備えられている。伸長処理装置200には、伸長処理手段210と伸長コード生成手段220が備えられている。
圧縮処理装置100と伸長処理装置200はそれぞれ別のコンピュータによって構成することができ、また、一台のコンピュータによって構成するようにしても良い。300は、伸長コードの格納部を示し、圧縮処理装置100や伸長処理装置200の内部にあっても良いし、外部の記憶装置や他のコンピュータにあっても良い。更に、400は、圧縮コードの格納部を示し、圧縮処理装置100や伸長処理装置200の内部にあっても良いし、外部の記憶装置や他のコンピュータにあっても良い。
伸長コードは、圧縮処理装置100によって圧縮され得るディジタルデータであって、画像データや文字データ等のようなデータでも良く、一度圧縮されて伸長されたデータでなくとも良い。また、圧縮コードは圧縮処理装置100によって圧縮されたディジタルデータを指す。
圧縮処理手段110は、変形ベルヌーイ写像を遡る式を用いて、伸長コードの1単位データ毎に圧縮値の上限値と下限値とを算出し上記圧縮値の範囲を得る演算を反復して行うものである。ここに、圧縮値は圧縮コードに対応する初期値とこれを演算して得られるもので、以下では" Xi "として表記される値である。圧縮コード生成手段120は、上記圧縮処理手段110により最終的に求められた圧縮値の範囲から圧縮コードを生成するものである。伸長コードの1単位データとは、伸長コードが1と0の数値により構成されている場合には、この1と0を指す。また、伸長コードがabcd・・・のようにアルファベットから構成されているときには、a、b、c、d、・・・の1文字を指す。更に、後に説明するが、伸長コードが"Hello World!!\ "のような文字列(一般的には、データ列)を1つのコードとして構成されているときは、この"Hello World!!\ "のような文字列(一般的には、データ列)を指す。
伸長処理手段210は、圧縮コードに対し変形ベルヌーイ写像の式を用いた演算を施して、伸長コードの1単位データに対応する値を得る計算である1単位データ取得計算及び、この得られた値を前記変形ベルヌーイ写像の式を用いた演算に用いて次の1単位データを得る1単位データ取得計算を、所定回となるまで繰り返す反復計算を行うものである。伸長コード生成手段220は、上記伸長処理手段210の1単位データ取得計算毎に得られる値を、上記変形ベルヌーイ写像の式の係数に基づき伸長コードの1単位データに変換するものである。
<変形ベルヌーイ写像について>
まず、本実施形態において用いる変形ベルヌーイ写像について説明する。
変形ベルヌーイ写像は以下の式(1)で定義される。
上記式(1)は、p=0.5のとき、一般的に知られる一様な分布を持つベルヌーイ写像の式である。この式(1)は、データ伸長処理に用いられる。この変形ベルヌーイ写像のマップを示すと、図2のようであり、式(1)によるiを横軸に、xi+1 を縦軸とした時系列のデータ生成の例は図3に示すようになる。なお、図3の時系列のデータは"p = 0.5" とした場合の例である。
図3に示すように、xi < p のときに、ビット"0"を生成し、p ≦ xi のときに、ビット"1"を生成する規則により、連続してバイナリコードとして例えば4ビット分を取得することができる。上記ベルヌーイ写像の演算より取得されたビット列の値を基に、逆に写像を辿ることで初期値x0の区間を求めることが可能である。例として、"p = 0.5" とした場合にベルヌーイ写像から生成されたビット列を4ビット分とったものが " 0 1 1 0 "であったとする。図4の一番右の列に示すように上から順にビット値が生成され、そのときに選択されたベルヌーイ写像式を"○"で表し、選択されなかったベルヌーイ写像式を"×"で表した。即ち、"○"側の式が実行されて処理が遷移する。
ベルヌーイ写像の最後の解 " x4 " から考えると、写像xiの値域は必ず" 0 ≦ x4 ≦ 1 "の区間であり、この区間のいずれかに " x4 "は含まれている。" x4 "を生成した式は、ビット値が"0"であることから、"○"側の式" x4 = 2 x3 "が実行されていることが判る。この式を用いて、" x3 "の値の範囲を計算すると、
" 0 ≦ x4 ≦ 1 " から " 0 ≦ 2 x3 ≦ 1 " → " 0 ≦ x3 ≦ 0.5 "
となり、この区間から必ず" x3 "は計算されたことが判る。
次に" x3 "を考えると、次に生成されたビット値が"1"であるとの情報から、"○"側の式" x3 = 2 x2 - 1 "が選択されたことが判る。これを" 0 ≦ x3 ≦ 0.5 "に代入することにより、" 0 ≦ 2 x2 - 1 ≦ 0.5 "→ " 1 ≦ 2 x2 ≦ 1.5 "
→ " 0.5 ≦ x2 ≦ 0.75 "となり、" x2 "の区間が絞られる。
同様の処理により、次に生成されたバイナリコードは、ビット値"1"のため、" x1 "の区間は、" 0.5 ≦ x2 ≦ 0.75 " → " 0.5 ≦ 2 x1 - 1 ≦ 0.75 "
→ " 1.5 ≦ 2 x1 ≦1.75 " → " 0.75 ≦ x1 ≦ 0.875 "となる。
最後に、初期値" x0 "の区間について考察すると、次に生成されたバイナリコードは、祖のビット値が"0"であることにより、" 0.75 ≦ x1 ≦ 0.875 "
→ " 0.75 ≦ 2 x0 ≦ 0.875 " → " 0.375 ≦ x0 ≦ 0.4375 "となり、初期値" x0 "は0.375から0.4375の区間内のいずれかから始まっていたことが判る。この区間内に初期値" x0 "が存在したから、 p = 0.5 としてベルヌーイ写像の式(1)を実行し、上記の図3を用いて説明した「xi < p のときに、ビット"0"を生成し、p ≦ xi のときに、ビット"1"を生成する」という規則によってビット列を生成すると、必ず、" 0 1 1 0 "が出力される。
ここで、 p = 0.5 とした場合のベルヌーイ写像の初期値x0 の区間を16等分したものを図5に示す。図5に示した各初期値x0の区間内から xi < 0.5 のとき、ビット"0"を生成し、0.5 ≦ xi の時ビット"1"を生成させた場合に図6に示す16通りのビット列になり、上記ビット列" 0 1 1 0 "で示した例は図6の<7>になる。ここで、初期値x0 の区間の境界については、上限の値を含まず、図6<7>のように"0.375 ≦x0 < 0.4375 "となる。つまり、半開区間[0.375,0.4375)となる。
上記のように、1次元写像から生成されたビット情報を遡り、初期値x0の区間を求める方法については、特願2016−038794と特願2016−038795によって本願の発明者らが紹介した。
ベルヌーイ写像の上記例では、 p = 0.5 とした場合の初期値x0を絞り込む計算方法を示した。ベルヌーイ写像においては、傾き"p"は0.5以外の変数" 0.0 < p < 1.0 "としても同様に絞り込みの計算を行うことができることは言うまでもない。
上記のように、式(1)の写像を遡る場合の処理を、変数(パラメータ)を傾き pとして数式化する。即ち、式(1)を変形して"xi=・・・"の式求めると、式(1)によって生成されるビット列を[b0,b1,…,bi,…,bn-1] として、以下の式(2)で表現できる。
ここで、ビット数は " n " となり、" xn "の下限と上限は"0 ≦ xn ≦ 1 " から始められるため、最初(i = n - 1である場合)においては、" xn " の右辺は" xn = 1 "とし、左辺は" xn = 0 "として別々に計算を行ってゆき、最終的に" x0 "の下限と上限の区間として算出できる。
図6の16通りにビット列を4ビット分与え、" xn = 1 "(上限)と" xn = 0 "(下限)として別々に計算し、傾き p を "0 < p < 1" の区間で振り、各々の傾き p に対して初期値x0 の下限と上限をプロットすると、図7のようになる。図7は、横軸を傾きp、縦軸を初期値x0 としたものであり、それぞれの傾き p(横軸) に対して各々の初期値x0 の下限と上限の区間(縦軸)を読み取ることが可能なグラフとなっている。
図7においては、それぞれ線分で囲まれた領域を<1><2><3>・・・と示している。この線分は、図6の<1><2><3>・・・に対応するビット列についての各々の傾きパラメータp (0 < p < 1)に対応する初期値x0 の組み合わせの境界線と同一の意味を有している。パラメータpと初期値x0の組み合わせによって、この<1><2><3>・・・領域内のいずれかを選択することになる。伸長処理に用いる式(1)により得られたxiについて、xi < p のときビット"0"を生成し、p ≦ xi のときビット"1"を生成させる処理を行うことにより、必ず図6の<1><2><3>・・・に対応するビット列が得られることを意味している。
図6で示した p = 0.5 の場合において、初期値x0 の区間は、図7の p = 0.5 における初期値x0の区間に相当する。ここで、図7の p = 0.25 と p = 0.75とのときの初期値x0における区間に着目する。図7のp = 0.25 と p = 0.75上に、上下の矢印を表記してある。これは、図7の<1><2><3>・・・のビット列を確認すると判るように、 p = 0.25のときには "0"の数が1個("1"の数は3個)、p = 0.75のときは "0"の数が3個("1"の数は1個)となっている。つまり、p = 0.25とp = 0.75のときは"0"と"1"の数に偏りがあるポイントの例である。この例示ポイントは、図9にも示すように、以下で説明する算術符号のアルゴリズムで圧縮を行った場合の区間と同等になっている。
ここで、図8に、情報量として6ビットにより構成される伸長コードの全パターン64通りについて、式(2)における傾き p を "0< p <1" の区間で振って下限x0 と上限x0 の区間を絞り込んでプロットしたものを示す。各6ビットのパターン応じた領域は64領域に分かれており、この領域内における傾きpと初期値x0の組み合わせから式(1)の演算を行い、演算結果のxi がxi < pのとき"0"、p ≦ xiのとき"1"を出力させて連続してビット列を取得することで各領域に応じた伸長コードとしてのビットパターンを再現することができる。
<算術符号のアルゴリズム>
以下においては、変形ベルヌーイ写像の式或いは変形ベルヌーイ写像を遡る式を、用いた本発明実施形態のアルゴリズムが算術符号のアルゴリズムにより優れていることを明らかにするために、算術符号のアルゴリズムを説明する。算術符号はデータパターンの偏り具合(出現確率の偏り)が大きいものに対して最も効率よく圧縮が行えるアルゴリズムとして知られている。算術符号の圧縮過程を図10(a)に示す。図10(a)の例は、ビット列が"0 0 1 0"("0"が3個)の場合であり、この場合の圧縮過程を図示しながら説明する。この場合、算術符号のアルゴリズムを適用すると全ビットの数が4個であり、4個中、ビット値"0"の頻度は3のため、区間[0.0,1.0)において、ビット"0"の区間は3/4の[0.0,0.75)の半開区間、ビット"1"の区間は1/4の[0.75,1.0)の半開区間に分けられる。
圧縮処理がスタートとなると、伸長コード中の最初のビット値は"0"であるため、区間を[0.0,0.75)に更新する。伸長コード中の次のビット値は"0"であるため、区間幅の0.75を3/4にした[0.0,0.5625)に更新する。伸長コード中の更に次のビット値は"1"であるため、0.5625を3/4にした0.421875が下限となり、区間を"1"側へ0.421875だけ振った [0.421875,0.5625)に更新する。伸長コード中の最終のビット値は"0"であるため、区間[0.421875,0.5625)を3/4に分けて、ビット"0"側へ寄った区間[0.421875,0.52734375)に最終的に更新する。
上記において得られた区間内において、2進数の小数で最も少ないビット数で表されるものを探索する。すると10進数の0.5が相当し、2進数で表すと(0.1000…)2になるため小数点以下のビット"1"が圧縮コードとなり、情報量として1ビット(1/4)に圧縮される。以上が算術符号の圧縮の原理である。
伸長処理では、伸長コードのビット値の頻度数("0"が3個、"1"が1個)は事前に情報として知っている(保持している)必要がある。以下、圧縮コード"1"から伸長コード(元のビット列)である"0 0 1 0"に戻す処理を行う。圧縮コードは"1"であり、2進数では(0.1000…)2であるから10進数では0.5となる。保持している伸長コードのビット値の頻度から区間を分割して"0"の頻度の区間[0.0,0.75)と1の頻度の区間[0.75,1.0)から圧縮コード0.5は"0"の頻度の区間[0.0,0.75)に含まれることが検出される。このため、最初に伸長コードとしてビットデータとして"0"が出力される。圧縮処理と同様に最初のビット値が"0"のため、区間を[0.0,0.75)に更新する。
次に、区間[0.0,0.75)は、保持しているビット頻度から区間[0.0,0.5625)と[0.5625,0.75)に分割する。ここで、圧縮コード0.5は区間[0.0,0.5625)に含まれるため、2つ目の伸長コードとしてビットデータとして"0"を出力する。3回目も圧縮処理同様に、区間[0.0,0.5625)を保持しているビット頻度から区間[0.0,0.421875)と[0.421875,0.5625)に分割する。ここで、圧縮コード0.5は区間[0.421875,0.5625)に含まれるため、3つ目の伸長コードとしてビットデータ"1"を出力する。
最後の4回目は、上記の区間[0.421875,0.5625)を保持してあるビット頻度から区間[0.421875,0.52734375)と[0.52734375,0.5625)に分割する。ここで、圧縮コード0.5は区間[0.421875,0.52734375)に含まれるため、最後の4つ目の伸長コードとしてビットデータとして"0"を出力し、圧縮前のビット列"0 0 1 0"が得られたことで伸長処理が完了する。
算術符号による圧縮ではデータの頻度の偏りが大きいほど、最後の上限と下限の区間を広く確保できるため圧縮率が大きくなるといった特徴を持っている。図9に算術符号のアルゴリズムを適用したビット列4ビット分で16通り伸長コードに対して圧縮処理を行ったときの、それぞれの下限と上限の区間を算術符号の欄に示す。
<実施形態1 変形ベルヌーイ写像を遡る圧縮アルゴリズム>
図9と図10に示すように、本実施形態に係る変形ベルヌーイ写像を遡る圧縮処理では、圧縮を行う対象のビット列に対して算術符号と同じ区間において絞り込みを行うことができる。図10(b)に、変形ベルヌーイ写像を遡る式(2)を実行することで得られる処理手順を示す。算術符号の例と同じビット列"0 0 1 0"("0"が3個)の場合の圧縮過程を説明する。変形ベルヌーイ写像を遡ることによる圧縮では、算術符号の例とはビット列を逆順である"0 1 0 0"にして順番に処理を行う。つまり、変形ベルヌーイ写像を遡る式を用いる場合には、圧縮処理手段110は、伸長コードの最後尾の1単位データから最前の1単位データへ向かって1単位データ毎に圧縮値の範囲を得る演算を行う。本実施形態では、前述した算術符号と同様に、"0"が3個であり、式(2)のパラメータpが p = 0.75(=3/4)である場合について図10(b)で示す計算過程を以下において説明する。
ベルヌーイ写像の最後の解 " x4 "について考えると、写像xiの値域が閉区間[0,1]であるため、" 0 ≦ x4 ≦ 1 "の区間のいずれかに必ず含まれている。式(1)において" x4 "を生成した式は、伸長コードの最後尾の1単位データがビット"0"であることから、" x4 = x3 / 0.75 "が実行されたことが推定され、" x3 "の値を求める計算をすると、" 0 ≦ x4 ≦ 1 " から " 0 ≦ x3 / 0.75 ≦ 1 " → " 0 ≦ x3 ≦ 0.75 " となり、この区間から必ず" x3 "が計算されていることが判る。
次に" x3 "について考えると、伸長コードの1単位データがビット"1"であるという情報から、 " x3 = (x2 - 0.75) / (1 - 0.75) "が選択されたことが判る。そこで、上記の式を" 0 ≦ x3 ≦ 0.75 "に代入することで、
" 0 ≦ (x2 - 0.75) / 0.25 ≦ 0.75 "→ " 0 ≦ x2 - 0.75 ≦ 0.1875 "
→ " 0.75 ≦ x2 ≦ 0.9375 " が得られる。このようにして、" x2 "の区間を絞ること ができる。
次の伸長コードの1単位データがビット" 0"であるから、" x1 "の区間は、
" 0.75 ≦ x2 ≦ 0.9375 " → " 0.75 ≦ x1 / 0.75 ≦ 0.9375 "
→ " 0.5625 ≦ x1 ≦ 0.703125 "となる。
伸長コードの最後の1単位データがビット"0"であるから、
" 0.5625 ≦ x1 ≦ 0.703125 " → " 0.5625 ≦ x0 / 0.75 ≦ 0.703125 "
→ " 0.421875 ≦ x0 ≦ 0.52734375 "となる。
上記により、圧縮コードに対応する初期値x0 は0.421875から0.52734375の区間内(前述したように正しくは下限を含む半開区間[0.421875,0.52734375)とする)のいずれかの値であることが判る。このようにして得られる区間内の初期値x0 (圧縮コード)から"p = 0.75" としてベルヌーイ写像式(1)を用いた伸長処理を実行し、上記規則にてビット列を生成すると必ず" 0 0 1 0 "となる。
求めた区間は図9(図9の圧縮対象のビット列について変形ベルヌーイ写像を遡る場合は算術符号と逆順に処理するため一番右のビットから1ビットずつ左へと処理する)と、図10に示すように、前述の算術符号の例と同じ区間になっていることが判る。本実施形態でも、圧縮コードは、この区間内で一番少ないビット列で表すことができる小数点ビット値として求められる。この一番少ないビット列で表せられる小数点ビット値は、(0.1)2となり10進数では0.5となる。このように、圧縮コード生成手段120は、最終的に求められた圧縮値の範囲において最も少ないビット列で表すことが可能な2進数の小数を圧縮コードとする。
<実施形態1 変形ベルヌーイ写像による伸長アルゴリズム>
上記において用いた伸長コードにおいて、"0"の頻度は3/4のため、変形ベルヌーイ写像の式(1)において、傾きp = 0.75、初期値 x0 = 0.5 に設定して演算を行い(伸長処理手段210)、演算結果が0.75未満のときにビット"0"を出力し、0.75以上のときにビット"1"を出力する規則で反復演算する(伸長コード生成手段220)伸長処理が行われる。このような伸長処理を4回行う過程では、以下の通りに、ビット列"0 0 1 0"からなる伸長コードが得られる。
写像xi 出力ビット
x0 = 0.500000 0
x1 = 0.666667 0
x2 = 0.888889 1
x3 = 0.555556 0
上記では、小数点以下6桁目までを表示してある。
<データパターンが3種類の場合の算術符号による圧縮アルゴリズム>
上記の実施形態では、伸長コードの1単位データにおいては、ビット値が"0"か"1"の2種類(符号長1)の場合を示したが、算術符号と同様に3種類以上のデータパターンでも圧縮を行うことができる。例として"a", "b", "c"の3種類のデータパターンを用意し、データ列"abaacb"(合計6個)に対しての圧縮処理を説明する。図11(a)に算術符号を用いて圧縮を行った場合の圧縮過程を示し、図11(b)に本実施形態に係るベルヌーイ写像を遡る式を用いて圧縮を行った場合の圧縮過程を示す。
まず、算術符号を用いて圧縮を行った場合の圧縮過程から説明を行う。ここでは、上限と下限の値は小数点以下第6位まで記載する。伸長コードのデータパターンの頻度として、"a"は3個、"b"は2個、"c"は1個であるという情報を保持している。これに基づき、累積頻度はpa=3/6=0.5、pb=5/6=0.833333に設定される。また、図11(a)に示すように、0から1までの半開区間[0.1)は、"a"の区間として[0,0.5)と、"b"の区間として[0.5, 0.833333)と、 "c"の区間として[0.833333,1)とに分割される。
算術符号では、伸長コードのデータ列の最初の1単位データから順番に圧縮処理を行う。最初の1単位データが"a"であるため、区間[0.1)を[0,0.5)に更新し、[0,0.5)において頻度に応じた再分割を行う。即ち、"a"の区間は[0,0.5 x 0.5)= [0,0.25) 、"b"の区間は[0.5 x 0.5, 0.5 x 0.833333) = [0.25,0.416667)、"c"の区間は[0.5 x 0.833333, 0.5 x 1)= [0.416667,0.5)に分割される。
伸長データ中の2つ目の1単位データは、"b"であり、区間[0,0.5)を[0.25,0.416667)に更新し、頻度に応じた再分割を行う。"a"の区間は[0.25,(0.41667-0.25)x0.5 + 0.25)=[0.25,0.333333)、"b"の区間は[0.333333, (0.41667-0.25)x0.833333 + 0.25) =[0.333333,0.388889)、 "c"の区間は[0.388889, 0.416667)に分割される。
図11(a)に示すように、上記と同様な処理を残りのデータパターン"a", "a", "c", "b"についても行って、再分割を繰り返し、上限と下限の区間を狭めてゆく。最終的に半開区間[0.288194444444..., 0.290509259259...)が得られる。これを小数点以下のビット列(小数点以下12bitまでを表示)で表すと、下限(0.010010011100)2 〜 上限(0.010010100101)2になる。この区間内で一番短いビットで表せられる値は、(0.0100101)2となり10進数で表すと0.28906250となる。得られる圧縮コードは、" 0100101"になるため圧縮後のビット量は7ビット分になる。
算術符号による伸長処理では、予め辞書領域に"a"が3つ、"b"が2つ、"c"が1つ合計6個あるという情報が保持されている。この情報が、圧縮後ファイルにおける圧縮コード以外のオーバヘッド部になる。上記辞書領域の情報により、累積頻度が" 3/6, (3+2)/6, (3+2+1)/6 "として得られ、最初は半開区間[0,0.5),[0.5,0.833333),[0.833333,1)に分割される。
圧縮コードである(0.01001)2 から求められる10進数の"0.28906250"は、区間[0,0.5)に含まれるため、最初に1単位データとして"a"を出力する。次に、区間[0,0.5)を頻度に応じて再分割する。この結果、"a"の区間は[0,0.5 x 0.5)= [0,0.25) 、"b"の区間は[0.5 x 0.5, 0.5 x 0.833333) = [0.25,0.416667)、"c"の区間は[0.5 x 0.833333, 0.5 x 1)= [0.416667,0.5)に分割される。
圧縮コードに対応する圧縮値である0.28906250は、"b"の区間に含まれるため、2番目に1単位データとして"b"を出力する。以降、圧縮処理と同様に区間を分割して、いずれの区間に圧縮値が含まれるかを検出して、伸長コードの1単位データを出力する。この処理が繰り返されて、残りのデータパターン"a", "a", "c", "b"が得られ、伸長処理が終了する。
<実施形態2 データパターンが3種類の場合の変形ベルヌーイ写像を遡る圧縮アルゴリズム>
図11(b)を参照して、データパターン3種類の場合の変形ベルヌーイ写像を遡る圧縮アルゴリズムについて説明する。算術符号の例と同じくデータ列"aabcba"の出現頻度から設定された累積頻度paとpbを基に、変形ベルヌーイ写像のマップ図を描いたものが図12である。累積頻度paは"0.5"であり、累積頻度pbは"0.833333..."である。変形ベルヌーイ写像の式(3)は、以下の3つの式から構成される。
累積頻度paが"0.5"であり累積頻度pbが"0.833333..."であるから、データパターン"a"が生成される場合は式(3)における一番上の式 xi / pa が選択され、"b"が生成される場合は式(3)における上から二番目の式 (xi - pa)/(pb - pa)、"c"が生成された場合は式(3)における一番下の式 (xi - pb)/(1 - pb)、が選択されることが判る。
図11(b)に示す変形ベルヌーイ写像を遡る圧縮アルゴリズムを説明する伸長コードの最後尾の1単位データから順番に圧縮処理を進めるために、データ順は(上記算術符号の例との逆)"bcaaba"となる。累積頻度はpa = 0.5(=3/6)、pb = 0.833333(=5/6)とする。ここでは、小数点以下6桁までの表記である。
圧縮処理対象の最初の1単位データは、データパターン" b "であるから、式(3)の上から二番目の式が選択されたことが判り、" 0 ≦ x4 ≦ 1 " から
" 0 ≦ (x3 - 0.5)/(0.833333 - 0.5) ≦ 1 " → " 0 ≦ x3 - 0.5 ≦ 0.333333 "
→ " 0.5 ≦ x3 ≦ 0.833333 "となる。
圧縮処理対象の第2番目の1単位データは、データパターン"c"であるから、式(3)の上から三番目を選択されたことが判り、" 0.5 ≦ x3 ≦ 0.833333 "
→ " 0.5 ≦ (x3 - 0.833333)/(1 - 0.833333) ≦ 0.833333 "
→ " 0.0833333 ≦ x2 - 0.833333 ≦ 0.138889 "
→ " 0.916667 ≦ x2 ≦ 0.972222 "が得られる。
以上と同様の処理を、図11(b)に示すように残りのデータパターン"a", "a", "b", "a"に対して同様に繰り返すことで、最終的に算術符号の例で示した区間と同じ半開区間[0.288194444444..., 0.290509259259...)が得られる。これを小数点以下のビット列で表す(小数点以下12bitまでを表示)と下限(0.010010011100)2 〜 上限(0.010010100101)2となるため、この区間において一番短いビットで表せられる値を検索して、その値が(0.0100101)2として求められる。この値(0.0100101)2を10進数で表すと0.28906250となる。このように、得られた圧縮コードは" 0100101"になるため圧縮後のビット量は7ビット分になる。
以上のような圧縮処理を式(3)の変形ベルヌーイ写像を遡る処理として考え、傾き"pa"と"pb" を変数(パラメータ)として数式化すると、データパターンが"a", "b", "c"の3種類である場合のベルヌーイ写像を遡る式は以下の式(4)になる。
式(4)は3つの式から構成され、データパターンとして式(4)の右側括弧に示した "Wi" として、"a" or "b" or "c"が出現した場合に応じてその左に記載の式を選択して圧縮処理を行う。ここで、始めに、下限をxn = 0、上限をxn = 1 に設定して、下限と上限の区間を絞り込む演算を行う。式(4)の傾きpaと傾きpbには、累積頻度としてpa = 3/6 = 0.5、pb = 5/6 =0.833333…を設定する。このように圧縮処理手段110による圧縮処理は、式(4)の演算となるから、算術符号のように圧縮演算の過程において下限と上限の区間を再分割しながら下限と上限の区間を絞り込むといった演算を必要としないものである。
上記例で示したデータの順番"bcaaba"にて式(4)による反復計算を行うと図11(b)の圧縮過程に示すように、下限のxiと上限のxiが遷移される。最終的な下限と上限によって示す区間としては、半開区間[0.288194444444…, 0.290509259259…)が得られる。
図11(a)と図11(b)から判るように、算術符号と本発明の実施形態による手法とを比べると圧縮過程の途中で絞り込まれる下限と上限の区間は異なるが、最終的に絞り込まれる下限x0と上限x0の値は同一のものとなっている。
次に、変形ベルヌーイ写像による伸長処理を説明する。伸長処理は式(3)により行われる。累積頻度としてpa = 3/6 = 0.5、pb = 5/6 = 0.833333…を設定する。また、初期値x0 については圧縮コードが(0.01001)2であるから、10進数で表した初期値x0 = 0.28906250を設定する。
本実施形態の伸長処理では、式(3)による演算を行う(伸長処理手段210)。演算結果の値 xi が半開区間[0,0.5) に入っている場合には1単位データのデータパターン"a"を出力し、演算結果の値 xi が[0.5,0.833333…)に入っている場合には1単位データのデータパターン"b"を出力し、演算結果の値 xi が[0.833333…,1) に入っている場合にはデータパターン"c"を出力する(伸長コード生成手段220)。このような処理6回分の反復写像を行うことで連続して出力する。本実施形態によれば図13に示したようにxiが変遷され、対応するデータパターンを出力し伸長後のデータ列"abaacb"(合計6個)が得られる。
本実施形態と算術符号とを比較すると、算術符号ではデータパターンに応じて区間を1単位データの処理毎に再分割する必要があるが、本発明の実施形態では頻度に応じた区間を1単位データの処理毎に再分割することはない。しかも、圧縮処理では下限 xn = 0 と上限 xn = 1 を初期設定して式(4)からデータパターンに応じた式を選択して一意的に実行すれば良いため、分割する計算が不要であり高速化できるといった効果がある。
以上の例では式(4)による下限と上限を並行して計算することを示した。しかしながら、式(4)からは、最終的に得られる下限と上限の差分は、式(4)の傾き成分"pa", "pb-pa", "1-pc"(データパターン毎の頻度)の使用回数による累乗を乗算したものとして得られ、これが"0"と"1.0"の間に対する割合となることが、読み取れる。
上記の例ではpa が3回、pb-pa が2回、1-pb が1回用いられている。このため、
pa3 x (pb-pa)2 x (1-pb) = (3/6)3 x (2/6)2 x (1/6) = 0.002314814815
となり、この値は、上記の下限x0 = 0.288194444444と上限x0 = 0.290509259259の差分になっていることが判る。
このことから圧縮過程では下限と上限の双方を計算することなく、下限のみを計算して行き、最後に上記の差分を下限に足し算することで上限が得られるといったアルゴリズムを採用することが考えられる。この手法を採用すると、絶えず下限と上限を並行して算出する手間を省き高速な処理が可能である。このため、計算過程では下限(または上限)のみを一意に導出すればよくなり、算術符号と比べても下限と上限の区間を再分割し更新するといった手間が小さくなるといったメリットがある。このように、圧縮処理手段110は、上限値を求める演算と下限値を求める演算を、別個に行う構成を採用しても良い。
即ち、圧縮コード生成手段120は、上限値と下限値との差分値と、上限値または下限値のみを求め、上限値のみを求めた場合には最終的に求めた上限値から上記差分値を引いて最終的な下限値を求め、下限値のみを求めた場合には最終的に求めた下限値に上記差分値を加えて最終的な上限値を求める。
図7はデータパターンが2種類("1" or "0")であり、情報量が4ビットの場合であり、傾きpを "0 < p < 1" に振った傾きpに対する初期値x0の下限と上限の区間を式(2)により導出した2次元のグラフになっている。これに対し、データパターンが3種類で、ここでは上記例の1単位データが6単位からなるデータ列"abaacb"の場合において、初期値x0 の集合を図示してみる。ここで、式(4)おいて、傾きpaと傾きpbを 0.0 < pa < pb < 1.0(常にpa < pb)に振った場合においては、初期値x0の区間を導出して初期値x0 の集合を表示すると、図14(a)に示す如くなる。図14(a)は、X軸が傾きpaであり、Y軸が傾きpbであり、Z軸がx0であるようにして、3次元で表現したものである。この図14(a)を、Z軸の上から見ると三角形の薄く平坦で湾曲したZ軸方向に僅かに初期値x0 の区間分の厚みがある3次元の集合となっている。
図14(a)においては、点の集合として示している。上記の例において圧縮処理を行った(pa,pb,x0)座標は( 0.5, 0.833333…, [0.288194444444, 0.290509259259) )である。x0 は式(4)より求められた半開区間[)となる薄い厚みの部分である。これ以外の集合座標の(pa,pb,x0)の組み合わせが各pa, pbに応じたx0の区間内にあれば、対応するパラメータを式(3)のpa,pb,x0に設定して、反復演算を行うことにより伸長コードのデータ列"abaacb"が生成できることを意味する。
また、図14(b)に図14(a)とは別の集合の例を示す。図14(b)例は、データ列"caabac"の場合であり、図14(a)の例と同様に式(4)による初期値x0の区間を導出したものを示している。データの累積頻度からpa = 3/6 = 0.5、pb = 4/6 = 0.666666…になり、このパラメータによる初期値の座標(pa,pb,x0)は、(0.5, 0.666666…, [0.712962962963, 0.715277777778))となる。上記図14(a)でも説明したが、これ以外の集合座標の(pa,pb,x0)の組み合わせが各pa, pbに応じた図14(b)のx0の区間内にあれば、パラメータpa,pbとx0を式(3)に設定しデータ列を生成(伸長処理)した場合、データ列" caabac"が得られるものである。
以上では、データパターンが3種類までの場合の傾きパラメータに応じた初期値x0 の集合を視覚的に図7や図14に示した。データパターンが4種類以上の場合では直行系のデカルト座標では(軸が含まれてしまうため3次元までの表示となり)初期値x0 の集合を図で表すことができなくなる。しかし、1単位データであるデータパターンがN種類とした場合にも、傾きパラメータ群と初期値x0 はN次元の集合の座標として表すことができることは言うまでもない。
1単位データであるデータパターンがN種類の場合の変形ベルヌーイ写像の式は、N個の式の集合となることが式(1)と式(3)により明らかであろう。N個の式は、式(3)のように、N段に記載することができ、第1の1単位データ、第2の1単位データ、第3の1単位データ、・・・、第Nの1単位データの頻度を、K1、K2、K3、・・・、KNとする。これにより、上記N個の式においては、第1の1単位データに対応する式は、
(xi/K1)と記載することができ、
第2の1単位データに対応する式は、
(xi−K1)/(K2−K1)と記載することができ、
第3の1単位データに対応する式は、
(xi−K2)/(K3−K2)と記載することができ、
・・・・
第Nの1単位データに対応する式は、
(xi−K(N−1))/(1−K(N−1))と記載することができる。このように、変形ベルヌーイ写像を遡る式は、伸長コードを構成する1単位データの種類に対応して分かれている。
上記の変形ベルヌーイ写像の式は、伸長処理に用いられる。上記変形ベルヌーイ写像の式において、xiついて解いてxi+1の関数として表すと、変形ベルヌーイ写像を遡る式となる。この、変形ベルヌーイ写像を遡る式においても、伸長コードを構成する1単位データの種類に対応して分かれている。
<実施形態3 整数演算化アルゴリズム>
演算精度について考察すると、ベルヌーイ写像を遡る式による圧縮処理とベルヌーイ写像の式による伸長処理は、算術符号と同様な問題を有している。即ち、一般的なパーソナルコンピュータによるディジタル演算では、演算精度が固定値のため、丸め誤差が生じ、有効桁を超えた場合に誤差が生じ正しく演算ができなくなる。このため整数演算化(正規化演算)することで、ビット値による圧縮・伸長処理の演算が行える構成を採用したものが本実施形態である。
本実施形態は、1単位データのデータパターンが3種類である場合には、式(3)を用いた伸長処理と式(4)を用いた圧縮処理が行われることに鑑み、式(3)を整数演算化したものが式(5)であり、式(4)を整数演算化したものが式(6)である。即ち、本実施形態では、式(5)を用いた伸長処理と式(6)を用いた圧縮処理を実行する。
本実施形態では、1単位データが"a", "b", "c"の3種類からなるデータ列"abaabac"を用意し圧縮処理を行う。図15に圧縮処理のフローチャートを示し、これに従って圧縮処理の動作説明を行う。圧縮処理では3種類のデータパターンを処理する式(6)を用いる。このフローチャートに対応するプログラムをコンピュータが実行して圧縮処理装置が実現される。最初に圧縮対象とするデータ列である伸長コード(圧縮前コード)を読み込み(S11)、データパターンの頻度から各パラメータを設定するため、圧縮対象とするデータ列からデータパターンの頻度をカウントする(S12)。
次に、初期パラメータのセットを行う(S13)。このステップS13では、読み込んだデータ列"abaabac"の総数は7個であるため、"n = 7"(逆写像回数)となるので、式(6)のMに、 “M = 7"に設定する。データ列"abaabac"の内、データパターン"a"は4個であるため、"A = 4"、またPAには最初はAと同じく "PA = 4"を累積頻度として設定する。更に、データパターン"b"は2個であるため、データパターン"a"の個数に加えることで累積頻度は 4 + 2 = 6となり、"B = 6"となる。また、PBには最初はBと同じく "PB = 6"を累積頻度として設定する。以上で式(6)の初期パラメータ設定の処理(ステップS13)が終了する。
次に、ベルヌーイ写像を遡る式(6)では、伸長コードであるデータ列"abaabac"の最後尾の1単位データから順に処理を行うため、データパターン"c"を最初に読み出して式(6)による実施を行って行く(S14)。最初に処理するデータパターンは、"c"であるため、式(6)の一番下の式が選択され。次に区間の絞り込みの計算を行うために、初めのXn (=X7)について下限nにはX7 = 0、上限には最大の演算幅となるMの値であるX7 = 7を設定する。本実施形態の例では図16に示すように、最初の区間は、[0,PA),[PA,PB),[PB,M) = [0,4),[4,6),[6,7)となっている。
ここで式(6)の一番下の式に着目し、傾き係数となる"(M-B)/M"については、常に固定値"(M-B)/M"="1/7"であり、一連の処理が終わるまで変わらない勾配係数であるため保持することが好適である。式(6)の他の式における傾き係数も、同様に常に"A/M"="4/7"、 "(B-A)/M"="2/7"となるため、保持することが好適である。
次に、Xi+1と傾き係数の掛け算"((M-B)/M) Xi+1 " を実行後は、Mで割り切れない解になる場合があるため、計算する前に予め演算精度幅を拡大しておくことで必ず割り切れるように演算を行う(S15)。即ち、演算を整数演算化して行う場合には、圧縮値及び圧縮値の範囲を、伸長コードを構成する1単位データの数(M)倍する。
このため、区間(圧縮値の範囲)とXiをM倍に拡大し、区間は[0,PA),[PA,PB),[PB,MX) = [0,28),[28,42),[42,49)に更新(ここでMXは、拡大計算によって更新される演算精度幅の上限とする)し、XiもM倍することで必ず解が割り切れるように更新を行う。このように、式(6)を計算する前に、この拡大処理を経た後演算を行う。このため、データパターンを判定する閾値PAとPBについては、初期値はAとBと同じ値であるが、演算の都度拡大更新される変数となっている。
データパターン"c"の処理では、PA ,PB ,Xi をM=7倍後に、変形式ベルヌーイ写像を遡る式(6)を用いた整数演算処理を行う(S16)。ここでは、データパターン"c"の処理であるから式(6)の"((M-B)/M)Xi+1 + PB"を実行する。前述の通り、伸長コードであるデータ列"abaabac"のデータ個数は n = 7のため下限はX7 = 0、上限はX7 = 49を代入する。この結果、下限としては"X6 = (1/7)0 + 42 = 42 "が得られ、上限としては "X6 = (1/7)49 + 42 = 49 "が得られる。
次にステップS17において、NOへ分岐し、伸長コードの次の1単位データに対する処理であるステップS14へ戻って更にステップS15とステップS16の処理を続ける。次に処理するデータパターンは"a"であるため、式(6)の"(A/M)Xi+1 "が選択される。計算の前に拡大計算として、M=7倍を行い、区間を[0,PA),[PA,PB),[PB,MX) = [0,196),[196,246),[246,343)に更新し、先に求めた下限及び上限は同じく7倍に更新して、X6 = 294 、X6 = 343とした後、"(A/M)X6 "を計算し、下限は"X6 = (4/7)294 = 168 "となり、上限は"X6 = (4/7)343 = 196 "が得られる。
次にステップS17において、NOへ分岐し、伸長コードの次の第3番目の1単位データに対する処理であるステップS14へ戻って更にステップS15とステップS16の処理を続ける。3回目に処理するデータパターンは "b"のため、式(6)中の"((B-A)/M)Xi+1 + PA"が選択される。計算の前に拡大計算であるM=7倍を行い、区間を[0,PA),[PA,PB),[PB,MX) = [0,1372),[1372,2058),[2058,2401)に更新する。この結果、先に求めた下限及び上限はそれぞれ、X6 = 1176、X6 = 1372へ7倍とする更新を行った後、" ((B-A)/M)X6 + PA "を計算する。これにより、下限は"X6 = (2/7)1176 + 1372 = 1708 "とされ、上限は"X6 = (2/7)1372 + 1372 = 1764 "が得られる。以降残りのデータパターン "aaba" についても同様にステップS14からステップS16の処理を行う。この処理によって下限Xi、上限Xi、PA、PB、MXが図16に示されるように遷移されて一連の処理が行われる。
最終的にステップS17においてYESへ分岐し、ステップS18へ進む。図16に示す通り、最終的に下限X0 = 2101008、上限X0 = 2108176が得られる。この場合、下限と上限の実数が0.0〜1.0の範囲におけるどの区間になるかについては、求めた下限X0と上限X0 に対して、拡大してきた演算精度幅MX = 5764801(=78)による割算を行うことで求めることができる。ここで求められた下限X0と上限X0、演算精度幅MXを2進数のビット値で表すと、次のようである。
下限X0 → "1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 0"
上限X0 → "1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 0"
演算精度幅MX→ "1 0 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 0 0 0 0 0 1"
上記の下限X0と上限X0、演算精度幅MXを用いて、"X0 / MX" の計算を行って10進数の小数点以下6桁まで求めると
下限X0 = 0.364455
上限X0 = 0.365698
となり、これを2進数ビット値として小数点以下22桁まで示すと以下の通りである。
下限X0 = "0. 0 1 0 1 1 1 0 1 0 1 0 0 1 1 0 0 1 1 1 0 0 1"
上限X0 = "0. 0 1 0 1 1 1 0 1 1 0 0 1 1 1 1 0 0 1 1 0 0 0"
上記のように求められた下限X0と上限X0の間で、圧縮コードとなる最小のビット量で表せられる値は、"0. 0 1 0 1 1 1 0 1 1" である。圧縮コードとして小数点以下の9ビットを取得する。この値を10進数で表すと、"0.365234375"となる。
本実施形態に係るアルゴリズム上において、バイナリで圧縮コードを求めるための"X0 / MX" のビット演算手法を図17に示す。
図17の演算手法では、下限X0と上限X0をMXで割る割算をビット値同士で行う。計算開始直後では下限と上限のビット値は上位桁から同じビット値が出力されて行く。この2つの出力について、同じ桁でビット値を比較して行き、異なる値を検出し、上限X0に演算の余りがあればそこで計算を打ち切る。上記の異なる値の前の桁までの数値を圧縮コードとするというアルゴリズムである。この割算を行う装置は、ビット同士の大小比較器と引き算器から構成することができる。
ただし、上限X0が割り切れる場合には、区間の上限は含まないため下限の演算を続けて行くことになる。例えば、上限が割り切れた場合には、上限側の"0. 0 1 0 1 1 1 0 1 1"以降は0が永久に続くことがわかるため、下限側の割算の実行を続け、"0. 0 1 0 1 1 1 0 1 0 1 1 1 1 0"の下線部のように"1"が続いても、"0"が生じたところで計算を打ち切り、圧縮コードを"0. 0 1 0 1 1 1 0 1 0 1 1 1 1 1"とすることで下限と上限との間に入る値を必ず得るようにする工夫が必要である。
前述の小数演算により圧縮処理を行う実施形態に関する説明において、下限のみの計算を実行し、最後に、各傾き係数の使用回数による累乗を掛算して区間[0,1)の割合を求め、これを差分として上記下限に足し算することで上限の値を算出することが可能である旨を述べた。上記に鑑み、整数演算化した式(6)の例では、各傾き係数の使用回数による累乗の乗算である、"(4/7)4 (2/7)2 (1/7) "から差分を得ることができる。初期設定したM=7に対して7を掛け算した回数は、反復演算の回数と同じ7回である。従って、分母になっている最終的なMXは、MX = 7 x 77 (=78=5764801)となり、分子については初期設定の最大演算精度幅が M = 7であったことを考慮し計算すると、7 x 44 x 22 x 1 = 7168となり、これを下限X0 = 2101008に足し算すると"2108176"になり、上限X0 = 2108176を得ることができる。
圧縮した圧縮コードのファイル内容の一例を図18に示す。最初の行には、求めた圧縮コード"0 1 0 1 1 1 0 1 1"がセットされるのであるが、ここでは、圧縮コードを伸長処理のため初期値X0として、整数値の10進数である187により表わしてある。ファイルの2行目からは辞書領域(オーバーヘッド)となり、各データパターンの個数の後、アンダースコア後にデータパターンを記述してある。ここで圧縮コードはバイナリにすると情報量は9ビット、各個数は上から4、2、1となるためこれをバイナリ(4は(11)2、2は(1)2、1は(0)2 を割り当てる)にすると情報量として2ビット、1ビット、1ビットのため合計4ビットとなり、"a", "b", "c"はアスキーコードとした場合それぞれ8ビットのため合計8x3=24ビット、これらから伸長に最低限必要な情報量は9+4+24=37ビットとなる。
このため圧縮前の情報量は、元のデータがアスキーコードとすると、一文字あたり8ビットのため8x7=56ビットとなり、これに対し、圧縮後の情報量が37ビット(圧縮率約66%)となる。
次に、本発明の実施形態に係る伸長処理装置を説明する。伸長演算は、整数演算化した変形ベルヌーイ写像の式(5)を用いて行う。図19に、伸長処理のフローチャートを示す。このフローチャートに対応するプログラムをコンピュータが実行して伸長処理装置が実現される。
図19のフローチャートに示す処理がスタートとなり、最初に圧縮コードのファイルを読み出し(S21)、辞書領域の各データパターンとその個数を読み出す等のステップS22の処理が行われる。このステップS22では、式(5)のAにデータパターン"a"の累積頻度A = 4を、Bにデータパターン"a"と"b"の頻度(4と2)を足した累積頻度B = 6を設定し、データパターン"c"は頻度1のため、"a", "b", "c" (4と2と1)の累積頻度に上限M = 7が設定される。
また、ステップS22において、写像の回数もn=7に設定される。ただし、実際の写像回数は最初に写像演算を行う前に閾値から伸長処理のデータを出力するため、この場合6回分の写像を行えば7個分の伸長データが出力できることから伸長の演算回数は "n - 1" で終了できる。
ステップS22においては次の処理も行われる。初期値X0に対応する圧縮コード"0 1 0 1 1 1 0 1 1"を読み込む。圧縮コードを小数で表すと"(0.010111011)2"となり、実数の最大区間幅"1.0"(10進数)に対応するビットコードは"(1.000000000)2"(2進数)になるが、圧縮コード"0 1 0 1 1 1 0 1 1"を整数とした場合10進数では187になり、この実数の最大区間幅"1.0"に対応するビットコード"(1000000000)2"は10進数の整数では512となる。
次に、変形ベルヌーイ写像の式を構成する初期パラメータをセットする(S23、S24)。具体的には、図20に示すように、式(5)のPAとPBの設定等がなされる。更に、圧縮コードX0 と、累積頻度による分割される区間"0,A,B,M"との割合が合うように拡大を行う(S24)。累積頻度の区間の大きさ1を512倍することでPA = 512 x 4 = 2048, PB = 512 x 6 = 3072に設定し、初期値X0 は187 x 7 = 1309とする。式(6)の傾き係数"M/A"と"M/(B-A)"は演算精度の拡大に関わらず勾配係数は変化しないため、そのままの値" M/A = 7/4", "M/(B-A) = 7/2"を設定する。
式(5)の反復写像を実行する(S25〜S27)、ここでは、圧縮処理で行った処理と同様に拡大を行いながら反復演算を実行する。閾値によりXiがXi < PAに該当する場合には、1単位データ"a"を出力し、PA ≦ Xi < PBでは1単位データ"b"を出力し 、PB ≦ Xiでは1単位データ"c"を出力する(S25)。
計算過程を図21に示す。即ち、最初ステップS25において、初期値X0 = 157 x 7 = 1309はX0 < PA(=2048)であるため、1単位データ"a"を出力し、ステップS27では式(5)の(M/A) X0を実行する。このステップS27を実行する前にステップS26にて "A" の割り算による演算結果に余りが出ないよう、図21のようにPAとPB、X0 について演算幅をA(=4)倍に拡大(PA=8192,PB=12288,X0=5236)した後に(M/A) X0を実行する。これによって、図21に示すようにX1 = 9163となり、ステップS28を介し再びステップS25に戻ってPA ≦ X1 < PB となるため1単位データ"b"を出力する。
以降は、ステップS28においてNOへ分岐するとステップS25〜S27が繰り返される。即ち、上記と同様に図21に示すように分母のA,B-A,M-Bに応じて割り算の余りが出ないようPA, PB, Xiを拡大しながら式(5)の反復演算を実行し、Xiと閾値PAとPBの大小に対応する1単位データであるデータパターンを出力し、合計 "n - 1" 回の写像演算を行えば圧縮前のデータである伸長コードを復元させることができる。
<実施形態4 圧縮率の検証>
本発明の実施形態に係る圧縮処理装置と伸長処理装置は、前述で整数演算化した式(5)と式(6)を用いて図15と図19で示した圧縮と伸長の処理フローチャートに示すような処理を行うものである。本実施形態による圧縮率の効果を確かめるため、少し大きなデータ量のファイルを3つ用意し、本アルゴリズムが得意とする同じデータパターンの偏りが多いデータ列を用意して検証を行った。
ここでは、図22に示すように5種類のデータパターンを用意した。図22の<1>により示すデータパターンを64個、<2>により示すデータパターンを32個、<3>により示すデータパターンを16個、<4>により示すデータパターンを8個、<5>により示すデータパターンを8個用意した。上記<1>〜<5>の合計128個を第1のランダムに並べ変えた第1のファイルαと、上記<1>〜<5>の合計128個を第2のランダムに並べ変えた第2のファイルβと、上記<1>〜<5>の合計128個を第3のランダムに並べ変えた第3のファイルγとを用意した。第1のファイルαと第2のファイルβと第3のファイルγとは、それぞれが合計128行分の上記<1>〜<5>のデータパターンを有する。図23は、第1のファイルαの内容における最初の10行分を示したものである。
データ容量については、1文字はアスキーコード1byte(8bit)であるため、最後の改行コード"\"を1byte分として含めて各データパターンのバイト容量は、
"Hello World!!\" → 14byte
"This is Test.\" → 14byte
"Belnui Mapping\" → 15byte
"Compression\" → 12byte
"as an example.\" → 15byte
である。従って、ファイルの容量は、14 x 64 + 14 x 32 + 15 x 16 + (12+15) x 8 = 1800 byte となる。
上記のように作成されたファイルに対しては、図15に示したフローチャートに基づく圧縮処理を行った。データパターンの種類は5つであるため、圧縮時に用いた式は整数演算化した変形ベルヌーイ写像を遡る5つの式からなる以下に示す式(8)を用い、伸長時には5つの式からなる以下に示す変形ベルヌーイ写像の式(7)を用いた。
圧縮した結果を図24に示す。図24では各データパターンの並びを
Hello World!!\ → a
This is Test.\ → b
Belnui Mapping\ → c
Compression\ → d
as an example.\ → e
と置き換えて、128個分のデータの並びが3種類(α、β、γ)となっている。
図24の第1のファイルαをピックアップし、式(8)を用いた圧縮処理を説明する。式(8)の初期パラメータについては、頻度の合計M=128、各データパターンの累積頻度A=64, B=96, C=112, D=120を設定する。また、拡大計算を行うパラメータの初期値も同様に累積頻度PA=64, PB=96, PC=112, PD=120に設定できるが、ここで区間の比を考えると (0:64:96:112:120:128)の比は(0:8:12:14:15:16)と同等の比であるため、初期パラメータはA=PA=8、B=PB=12、C=PC=14、D=PD=15、M=16として式(8)に設定を行う。
また、式(8)の傾き係数に着目すると、A/M=8/16, (B-A)/M=4/16, (C-B)/M=2/16, (D-B)/M=1/16, (M-D)/M=1/16 となるため、約分すると、A/M=1/2, (B-A)/M=1/4, (C-B)/M=1/8, (D-B)/M=1/16, (M-D)/M=1/16 となるので、この約分結果を設定し、演算精度幅を節約した。本発明に係る圧縮処理装置の実施形態では、変形ベルヌーイ写像を遡る式の係数を、約分する。これにより演算の高速化を図っている。
このため、図25の最右列の欄に数値を記載して示すように、係数による割り算の余りが出ないようにするための拡大演算について、Aのときは2、Bのときは4、Cのときは8、Dのときは16、Eのときは16の倍数を指定して拡大する。前述していることではあるが、この拡大処理を行った後に式(8)の演算を実行する。
Xn(=X128)の最初の下限値として、 X128 = 0 を設定して図15のフローチャートを用いて演算を行う。最初のi=128からi=125までの4回分と、最後のi=2,i=1,i=0の3回分の演算結果を図25に示す。
式(8)を反復演算し、得られた下限値となる初期値X0は、
下限X0 = 23733347491256793664341091291605177003932093283721057794934496021699944736
の74桁の整数値となる。これを2進数で表すと初期値X0は、以下の合計244[bit]のビット列になる。
1101011011101011111011001000111011111101011111010111101101100111010011000100110000010010010001011010100010100010000111010001001110110001011011111100011110110101100001001100011110001011001010001111100001000011101000100000001110001110000100100000
他方、上限値となる初期値X0は、前述のように各傾き係数の使用回数による累乗を掛け算した" (1/2)64 (1/4)32 (1/8)16 (1/16)8 (1/16)8 "の値を差分として、上記下限値X0に足し算して得られる。ここでは、最初の最大演算精度幅が M = 16であること考慮し、傾き係数の分子を演算回数分掛け算すると
16 x 164 x 132 x 116 x 18 x 18 = 16となる。
これを先ほどの下限値に足し算すると10進数は、
上限X0 = 2373334749125679366434109129160517700393209328372105779493449602169994475 2
が得られる。
前記上限X0を2進数で表すと下限ビットに(10000)2 を足した合計244[bit]のビット列
1101011011101011111011001000111011111101011111010111101101100111010011000100110000010010010001011010100010100010000111010001001110110001011011111100011110110101100001001100011110001011001010001111100001000011101000100000001110001110000100110000
が得られる。
最終的(i=0)に得られる最大演算精度幅をMXは、各傾き係数の分母の値の使用回数による累乗を掛け算して導出する。
ここでも、最初の最大演算精度幅が M = 16であることを考慮して、
MX = 16 x 264 x 432 x 816 x 168 x 168 = 24 x 264 x 264 x 248 x 232 x 232
= 24+64+64+48+32+32 = 2244
となる。
下限X0と上限X0の区間について実数"0.0 〜 1.0"の区間への対応を考えると、前述したように下限X0と上限X0を最大区間で割り算することで得られる。最大演算精度幅は 2244 の2の乗数のため、上記の下限X0と上限X0の2進数ビット値を244ビット分右シフトした値になる。そして、上記ビット列の情報量は、244[bit]のため上記のビット列の頭に"0."をつけた値となる。
圧縮コードは、下限X0と上限X0の中から一番短いビットを選ぶことになる。ここに、下限側は区間に含んでもよいため、下限X0の値をそのまま圧縮コードに割り当てることができる。ここで下限X0の下位5ビット分が全て"0"であるため、下位5ビットを取り除いた以下の数値となる。
11010110111010111110110010001110111111010111110101111011011001110100110001001100000100100100010110101000101000100001110100010011101100010110111111000111101101011000010011000111100010110010100011111000010000111010001000000011100011100001001
上記の合計239[bit]分の数値が、図24の第1のファイルαの行方向欄における圧縮コードの列に示す圧縮コードである。このビットを10進数整数値で表すと、図24の第1のファイルαの横方向欄における「圧縮後初期値X0(10進数)」の列に示すように、初期値
X0 = 741667109101774802010659102862661781372877915116283056091703000678123273
となる。
圧縮後の圧縮データファイルに含まれるデータ内容の一例を図26に示す。図18に示したファィル内容と同じく、最初の行には初期値X0に相当する圧縮コード(図26では10進数)が記述され、2行目からは辞書領域(オーバーヘッド)となっており、各データパターンに関する情報が記述されている。本実施形態では、データパターンの種類が5種類であるから5行に亘って記述されている。各行には、そのデータパターンの存在個数に続いて、アンダースコア後にデータパターンの文字列が記述されている。図24に示すように、圧縮コードはバイナリにすると情報量は239ビットである。
辞書領域(オーバーヘッド)分の容量は、各存在個数情報が上から64、32、16、8、8と表記されるため、これをバイナリにすると、64は(111111)2、32は(11111)2、16は(1111)2 、8は(111)2となる。これらの情報量としては、6ビット、5ビット、4ビット、3ビット、3ビットの合計21ビットとなる。各データパターンの情報量は、前述した各データパターンのバイト数を足すと、70バイト、ビット数では560ビットになり、合計21 + 560 = 581ビットとなる。これに圧縮コード239ビットを足し合わせることで伸長に最低限必要な情報量は581+239=820ビットとなる。バイト数で表すと切り上げて103バイトとなる。このため圧縮前の情報量は元のデータは1800バイトであり、圧縮後の情報量が103バイトであるから圧縮率は約5.7%である。
図24の最も右側の列に参考として、オペレーティングシステムLinux(登録商標)でコマンドユーザインターフェース(CUI)として提供されている圧縮ツール " gzip "(Lempel-Zivとハフマン符号からなるアルゴリズム)と"bzip2"により同じファイルを圧縮した結果を示す。本実施形態に係る変形ベルヌーイ写像による圧縮については、辞書領域や圧縮コードの格納方法などプロトコルを決めることで実際は伸長に必要なデータを最小限で見積もったものより大きくなるが、圧縮後のデータ量は" gzip "の約半分になっている。
次に、図19に示したフローチャートによる手順によって、式(7)を用いて伸長処理を行うと、次のようになる。初期パラメータ設定は、図26に示されている圧縮のイメージの辞書領域のデータを用いて、累積頻度A=64, B=96, C=112, D=120, M=128として設定することができる。また、傾き係数パラメータ M/A, M/(B-A), M/(C-B), M/(D-C), M/(M-D) は、128/64, 128/32, 128/16, 128/8, 128/8、であるが、約分することで、
( M/A, M/(B-A), M/(C-B), M/(D-C), M/(M-D) ) = ( 2, 4, 8, 16, 16 )
が得られる。
圧縮コードは、初期値X0に設定される。閾値となるPA, PB, PC,PDについては、初期値X0の情報から、最大演算精度幅 (1.0000…)2 を239ビット左シフトしてMXとして求めると
MX = 883423532389192164791648750371459257913741948437809479060803100646309888
が得られる。
図27に示すように、初期値X0は16倍、累積頻度の区間の比率からPA=8, PB=12, PC=14, PD=15が与えられ、それぞれMX倍に拡大処理を行うことで初期値X0と累積頻度区間の比率が得られる。これらの値は、以下のようである。
PA = 7067388259113537318333190002971674063309935587502475832486424805170479104
PB = 10601082388670305977499785004457511094964903381253713748729637207755718656
PC = 12367929453448690307083082505200429610792387278129332706851243409048338432
PD = 13251352985837882471874731255571888868706129226567142185912046509694648320
以上の初期パラメータを式(7)に設定し、変形ベルヌーイ写像の反復演算を行う。第1のファイルαでの伸長処理の過程について、最初3回分と最後3回分を図28に抜粋して示す。図28ではXi < PAの場合には "a"を出力し、PA ≦ Xi < PBでは"b"を出力し 、PB ≦ Xi < PCでは"c"を出力し 、PC ≦ Xi < PDでは"d"を出力し 、PD ≦ Xi では"e" を出力する。127 (n-1) 回の反復処理を行うことでデータが伸長(復号)されて伸長コードが出力される。図28を参照すると、第1のファイルαの最初の3つのデータ列(cbc)と最後の3つのデータ列(bab)に図24の結果が一致していることが確認できる。なお、本実施形態では、データパターンが2文字以上のものを用いたが、データパターンの検索アルゴリズムとして文字列を巡回させるブロックソートを用いることが考えられる。
<実施形態5 頻度が等しくランダムなデータの圧縮>
実施形態3では、データパターンの頻度(度数)を変形ベルヌーイ写像の傾きパラメータとして設定を行っている。これは算術符号もデータパターンの頻度として設定する点で同じである。従来の一般的な可逆圧縮アルゴリズムでは、頻度が等しくランダムなデータ列に圧縮を行っても効果が得られなく、辞書領域分を含めるとデータ容量が元のデータ容量より大きくなってしまうといった問題がある。
この問題に対して考察する。図7、図8に鑑みると、頻度となる傾き"p"を変更した場合でも各領域に対応する傾きpと初期値x0を選択すれば同じビット列が得られることが明らかになった。これまでは、傾き"p"は頻度(出現確率)により決定する手法が採用されていた。これに対し、より少ないビット列の情報によって伸長コードを得ることができるような、該当領域内の傾きpと初期値x0を探索することができるならば、圧縮率を大きくすることが可能である。
例えば、符号"0"と"1"の頻度が等しく、ランダムな32ビット分のデータ列
"11000001101011010101101100100011"(16進数で表すと" C1AD5B23")を用意する。データ パターンが2種類("1"か"0")の場合、式(1)と式(2)の整数化演算式として、以下に示す式( 9)式(10)を用いることにする。圧縮時は式(10)を用い、伸長時は式(9)を用いる。
図15で示したアルゴリズムにて、上記の2値のデータの圧縮処理を行う。AとBの頻度はともに16となり、合わせると32ビット分のデータになる。ここで、式(10)の傾きはA/M = 16/32 = 1/2、(M-A)/M = 16/32 = 1/2(実数ではp=0.5)になり、始めにPA=1、下限X32=0を設定して式(10)により圧縮処理を行うと図29に示すように演算値XiとPAの値が遷移し、下限X0は
下限X0 = 6498727494が得られる。これを2進数ビット列で表すと、
110000011010110101011011001000110
になる。
上限X0について、開始時には最大演算幅 M = 2 であることを考慮して、傾きの分子の掛け算より差分は、2 x (1)32 = 2となる。そこで、この差分を下限X0に足すと、
上限X0 = 6498727496が得られ2進数ビット列は、
110000011010110101011011001001000
が得られる。
この区間に上限X0は含まれないため、この区間内における最小数ビットとしては下限X0が選択され、下位1ビットが0であるため、この下位1ビット"0"を取り除くことで圧縮コードは32ビット分の以下の値となる。
11000001101011010101101100100011
これを、10進数で表すと"3249363747"となる。
この例では、圧縮コードが圧縮前のデータ列と同じになったが、図5と図6と図7を参照すると判るように、図7の"p = 0.5"における縦軸の初期値x0の区間幅は、それぞれのデータ列で均等に分割されている。また、図5では"p = 0.5"であり、横軸の初期値x0の区間幅が均等に分けられおり、それぞれの区間内からベルヌーイ写像を行ったときの生成されるコードが図6に示されている。データ列として初期値x0を与え、圧縮処理で求められる図7における"p = 0.5"の縦軸の初期値x0の区間幅は、図5における横軸の区間幅と等しくなっている。つまり"p = 0.5"にて圧縮前のデータ列として初期値x0が与えられると、圧縮処理で求めた初期値x0が同じになる場合があるためである。
この圧縮後の圧縮データファイルに含まれるデータ内容が図30に示すようになる。図30(a)は10進数の表記であり、図30(b)は2進数による表記である。ここで圧縮コードは、バイナリにすると情報量は32ビットであり、"0"と"1"の各個数は、上から16、16となる。このため、これをバイナリ(16は(1111)2 を割り当てる)にすると情報量として合計8ビット、データパターン情報となる"0"と"1"は1ビット+1ビットのため合計2ビットとなる。これらから伸長に最低限必要な情報量は、32+8+2=42ビットとなる。この情報を辞書領域に保持させることが必要で、元(圧縮前)の32ビットの情報量より10ビット分だけ情報量が大きくなり、圧縮の効果が得られないものとなる。
以上の処理例は、図7、図8において傾きをp=0.5とし、初期値x0の半開区間を求めたものである。ここで、傾きを"p = 0.4375"(2進数では(0.0111)2 )に変更して、同じ32ビット分のパターン"11000001101011010101101100100011"について、式(10)による圧縮処理を実行してみる。
上記の傾きpは、整数ビットでは(0111)2となり、10進数では、"7"となるため、式(10)の傾きは A/M=7/16(=傾きp)であり、(M-A)/M=9/16と設定して、下限X32=0から始めて、図19のフローチャートにて圧縮を実行した結果の遷移状態を図31に示す。
求められた下限X0は、
下限X0 = 3743106035727648088261746893080105275376となり、
上限X0は、下限X0に差分16 x 716 x 916 = 985300660482914638629239767056を足した以下の値となる。
上限X0 = 3743106036712948748744661531709345042432
下限X0と上限X0をビットで表すとX0の区間は、
下限X0 =
101011111111111111111111111111111010111010101110001100001001111010001000101100010101010010110000101111100100110100110100111111110000
上限X0=
101100000000000000000000000000000111010110101001000010100100100000001110010001101000010011110011110100011001010010110001000000000000
となり、小数点32桁までの10進数の実数にすると、
0.68749999992604027276854594674660…≦X0≦ 0.68750000010701139974145235100877…
となる。この半開区間内の最小限で表せられるビット値の初期値X0は、(1011)2の4ビット( 0.0〜1.0間の実数は2進数で(0.1011)2となり10進数では0.6875)となる。
先に傾きp = 0.5として求めた圧縮コードにおいて、初期値X0は情報量32ビットであった。これに対し、傾きをp = 0.4375に変更して圧縮処理を行った場合では、圧縮コードにおいて、初期値X0の情報量4ビット分となり比較して28ビット分削減されている。
ただし、傾きp=0.5は情報量1ビットであったが、傾きp=0.4375は4ビットであり、3ビット分増加している。図32に、圧縮後の圧縮データファイルに含まれるデータ内容を示す。図32(a)は10進数の表記であり、図32(b)は、2進数ビット値に展開して表現したものである。図32の1行目は初期値X0に相当する圧縮コードであり、2行目は圧縮前の元データへ伸長するために必要な写像の回数、3行目は傾きパラメータA/M("A=7")とデータパターン("0")、4行目は傾きパラメータ("(M-A)/MのM-A=9") とデータパターン("1")を示している。
情報量については、圧縮コードである初期値X0は4ビット、伸長に必要な写像の回数の情報量は5ビット、傾きA/Mが4ビット、データパターン"0"は1ビット分、傾き(M-A)/Mが4ビット、データパターン"1"は1ビット分となり、これらから伸長に最低限必要な情報量は、4+5+4+1+4+1=19ビットになるため、圧縮前の32ビットと比べると13ビット分少なくなり(圧縮率59.375%)、"p = 0.5"のとき(42ビット)と比べても圧縮の効果が得られている。
また、この例の可逆圧縮のプロトコルが、データパターンはビット2値(符号長1)のみと定めている場合には、伸長に必要な情報は初期値X0 = (1011)2、傾きA=(0111)2、伸長後のデータ容量(写像回数)n=32=(11111)2 が判れば良いため、最小限必要なデータ量は、4+4+5=13ビット分あれば32ビット分の容量を復元することができ、圧縮率は40.625%となる。
ここでパーソナルコンピュータのツールとして使えるような具体例として、データパターンはビット2値(符号長1)のみ扱うと定めて、圧縮ファイルを1つのファイルとしてまとめるプロトコルを考える。例えば、圧縮ファイルの最初の2バイト分を圧縮前ファイルの容量情報として1〜65536ビット(1〜8192バイト)までの圧縮前ファイル容量が可能な対象とする。従って、65537ビット以上の圧縮前ファイルはプログラムでエラー処理する。圧縮ファイルの次の2バイトは傾き"p"を出現確率に割り当てる。具体的には、圧縮前のファイル容量中のデータパターン"0"をカウントした個数を出現確率として、傾き"p"とする情報を入れる。カウント値は必ず65536以下になる。また、本実施形態5のように、傾き"p"を変更することで初期値X0とする圧縮コードの情報量を少なくできる効果を得る構成を採用する場合には、傾き"p"を16ビットパターンまで変更(試行)できるものとして2バイト分を使用することも考えられる。傾き"p"はどのような値でも初期値X0を導出できる。
圧縮ファイルの5バイト目以降には、圧縮コードとなる初期値X0をセットする。このため、最初の4バイト分が辞書領域になる。伸長処理では最初2バイトからベルヌーイ写像の反復の回数(圧縮前ファイル容量)の情報を得て、次の2バイトで傾き"p"(式(9)ではA)の情報を得て、5バイト目以降から初期値X0を取得し、これらを初期設定して変形ベルヌーイ写像を行い圧縮前のデータ戻すといったプロトコルを考えることができる。
このように構成したデータ列の例によって、情報を符号化圧縮する場合の圧縮の限界を示す情報源符号化定理を確認する。情報エントロピーH(ビット)は次の定義式である式(11)により与えられる。
また、"pi"は符号の出現確率、"M"がデータパターンの事象(種類)の数である。
例に示した32ビット分のデータ列 "11000001101011010101101100100011"では符号は"0"と"1"の2種類(符号長1)であり、"M = 2"となり、データパターンの出現確率は"0"が" 16/32=1/2"、 "1"が" "16/32=1/2"となるため、情報エントロピーHは以下の式(12)のようになる。
このデータ列で符号は"0"と"1"の2種類(符号長1)と考えた場合、平均符号長を1ビット以下にすることができなく、情報量は32ビットのためこのデータ列を表すには "32 x 1 = 32ビット" 以上が必要になることを示している。平均符号長については平均符号長をLとすると
平均符号長L= ( 符号の長さ x 出現確率 )の和
で求められ、例示したデータ列では符号は"0"と"1"と考えると、符号の長さはそれぞれ"1"、出現確率は、"1/2(=16/32)"のため
L = (1 x 1/2) + (1 x 1/2) = 1
となり、平均符号長Lは1ビットとなっている。
情報源符号化定理では、平均符号長Lは情報エントロピーHよりも小さくできないとされ、不等式 "H ≦ L" が成り立ち符号化データ圧縮の限界を示している。例示したデータ列を2ビット区切りのブロック(符号長2)として解して、データ列をコンマで区切ると、"11, 00, 00, 01, 10, 10, 11, 01, 01, 01, 10, 11, 00, 10, 00, 11"となる。
それぞれの符号を数えると"00"は4つ、"01" は4つ、"10"は4つ、"11"は4つとなっているため、情報エントロピーHは符号の出現確率piがそれぞれ"1/4"、事象(種類)Mは4つのため、次の式(13)として求められる。
上記式(13)に示す通り、情報エントロピーHは2ビットとなる。ここで、データ列は2ビットずつ16個分あるため、このデータ列を表すには "16 x 2 = 32ビット" 以上が必要になることを示している。また、平均符号長Lについて符号は、"00"、 "01"、 "10"、 "11"であるから、符号の長さはそれぞれ"2"、出現確率はそれぞれ" 1/4 (=4/16) "のため、 L = (2 x 1/4) + (2 x 1/4) + (2 x 1/4) + (2 x 1/4) = 2
となり平均符号長Lは2ビットとなる。データ列を4ビットのブロックに区切った場合も同様に、16進数で表すと" C1AD5B23"となり、各符号は、1回ずつの出現確率のため情報エントロピーは、H=4、平均符号長L=4となり"H ≦ L"の関係となる。
以上から本実施形態に係る変形ベルヌーイ写像による手法は、符号長1としたときに32ビットの情報量を13ビットに圧縮できることが判る。このような結果によると、平均符号長は"13/32 = 0.40625ビット" となるため、本実施形態に係る手法は、符号化圧縮(ハフマン符号、Lemple-Ziv)と異なる算術式であり圧縮率をより大きくできる利点を有している。
伸長処理では、辞書領域から必要なパラメータを式(9)に読み込む。初期値 X0 = 11 = (1011)2、傾きM/Aは2進数小数点(0.0111)2になるため、Mは(1.0000)2を4ビット左シフトして得られる整数値 M = 16のためM/A = 16/7になる。傾きはM/(M-A) = 16/9になる。これら初期パラメータをセットして、伸長(復号)後のデータ量となる写像回数32を読み込む。実際には、前述したように伸長時の写像回数は"n-1"回で復元できるため、31回である。以上の準備が整うと、図19のフローチャートに示す処理手順にて式(9)による伸長(復号)処理を行うことで圧縮前のデータ列である伸長コードが出力される。この伸長処理の過程を図33に示す。
以上、頻度が等しくランダムなデータに対しても、傾きpを変更することで圧縮の効果が得られることを示した。これについては、特開2010−237735号公報には、変形テント写像は乱数生成に有効であることが紹介されている。これに対し、本実施形態は、変形ベルヌーイ写像を逆にたどる(遡る)圧縮アルゴリズムを用いて乱数生成シードを求め、そのシードから元のデータ列を出力できる構造とした点が特徴となっている。本実施形態に係る可逆圧縮手法は、圧縮コードとして情報量が少なくなる適切なシードを設定すれば、情報エントロピーの高いデータについても圧縮効果が得られることを狙いとする。
上述した本実施形態の説明から、データパターンが3種類でデータパターンの頻度が等しくランダムで圧縮効果が得られないデータ列の場合でも、図14に3次元の初期値集合を示したように初期値x0のビット数がより小さくなるような傾きpaと傾きpbの組み合わせを3次元の集合の中から求めることで、圧縮効果があるデータを得ることが推測される。
従って、データパターンがN種類からなる頻度が等しくランダム性が高いデータ列の場合にも、前述したようにN次元の集合からより情報量が少なくなる傾きパラメータ群と初期値x0の組み合わせを選択することによって、情報エントロピーが高いデータでも圧縮を高くできる効果が得られることが期待できる。
頻度として設定していた傾き"p"を変更する場合には、変更した傾き"p"によって、圧縮効果が上がるかどうか調べていく工程が発生するため、手間がかかる。しかしながら、圧縮処理では圧縮率を高めることのできる効果的な傾きパラメータを探索できることにより 、圧縮後のデータ量をより小さくできることがメリットとなる。
探索方法としては、傾きpをビット数が少ないものから二分探索法で圧縮効果があるかを調べていく手法が考えられる。例えば、p=0.5より、p=0.75と0.25の場合のx0の下限と上限を計算し、次はp=0.875,p=0.625,p=0.375,p=0.125の場合のx0の区間を調べ、圧縮効果がある場合はその値を採用するといったアルゴリズムが考えられる。
本実施形態に係る圧縮処理装置は、図1に示すように、圧縮コード生成手段120により生成された圧縮コードの伸長コードに対する圧縮率を求める圧縮率算出手段130を備え、上記圧縮率算出手段130により算出された圧縮率が所定値よりも大きい場合に、変形ベルヌーイ写像を遡る式の係数を変更して圧縮コードを求める処理を行う。ここでは、二分探索法により新たな係数を求めて係数を変更し、圧縮コードを求める処理を行う。
伸長処理においては、算術符号では区間を再分割するといった圧縮と同じ過程を繰り返す必要があるが、本実施形態の手法では変形ベルヌーイ写像を一意的に演算しながらデータ列を出力して行くため、圧縮処理と比較して計算量を小さく伸長処理が行えるという効果が期待できる。このため、圧縮は高性能なサーバで処理を行い、通信トラフィックを削減してネットワーク上に分配することにより、比較的処理能力が低い携帯端末で伸長(復号)する形態に好適となる。
<実施形態6 変形ベルヌーイ写像を遡る圧縮の場合の高速化アルゴリズム>
コンピュータで扱う数値はディジタル(離散)値になるため、圧縮処理における各パラメータ遷移を示した図16に明らかなように、演算を積み重ねることで桁数が増えていき演算の時間とコストが増大してしまう。実施形態4で示したデータ列"a b a a b a c"について、最後尾の "c"の次にもう一つ"c"をパディングすることで演算の省力化・高速化を図る実施形態を示す。
式(6)を用いて、データ列"abaabacc"に対し圧縮処理を行う。データ列"abaabacc" の総数は8個になるため"n = 8"となり、式(6)のMは “M = 8"に設定される。ここで、データパターンの頻度は、"a"が4個であるため"A = 4"、またPAには最初はAと同じく "PA = 4"を累積頻度として設定する。データパターン"b"は2個であるためデータパターン"a"の個数4を加えた累積頻度は 4 + 2 = 6となり、"B = 6"、またPBには最初はBと同じく "PB = 6"を累積頻度として設定する。
更に、傾きA/M = 4/8 = 1/2と約分し、傾き(B-A)/M = 2/8 = 1/4、傾き(M-B)/M = 2/8 = 1/4 と約分して設定する。以上のように式(6)の初期パラメータ設定を行うが、累積頻度の比率 PA:PB;M = 4:6:8 であり、同比率はPA:PB:M = 2:3:4 に設定できるため、初期パラメータをPA=2,PB=3に設定できる。このため約分すれば最初に設定する下限をX8 = 0、上限をX8 = 4に設定できる。
始めに、下限X8 = 0を代入して式(6)の圧縮処理演算によるパラメータXi, PA, PBの各遷移を図34に示す。ここで、Xi, PA, PBの拡大処理について、データパターン"a"の場合は傾きA/Mから割り算Mによる余りが出ないようにするため、倍率は2倍に演算精度幅を拡大すればよく、データパターン"b"とデータパターン"c"はそれぞれの傾き1/4のため共に4倍に演算精度幅を拡大すればよい。図34の一番右の列はこの式(6)の演算を行う前からの拡大倍率を示している。
図16ではデータ列数が素数の7(=M)であったため、演算精度の拡大処理は演算の都度7倍にしなくてはならなかった。これに対し、図34の例では"c"を1つパディングして傾きが約分できるようになったことで分母が小さい値になり、写像回数は1回分増えたが、演算過程のパラメータを比較すると演算精度の拡大幅が少なくなったことが確認され、演算コストの省力化が実現できる。
最終的に得られた下限は、X0 = 4412となり、そのときの最大演算精度幅が
16384(=214)であることを考慮して、最大演算精度幅と桁を合わせたビット値は、下限
X0 = (01000100111100)2となる。
最終的に得られる下限X0と上限X0の区間の差分は(1/4)4 x (1/2)2 x (1/2)2であることを考えると、開始時の最大演算精度幅がM=4であったことを考慮して、分母側は、
4 x 24 x 42 x 42 = 16384となり、分子側は、4 x 14 x 12 x 12 = 4となる。このた め下限X0に4を足すことで 上限X0 = 4416 が得られ、上限X0のビット値は、
上限X0 = (01000101000000)2
となる。
次に、下限X0と上限X0の半開区間[4412,4416)から、最小のビット量で表せられる圧縮コードを求める。"0.0 〜 1.0"間のどの区間に相当するかを考えると、図17では、得られた下限X0と上限X0のビット値をその演算精度幅のビット値で割ることで区間を導出して圧縮コードを得ることを示した。本実施形態のように、"c"を1つパディングした場合では、分母側はデータ量となる"M = 8"と2の乗数倍であるため、演算精度幅を拡大していき最終的には2の乗数倍の "16384(=214)"が得られた。このためビット値による演算は、上記の下限X0と上限X0のビットを" 214 "で割るため、14ビット分右シフトすればよい。
上記の下限X0と上限X0は情報量14ビットであるため、小数点以下では
下限X0 = (0.01000100111100)2〜上限X0 = (0.01000101000000)2の間となる。
圧縮コードを求めると、前述したように上限X0は半開区間で含まれないため、下限X0 のビット列を上位桁から"010001001111"まで見て行くと、その次のビットは"0"になっている。そこで、このビット "0"を"1"に変更することで半開区間内に含まれる値になり、圧縮コードは “0100010011111” になる。このように、圧縮コードは合計13ビットとなり、10進数として "2207"が得られる。
圧縮後の圧縮データファイルに含まれるデータ内容を図35に示す。伸長処理にて元に戻したいデータ列は"abaabac"の7つ分となるが、冗長なデータとして"c"を1つ追加(パディング)して行っているため、図18と比較して明らかなように、伸長後のデータ量に相当する写像を行う回数(7=(110)2とする)が辞書領域の2行目に追加される。図35に示すように、伸長に最低限必要なデータ量は圧縮コードの13ビット、データ量(写像回数7)の3ビットである。データパターン"a"の個数が2ビット、データパターン"b"と"c"は個数が各1ビットで計4ビット、データパターン"a", "b", "c"をアスキーコード1文字当たり8ビットとすると、3x8=24ビットとなり、圧縮後の情報量が合計で、13+3+4+24=44ビット(圧縮率約79%)となる。
図18では伸長に最低限必要な情報量は、9+4+24=37ビットであったが、圧縮コードが9ビットであった。これに対し本実施形態では、1文字パディングした圧縮コードは13ビットとなり4ビット分が増え、何回の写像で伸長処理を打ち切るかを示すデータ量に関する情報が必要となるため3ビット分が追加されており、比較すると合計7ビット分が増加する結果となった。
しかしながら、"c"を1つパディングした効果として演算の度に更新される演算精度幅は2の乗数倍になったため、最終的な区間を求めるビット同士の割り算のコストはその乗数分を右シフトすれば良くなる。結果的には、最終的に得られる演算精度幅のビット量がデータパターン頻度数と写像回数から判るため右シフト演算も不要になり、下限X0に分子側の整数値差分をそのまま加えることによって上限X0が求められ、圧縮コードも得られた下限X0と上限X0の値そのものから求められるようになるため、計算が省力化でき高速な演算が期待できる。
このように、本実施形態に係る圧縮処理装置では、伸長コードを構成する1単位データの数が2の倍数となり、且つ変形ベルヌーイ写像を遡る式の係数を、約分可能となるように、伸長コードに所定の1単位データをパディングする手段を有し、圧縮コードを求める処理を行うものである。
また、本実施形態が式(5)を用いて実行する伸長処理の過程を図36に示す。図35の圧縮データファイルに含まれる情報から各データパターンの頻度等の情報を読み出し、Mは各頻度の足し算 M = 4 + 2 + 2 = 8 になり累積頻度A=4, B=6となる。このため、式(5)の傾きは、M/A = 8/4 = 2, M/(B-A) = 8/2 = 4, M/(M-B) = 8/2 = 4
と全て割り切れる勾配値になる。かくして、伸長処理の過程で演算精度幅を増やす必要がなくなる。
また、初期値X0については圧縮コード“0100010011111”より、初期値X0 = 2207 が設定される。この演算精度幅は、213 = 8192 が設定される。閾値となるPA,PBについてはデータパターンの頻度から、"A:B:M = 2:3:4"となり、最大演算幅をMX=8192とすると、"PA : PB : MX = 4096 : 6144: 8192" と同等の比となるため、PA=4096,PB=6144を設定して、初期値X0はそのまま“2207"を割り当てることができる。
以上のようにパラメータを式(5)に初期設定し、図36に示すようにXiが演算により得られる毎に、 Xi < PAのとき1単位データであるデータパターン"a"を出力し、PA ≦ Xi < PBのとき1単位データであるデータパターン"b" を出力し、 PB ≦ Xi のとき1単位データであるデータパターン"c" を出力し、図35の2行目の情報より7回分の出力を行い、データ列 "abaabac" を復元した時点で伸長処理を終了する。
図21に示した例は、式(5)傾きの分子側がデータ量にも相当するM=7であり、例えば M/A = 7/4 の場合では割り切れない値になるものであった。そこで、演算の前に"A"の値を掛け算して演算精度を拡大することで余りが出ないように対策したため、図21の倍率の列に示す倍数で演算精度幅が増加している。
これに対し"c"を1つパディングした本実施形態では、その効果として、M=8となったため式(5)を参照して判るように、傾きの値が全て割り切れることになり、図36の演算の遷移に示すように最初に設定された演算精度幅が最後まで変更されることなく伸長の演算が実施される。このため伸長処理でも写像の度に演算精度幅の変更による演算コストが増大することなく、より高速に演算が行えるといったメリットがある。
本実施形態に係る可逆圧縮アルゴリズムは、以上の性質から圧縮対象とするデータ列については、素数などの割り切れないデータではなく、2の倍数の16,32,64,128,…,2n(ビット or バイト)単位の固定長で処理を行うことができる。このため、圧縮コード(初期値X0)の導出を、演算精度分の右シフト演算で行うことが可能になる。また、下限X0を導出してから上限X0を求める半開区間の導出は、データパターンの頻度と計算(写像)回数から求められる整数値の足し算を行い、その区間内での最小のビット量(圧縮コード)を求めれば良いことになる。これによって、右シフト演算(ビット小数点)自体が不要となる。従って、圧縮処理の対象とするデータ量としては、2の乗数倍の固定長を扱うプロトコルが望ましい。
また、データパターンの種類が多い場合に実施形態4の5つのデータパターンの場合で示したように、データ量がデータパターンの各頻度で割り切れるデータ列を用意した。このため、圧縮処理では約分により演算精度の桁がそれほど増えることなく、伸長処理では演算桁数を増やすことなく最初から固定の演算精度幅にて処理を行うことができた。
以上のことから、データ列の量(伸長コードを構成する1単位データの数)が2の倍数であり、かつデータパターンの頻度(変形ベルヌーイ写像を遡る式の係数)がうまく約分できるような頻度数になるように、データパターンをパディングして調整する本実施形態の構成によって、演算コストを抑えて圧縮処理と伸長処理の演算を高速化することが期待できる。
以上から、本実施形態である変形ベルヌーイ写像による可逆圧縮は、圧縮対象におけるデータ列の量が2の倍数なるようなデータ、例えば、固定長の通信パケット単位のデータや、ファイルを分割した分割後のデータなど、を通信や保存する用途に好適であることが判る。