(57)【要約】【課題】  圧縮対象とするファイルの形式をユーザが意識せずに圧縮でき、特に画像や音声を含むデータファイルを効率的に圧縮することが可能なデータファイルの符号化方法を提供する。【解決手段】  データファイルから所定のブロック単位でデータを読み込んでこれを主ブロックとし（ａ）、主ブロック内のデータを各バイト単位で解析して、相関のある繰り返しを検出し、主ブロックを、繰り返しのバイト数に応じた数の副ブロックに分離する（ｂ）。この副ブロックに対して、種々の圧縮符号化を行うことにより、データの特徴に応じて最適な圧縮が可能となる。【選択図】  図２
2005210584.tif 000002
【特許請求の範囲】
【請求項１】
与えられたデータファイルに対して、前記データファイルの総バイト数より小さい所定のバイト数のデータブロックである主ブロックを読み込む主ブロック入力段階と、
前記主ブロックが１または複数のバイト数を基本周期とする繰返配列とみなし、前記主ブロックの前記基本周期となるバイト数Ｋｍを解析するバイト構成解析段階と、
前記基本周期の第ｍ（１≦ｍ≦Ｋｍ）番目のバイトだけで構成されるＫｍ個の副ブロックに、前記主ブロックを分離するブロック分離段階と、
前記分離された各副ブロックに対して、情報量を削減する符号化処理を行う副ブロック符号化段階と、
前記符号化された複数の副ブロックを符号化ブロックとして出力ファイルに書き込む符号化ブロック出力段階と、を有し、
前記主ブロック入力段階、前記バイト構成解析段階、前記ブロック分離段階、前記副ブロック符号化段階、前記符号化ブロック出力段階を繰り返し実行し、前記データファイルに対してロスレス符号化を行うことを特徴とするデータファイルの符号化方法。
【請求項２】
請求項１において、
前記副ブロック符号化段階が、前記各副ブロックに対してランレングス符号化を行い、各副ブロックをデータ値部とランレングス部の２つの要素ブロックに分離するランレングス符号化段階を有し、以降の処理については２つの要素ブロックをまとめて副ブロックとして扱うものとしていることを特徴とするデータファイルの符号化方法。
【請求項３】
請求項２において、
前記ランレングス符号化段階において生成される２つの要素ブロックの総バイト数が、当該ランレングス符号化段階による処理前の対応する副ブロックのバイト数に比べて減少しない場合、以降の処理については前記ランレングス符号化段階による処理前の副ブロックに対して行うものとしていることを特徴とするデータファイルの符号化方法。
【請求項４】
請求項２において、
前記ランレングス符号化段階が、ランレングス符号化を実行するため最小のランの長さ別の符号化モードを設定し、各符号化モードによりランレングス符号化された前記２つの要素ブロックのうち、その総バイト数が最小となる２つの要素ブロックを、以降の処理について副ブロックとして扱うものとすることを特徴とするデータファイルの符号化方法。
【請求項５】
請求項１において、
前記副ブロック符号化段階が、第ｍ番目のバイト（ｍ＞１）で構成される各副ブロックの各バイトデータに対して、第（ｍ−１）番目のバイト以下で構成される副ブロックのいずれかに対応する各バイトデータとの差分値に置換するブロック間差分段階を有していることを特徴とするデータファイルの符号化方法。
【請求項６】
請求項１において、
前記副ブロック符号化段階が、各副ブロックの各バイトデータを、その直前に位置するバイトデータとの差分値に置換するブロック内差分段階を有していることを特徴とするデータファイルの符号化方法。
【請求項７】
請求項６において、
前記ブロック内差分段階を所定の回数だけ繰り返す処理を行うことを特徴とするデータファイルの符号化方法。
【請求項８】
請求項５または請求項６において、
前記ブロック間差分段階または前記ブロック内差分段階において得られる差分値が負値である場合、２５６を加えて０〜２５５の範囲に納める補正処理を行うことを特徴とするデータファイルの符号化方法。
【請求項９】
請求項５または請求項６において、
前記ブロック間差分段階または前記ブロック内差分段階による処理前後の副ブロックのバイトデータに対して、値の出現頻度を示すヒストグラムを算出し、ヒストグラムの分散値が処理前と比較して増大しない場合、前記ブロック間差分段階または前記ブロック内差分段階による処理前の副ブロックに対して以降の処理を行うこととすることを特徴とするデータファイルの符号化方法。
【請求項１０】
請求項１において、
前記副ブロック符号化段階が、バイトデータの出現頻度に基づいて頻度の高いデータほど短いビット長を割り当てる可変長符号化を行うものであることを特徴とするデータファイルの符号化方法。
【請求項１１】
請求項１から請求項９に基づいて符号化された符号化ファイルに対して、可逆圧縮方式によりさらに符号化を行うことを特徴とするデータファイルの符号化方法。
【請求項１２】
与えられたデータファイルに対して、請求項１から請求項１１のいずれかに記載の符号化方法により符号化された符号化ファイルを記録したコンピュータで読み取り可能な記録媒体。
【請求項１３】
コンピュータに、
与えられたデータファイルに対して、前記データファイルの総バイト数より小さい所定のバイト数のデータブロックである主ブロックを読み込む主ブロック入力段階、
前記主ブロックが１または複数のバイト数を基本周期とする繰返配列とみなし、前記主ブロックの前記基本周期となるバイト数Ｋｍを解析するバイト構成解析段階と、
前記基本周期の第ｍ（１≦ｍ≦Ｋｍ）番目のバイトだけで構成されるＫｍ個の副ブロックに、前記主ブロックを分離するブロック分離段階と、
前記分離された各副ブロックに対して、情報量を削減する符号化処理を行う副ブロック符号化段階、
前記符号化された複数の副ブロックを符号化ブロックとして出力ファイルに書き込む符号化ブロック出力段階を実行させ、
前記主ブロック入力段階、前記バイト構成解析段階、前記ブロック分離段階、前記副ブロック符号化段階、前記符号化ブロック出力段階を繰り返し実行させることにより、前記データファイルに対してロスレス符号化を行うためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、映像・音響制作、映像・音響データの素材保管、ロケ素材の中継など映像・音響制作分野、特にＮＴＳＣ以上の品質またはＣＤ以上の品質の高精細映像・音響制作を行う分野、コンピュータグラフィックスを用いたＣＧアニメーション映像制作分野、科学技術シミュレーションにおける可視化映像制作分野、ＣＤ・ＤＶＤ・半導体メモリ等のデジタル記録媒体を用いた映像・音響記録再生装置分野、電子カルテや遠隔医療における医用音響信号・静止画・動画像の保存と伝送、電子文書、印刷文書、デジタル印刷製版工程における素材やページメークアップ画像データの保管と伝送、リモートセンシング・衛星画像解析・地図情報処理分野におけるデータの保管と伝送など、データの改変が嫌われる分野、バイオインフォマティクス、ゲノム創薬、バイオ新素材開発など生物情報データベースの構築、検索を行う分野等、比較的情報量の多いデータファイルを扱う際に好適なデータの圧縮技術に関する。
【背景技術】
【０００２】
従来より、デジタルデータの圧縮には様々な方式が用いられている。このようなデータファイルの圧縮には、ＺＩＰ、ＬＨＡ等の圧縮機能も備えたアーカイバが、汎用的に用いられている。しかしながら、ＺＩＰ、ＬＨＡ等の汎用符号化プログラムでは、テキストデータの圧縮は効率的に行うことができるが、オーディオデータ・静止画データ・動画データなど、いわゆるバイナリデータの圧縮を効率的に行うことができないため、バイナリデータの圧縮を効率的に行うさまざまな手法が開発されてきている（例えば、特許文献１〜特許文献３参照）。
【特許文献１】特開２００１−３２５１３１号公報
【特許文献２】特開２００２−１６３１８０号公報
【特許文献３】特開２００２−１３５１２８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
しかしながら、上記特許文献１に記載の発明は、同一データブロックの重複を探索して圧縮するものであるため、自然界のサウンドや画像の圧縮には適しておらず、特許文献２に記載の発明は、ロッシー型圧縮にも適応したものであるため、ロスレス型圧縮について最適なものとなっておらず、特許文献３に記載の発明は、規則的に現れるバイトデータ群を辞書にワード登録するものであるが、対象データが１６ビット単位や２４ビット単位に配列されていると、規則的なワードが検出できない、等の問題がある。
【０００４】
そこで、本発明は、圧縮対象とするファイルのファイル形式およびデータ形式をユーザが意識せずに圧縮することが可能であり、特に画像や音声を含むデータファイルを効率的に圧縮することが可能なデータファイルの符号化方法を提供することを課題とする。
【課題を解決するための手段】
【０００５】
上記課題を解決するため、本発明では、与えられたデータファイルに対して、前記データファイルの総バイト数より小さい所定のバイト数のデータブロックである主ブロックを読み込む主ブロック入力段階と、前記主ブロックが１または複数のバイト数を基本周期とする繰返配列とみなし、前記主ブロックの前記基本周期となるバイト数Ｋｍを解析するバイト構成解析段階と、前記基本周期の第ｍ（１≦ｍ≦Ｋｍ）番目のバイトだけで構成されるＫｍ個の副ブロックに、前記主ブロックを分離するブロック分離段階と、前記分離された各副ブロックに対して、情報量を削減する符号化処理を行う副ブロック符号化段階と、前記符号化された複数の副ブロックを符号化ブロックとして出力ファイルに書き込む符号化ブロック出力段階を有し、前記主ブロック入力段階、前記バイト構成解析段階、前記ブロック分離段階、前記副ブロック符号化段階、前記符号化ブロック出力段階を繰り返し実行し、前記データファイルに対してロスレス符号化を行うようにしたことを特徴とする。
【発明の効果】
【０００６】
本発明によれば、符号化対象とするデータのバイト構成を解析して、解析結果に基づいて複数の副ブロックに分割し、分割した各副ブロックについて、さらに符号化を行うようにしたので、符号化対象のデータの特徴に応じて相関の高い部分について効率的に圧縮を行うことが可能となり、結果として圧縮率を高めることが可能となる。
【発明を実施するための最良の形態】
【０００７】
以下、本発明の実施形態について図面を参照して詳細に説明する。
（符号化方法）
本発明に係るデータファイルの符号化方法は、コンピュータに専用のアプリケーションプログラムを搭載し、このプログラムに従ってコンピュータが実行することになる。図１は、本発明に係るデータファイルの符号化方法の概要を示すフローチャートである。まず、対象とするデータファイルからデータを所定の単位で読み込む（ステップＳ１）。具体的には、１００ｋＢ（バイト）〜１ＭＢ程度のデータブロック単位で読み込むことになる。したがって、ステップＳ２以降の処理は、実際には、このデータブロック単位で行われることになる。ステップＳ１で読み込んだデータブロックを、後述する分離後の副ブロックと区別するために主ブロックと呼ぶことにする。続いて、読み込んだ主ブロックのバイト構成を解析する（ステップＳ２）。具体的には、どの程度のバイト間隔で、相関の高い部分が繰り返しているかを確認する。これは、マルチメディア・データの記録は、１バイト単位に限らず数バイト単位で行われるものが多いため、数バイト単位で相関の高い部分が繰り返されている可能性が高いために行う。実際には、主ブロックがＮバイトのときに、主ブロックのバイト値Ｂ（ｉ）（ｉ＝１，…，Ｎ）を利用して、以下の数式〔数１〕により算出されたＳ（ｋ）が最小となるときのｋをＫｍとする。この結果、その主ブロックはＫｍバイト単位で繰り返すバイト構成をしているということが解析される。言いかえれば、Ｋｍバイト単位の基本周期が繰り返されているということになる。
【数１】
2005210584.tif 000003
【０００８】
上記数式〔数１〕において、ｋは、基本周期のバイト数を探すための変数であり、設定された整数Ｋ（例えば６程度）を上限とする範囲内で、１よりＫまで変化させる。すなわち、数式〔数１〕を利用してＳ（１）〜Ｓ（Ｋ）を算出し、これが最小値をとるｋを上述のようにＫｍとする。
【０００９】
ステップＳ２において、主ブロックのバイト構成が解析できたら、次に、そのバイト構成に従って、主ブロックをＫｍ個の副ブロックに分離する（ステップＳ３）。具体的には、第（Ｋｍ×ｊ＋１）番目のバイトの集合、第（Ｋｍ×ｊ＋２）番目のバイトの集合、…第（Ｋｍ×ｊ＋Ｋｍ）番目のバイトの集合に分離することになる。すなわち、主ブロックは、第１副ブロック〜第Ｋｍ副ブロックのＫｍ個の副ブロックに分離され、第ｍ副ブロック（１≦ｍ≦Ｋｍ）は、元の主ブロックの第（Ｋｍ×ｊ＋ｍ）番目のバイトの集合となる。なお、ｊは０以上の整数、ｍは１以上の整数である。ここで、図２（ａ）に示すような配列の主ブロックを考えてみる。なお、図２（ａ）において、Ｂ１〜Ｂ８は先頭から１バイト目〜８バイト目のバイトを示している。このとき、Ｋｍ＝２であったとすると、図２（ａ）に示したブロックは、図２（ｂ）に示す２つの副ブロックに分離される。すなわち、図２（ａ）に示す主ブロックの基本周期は２バイトと解析されるため、図２（ｂ）に示すように、副ブロックは、基本周期の第１番目のバイトの集合と、基本周期の第２番目のバイトの集合の２つの副ブロックに分離されることになる。
【００１０】
図２（ｂ）に示したような、Ｋｍ＝２になる典型的なデータの例としては、量子化ビット数８ビットでサンプリングしたステレオ音響信号がある。この場合、同時刻のＬ（左）、Ｒ（右）の信号が交互に１バイト（８ビット）で記録されるため、１バイトおきに相関が高くなる。ここで、典型的な主ブロックのバイト配列とＫｍの値の関係について図３に示す。図３（ａ）は、音楽ＣＤ仕様のオーディオデータのバイト構成である。音楽ＣＤ仕様のオーディオデータは、量子化ビット数１６ビットでサンプリングしたステレオ音響信号であるため、１チャンネルの１サンプルの記録に２バイト（１６ビット）必要とする。そのため、図３（ａ）に示すように、Ｌ、Ｌ、Ｒ、Ｒという順で記録されていくことになる。このため、Ｋｍ＝４となる。図３（ｂ）は、高精細オーディオデータのバイト構成である。高精細オーディオデータは、量子化ビット数２４ビットでサンプリングしたステレオ音響信号であるため、１チャンネルの１サンプルの記録に３バイト（２４ビット）必要とする。そのため、図３（ｂ）に示すように、Ｌ、Ｌ、Ｌ、Ｒ、Ｒ、Ｒという順で記録されていくことになる。このため、Ｋｍ＝６となる。図３（ｃ）は、ＲＧＢフルカラー画像データのバイト構成である。ＲＧＢフルカラー画像データは、Ｒ（赤）、Ｇ（緑）、Ｂ（青）の各色８ビットで記録するため、１画素の記録に３バイト（２４ビット）必要とする。そのため、図３（ｃ）に示すように、Ｒ、Ｇ、Ｂ、Ｒ、Ｇ、Ｂという順で記録されていくことになる。このため、Ｋｍ＝３となる。図３（ｄ）は、ＣＭＹＫフルカラー画像データのバイト構成である。ＣＭＹＫフルカラー画像データは、Ｃ（シアン）、Ｍ（マゼンタ）、Ｙ（イエロー）、Ｋ（ブラック）の各色８ビットで記録するため、１画素の記録に４バイト（３２ビット）必要とする。そのため、図３（ｄ）に示すように、Ｃ、Ｍ、Ｙ、Ｋ、Ｃ、Ｍ、Ｙ、Ｋという順で記録されていくことになる。このため、Ｋｍ＝４となる。
【００１１】
続いて、分離した副ブロック間において、対応するバイトごとの差分演算を行う（ステップＳ４）。これは、先頭から１バイト目同士、先頭から２バイト目同士、という具合に副ブロック内の全てのバイトに対して行っていく。差分演算の結果は、一方の副ブロックのバイトの値として格納される。他方の副ブロックの各バイトの値はそのままである。ここで、図４（ａ）に示すような配列の２つの副ブロックを考えてみる。これは、図２（ｂ）に示した配列と全く同じである。このような２つの副ブロックに対して、ステップＳ４の処理を行うと、図４（ｂ）に示すように、第１副ブロックの値はそのままであるが、第２副ブロックの値は、差分値に置き換えられる。図４の例では、副ブロックが２つの場合について示したが、３以上の副ブロックが存在する場合には、第ｍ副ブロックのバイト値を第（ｍ−１）副ブロックのバイト値との差分、第（ｍ−２）副ブロックのバイト値との差分から第１副ブロックのバイト値との差分のいずれかに置き換える処理を行う。すなわち、前に位置する副ブロックのいずれかとの差分処理を行うことになる。なお、差分値が負の値となった場合には、２５６を加算して０〜２５５の範囲に納まるように補正した値を記録する。この際、前に位置する副ブロックの中で、どの副ブロックとの差分を採用するかは、後述するヒストグラムを算出する方法により判断し、差分をとる前に比べ分散値が増大したものを採用する。いずれの場合も増大しない場合は、本差分処理の結果を採用しない。
【００１２】
次に、各副ブロック内において、ランレングス符号化処理を行う（ステップＳ５）。これは、通常のランレングス符号化と同様、同一値のバイトが連続する場合に、各バイトごとの値を、そのバイト値と、連続するバイト数に置き換えることにより行う。ここで、図５（ａ）に示すような配列の２６７バイトの副ブロックを考えてみる。ランレングス符号化処理を行う場合には、どの程度の長さ以上のものをランレングス化するかを変化させることができる。図５（ｂ）〜図５（ｄ）はそれぞれ、図５（ａ）に示した副ブロックのデータを、ランが１〜３以上の場合に符号化した例を示している。図５（ｂ）はランが１以上、すなわち全ての値についてランレングス化する場合を示している。この場合、図５（ａ）に示した先頭から第１番目のバイトの値「１」は１つだけであるため、そのままデータ値部に記録され、ランレングス部には、連続する個数「１」から「１」を減じた「０」が記録される。ここで、「１」を減じるのは、データ記録の効率化のためであり、最小の長さ「１」を記録可能な最少値「０」に合わせるためである。同様にして、図５（ａ）に示した先頭から第２、３番目のバイトの値「２」は、その値がデータ値部に記録されると共に、ランレングス部には、連続する個数「２」から「１」を減じた「１」が記録される。また、図５（ａ）に示した先頭から第４〜６番目のバイトの値「３」は、その値がデータ値部に記録されると共に、ランレングス部には、連続する個数「３」から「１」を減じた「２」が記録される。また、図５（ａ）に示した先頭から第７〜１０番目のバイトの値「４」は、その値がデータ値部に記録されると共に、ランレングス部には、連続する個数「４」から「１」を減じた「３」が記録される。図５（ａ）に示した先頭から第１１〜２６７番目のバイトの値「０」は２５７個続くが、１バイトに記録できる数は２５６までであるので、２バイトにまたがって記録する必要が生じる。したがって、このような場合、データ値部には「０」が２バイト連続して記録される。一方、ランレングス部においても、２５７続くランを「２５６」と「１」に分離し、それぞれから「１」を減じた「２５５」と「０」が記録される。図５（ｂ）の例では、データ値部６バイト、ランレングス部６バイトの計１２バイトに圧縮されることになる。
【００１３】
図５（ｃ）はランが２以上の値についてランレングス化する場合を示している。この場合、図５（ａ）に示した先頭から第１番目のバイトの値「１」は１つだけであるため、そのままデータ値部に記録され、ランレングス部には、記録されない。図５（ａ）に示した先頭から第２、３番目のバイトの値「２」は、その値がデータ値部に２個記録されると共に、ランが２となるため、ランレングス部には、連続する個数「２」から「２」を減じた「０」が記録される。ここで、「２」を減じるのも、データ記録の効率化のためであり、最小の長さ「２」を記録可能な最少値「０」に合わせるためである。また、図５（ａ）に示した先頭から第４〜６番目のバイトの値「３」は、その値がデータ値部に２個記録されると共に、ランレングス部には、連続する個数「３」から「２」を減じた「１」が記録される。また、図５（ａ）に示した先頭から第７〜１０番目のバイトの値「４」は、その値がデータ値部に２個記録されると共に、ランレングス部には、連続する個数「４」から「２」を減じた「２」が記録される。図５（ａ）に示した先頭から第１１〜２６７番目のバイトの値「０」は２５７個続くが、図５（ｃ）の例では、２以上の長さのみ記録するため、２５７個は１バイトで記録可能である。したがって、データ値部には「０」が２個記録され、ランレングス部には、連続する個数「２５７」から「２」を減じた「２５５」が記録される。図５（ｃ）の例では、データ値部９バイト、ランレングス部４バイトの計１３バイトに圧縮されることになる。
【００１４】
図５（ｄ）はランが３以上の値についてランレングス化する場合を示している。この場合、図５（ａ）に示した先頭から第１番目のバイトの値「１」は１つだけであるため、そのままデータ値部に記録され、ランレングス部には記録されない。図５（ａ）に示した先頭から第２、３番目のバイトの値「２」も、そのままデータ値部に２個記録され、ランレングス部には記録されない。また、図５（ａ）に示した先頭から第４〜６番目のバイトの値「３」は、その値がデータ値部に３個記録されると共に、ランレングス部には、連続する個数「３」から「３」を減じた「０」が記録される。ここで、「３」を減じるのも、データ記録の効率化のためであり、最小の長さ「３」を記録可能な最少値「０」に合わせるためである。また、図５（ａ）に示した先頭から第７〜１０番目のバイトの値「４」は、その値がデータ値部に３個記録されると共に、ランレングス部には、連続する個数「４」から「３」を減じた「１」が記録される。図５（ａ）に示した先頭から第１１〜２６７番目のバイトの値「０」は２５７個続くが、図５（ｄ）の例では、３以上の長さのみ記録するため、２５７個は１バイトで記録可能である。したがって、データ値部には「０」が３個記録され、ランレングス部には、連続する個数「２５７」から「３」を減じた「２５４」が記録される。図５（ｄ）の例では、データ値部１２バイト、ランレングス部３バイトの計１５バイトに圧縮されることになる。
【００１５】
上記３つのモード（ランがどれだけ以上続いた場合にランレングス化するか）のいずれを適用するかについては、あらかじめ１つを設定しておいても良いし、３つのモードそれぞれを行って、その結果最も圧縮率が高くなるものを選ぶようにしてもよい。例えば、上記の例では、図５（ｂ）に示したようにランが１以上のモードの場合にランレングス化する場合が最もデータ量が少なくなるため、ランが１以上の場合にランレングス化した結果が採用される。いずれのモードを適用すると最も効率的であるかは、圧縮対象とされるデータにより異なる。いずれのモードを選択した場合であっても、復号のために、どのモードにより符号化しておくかを記録する。どのモードで符号化したかは、後述する処理パラメータに記憶しておく。
【００１６】
次に、図６（ａ）に示すような配列の２６７バイトの副ブロックを考えてみる。図６（ｂ）〜図６（ｄ）はそれぞれ、図６（ａ）に示した副ブロックのデータを、ランが１〜３以上の場合に符号化した例を示している。図６（ｂ）はランが１以上、すなわち全ての値についてランレングス化する場合を示している。この場合、図６（ａ）に示した先頭から順に１バイトずつ値が変化しているため、各値はそのままデータ値部に順に記録され、ランレングス部には、連続する個数「１」から「１」を減じた「０」が順に記録される。図６（ａ）に示した先頭から第９、１０番目のバイトの値「１」は、その値がデータ値部に記録されると共に、ランレングス部には、連続する個数「２」から「１」を減じた「１」が記録される。図６（ａ）に示した先頭から第１１〜２６７番目のバイトの値「０」は２５７個続くため、図５（ｂ）に示した場合と同様に、データ値部には「０」が２バイト連続して記録され、ランレングス部においては、「２５５」と「０」が記録される。図６（ｂ）の例では、データ値部１１バイト、ランレングス部１１バイトの計２２バイトに圧縮されることになる。
【００１７】
図６（ｃ）はランが２以上の値についてランレングス化する場合を示している。この場合、図６（ａ）に示した先頭から第８番目のバイトまでは、全てランが１であるため、各値がそのまま順にデータ値部に記録され、ランレングス部には記録されない。図６（ａ）に示した先頭から第９、１０番目のバイトの値「１」は、その値がデータ値部に２個記録されると共に、ランが２となるため、ランレングス部には、連続する個数「２」から「２」を減じた「０」が記録される。また、図６（ａ）に示した先頭から第１１〜２６７番目のバイトの値「０」は２５７個続くため、図５（ｃ）の場合と同様に、データ値部には「０」が２個記録され、ランレングス部には、連続する個数「２５７」から「２」を減じた「２５５」が記録される。図６（ｃ）の例では、データ値部１２バイト、ランレングス部２バイトの計１４バイトに圧縮されることになる。
【００１８】
図６（ｄ）はランが３以上の値についてランレングス化する場合を示している。この場合、図６（ａ）に示した先頭から第８番目のバイトまでは全てランが１であるため、各値がそのまま順にデータ値部に記録され、ランレングス部には記録されない。図６（ａ）に示した先頭から第９、１０番目のバイトの値「１」も、そのままデータ値部に２個記録され、ランレングス部には記録されない。図６（ａ）に示した先頭から第１１〜２６７番目のバイトの値「０」は２５７個続くため、図５（ｄ）に示した場合と同様に、データ値部には「０」が３個記録され、ランレングス部には、連続する個数「２５７」から「３」を減じた「２５４」が記録される。図６（ｄ）の例では、データ値部１３バイト、ランレングス部１バイトの計１４バイトに圧縮されることになる。図６（ａ）に示したデータに対しては、図６（ｃ）、図６（ｄ）に示したようにランが２以上の場合にランレングス化する場合、もしくはランが３以上の場合にランレングス化する場合が最もデータ量が少なくなるため、このどちらかの結果が採用される。
【００１９】
次に、各副ブロック内において連続するバイトの差分演算処理を行う（ステップＳ６）。具体的には、連続する２つのバイトの差分を演算し、後方のバイト値を更新する前の直前のバイト値との差分値で置き換える処理を副ブロック内の全てのバイトに対して行い、第１バイト目を除く全てのバイトが更新される。
【００２０】
さらに、上記ステップＳ６による処理後の各副ブロック内において連続するバイトの差分演算処理を行う（ステップＳ７）。すなわち、ステップＳ６で行った処理をもう１度繰り返すことになる。この結果、各バイトには、２バイト離れたバイトの値に影響された値が記録されることになる。これは、過去２サンプルを基に算出された線形予測誤差に類似の効果を得るために行われる。ステップＳ６、ステップＳ７における処理は、単なる差分演算であるので、線形予測誤差を算出するのに比べて精度は落ちるが演算負荷を削減することができる。なお、ステップＳ６、ステップＳ７における差分値が負の値となった場合には、２５６を加算して０〜２５５の範囲に納まるように補正した値を記録する。
【００２１】
以上のような処理の結果得られた各副ブロック（データ値ブロックおよびランレングスブロック）に対して、可変長符号化処理を行う（ステップＳ８）。この可変長符号化処理としては、ＺＩＰ、ＬＨＡ（Lampel Ziv＋Huffman方式）、ＰＰＭ（Predicted by Partial Match）、Golomb-Rice等のある情報を記録するために必要な平均ビット数を削減する公知の種々の符号化方式が適用可能である。
【００２２】
可変長符号化が行われたら、その結果得られる副ブロックをまとめて符号化ブロックとして、出力ファイルに書き込んでいく（ステップＳ９）。上記ステップＳ１〜ステップＳ９の処理を各主ブロック単位で処理することにより、元のデータファイルがロスレス圧縮された符号化ファイルが得られることになる。この符号化ファイルは、符号化ブロック単位で記録されている。
【００２３】
上記、ステップＳ３〜ステップＳ８の各処理については、全てを実行するようにしても良いが、その処理を行うことによって、反ってデータ量が増えてしまう場合には、その処理を省略するようにすることが望ましい。そこで、本発明では、各ステップにおける処理前と処理後のデータに基づいて所定の判断を行い、各ステップの結果を活かすかどうかの決定を行っている。基本的には、処理前のデータ量と処理後のデータ量を比較して、データ量の小さい方を採用するようにすれば良いが、ステップＳ４、ステップＳ６、ステップＳ７の処理については、各処理を行うことにより、各段階ではデータ量は変化せず、後段のステップＳ８の可変長符号化の段階で圧縮率に効果（または逆効果）が生じる。そこで、各段階ごとにステップ８を実行して逐次データ量の変化を調べる方法も考えられるが、処理負荷を軽減するため、以下分散を利用して推定判断する方法を提案する。与えられた副ブロックのデータのヒストグラムを算出して、分布がバイト値０またはバイト値２５５の両末端に偏ると、即ち平均値１２８に対する分散値が大きいと、ステップ８による可変長符号化により圧縮率が高くなることが判っている。具体的には、差分を計算して、データが０近辺の値になると、負値は２５５近辺の値に補正するようにしているため、０または２５５の両末端のデータが多くなり、圧縮率が増大する。分散を利用した判断の具体的な例について、図７のフローチャートを用いて説明する。
【００２４】
まず、副ブロックのバイト値のヒストグラムを算出し、平均値に対する分散を算出する（ステップＳ１１）。一方、差分処理後の副ブロックのバイト値のヒストグラムを算出し、平均値に対する分散を算出する（ステップＳ１２）。続いて、２つの分散を比較する（ステップＳ１３）。この結果、分散が大きい方のデータを採用する。すなわち、差分処理前の副ブロックに基づく分散が大きい場合は、差分処理前の副ブロックのデータを以降利用することとし（ステップＳ１４）、差分処理後の副ブロックに基づく分散が大きい場合は、差分処理後の副ブロックのデータを以降利用することとする（ステップＳ１５）。したがって、差分処理前の副ブロックに基づく分散が大きい場合は、差分処理を行わなかったのと同じこととなる。
【００２５】
なお、上記ステップＳ１１においては、バイト値Ｂm（ｊ）（ｊ＝１，２，…Ｎ／Ｋｍ：Ｎはブロックのバイト数）に対して分散σm0が算出される。また、ステップＳ１２においては、バイト差分値Ｄm（ｊ）（ｊ＝１，２，…Ｎ／Ｋｍ：Ｎはブロックのバイト数）に対して分散σmdが算出される。なお、ｋはブロック番号である。Ｄm（ｊ）は、副ブロック間における差分の場合と、各副ブロック内における差分の場合とで異なる。副ブロック間における差分の場合、Ｄm（ｊ）＝Ｂm（ｊ）−Ｂm（ｊ−１）であり、各副ブロック内における差分の場合、Ｄm（ｊ）＝Ｂm（ｊ）−Ｂm-1（ｊ）である。なお、Ｄm（ｊ）＜０の場合は、Ｄm（ｊ）に２５６を加えて正の値となるようにする。
【００２６】
各ステップの処理を行ったか否かの情報は、処理パラメータに記録されていく。各ステップの処理を行ったか否かの情報は、例えば行った場合は「１」、行わなかった場合は「０」とすることで各ステップについて１ビットで記録可能であるので、処理パラメータ自体は数ビット程度で済むことになる。各ステップの処理を行うか否かは、各主ブロックのデータにより異なるので、処理パラメータは各主ブロックごとに記録されることになる。
【００２７】
（復号処理）
次に、上記符号化方法により符号化した符号化ファイルからソースファイルを復元する復号方法について説明する。この復号方法も、符号化方法と同様に、コンピュータに専用のアプリケーションプログラムを搭載し、このプログラムに従ってコンピュータが実行することになる。図８は、データファイルの復号方法の概要を示すフローチャートである。まず、符号化ファイルからソースファイルの１ブロックに対応した符号化ブロックを読み込む（ステップＳ２１）。符号化ブロックの長さは、ブロックごとに異なるが、先頭にブロック長が記録されているため、復号するコンピュータは、符号化ブロックを認識して処理することができる。したがって、ステップＳ２２以降の処理は、実際には、この符号化ブロック単位で行われることになる。この符号化ブロックには、上述のように、符号化主ブロックと処理パラメータが記録されている。続いて、符号化主ブロックを構成する各符号化副ブロックの可変長から固定長への復号処理を行う（ステップＳ２２）。具体的には、各符号化副ブロック（データ値ブロックおよびランレングスブロック）に対して、ステップＳ８で行った方式の可変長符号化処理に対応した復号処理を行う。
【００２８】
続いて、各副ブロック内において連続するバイトの差分復元処理を行う（ステップＳ２３）。具体的には、連続する２つのバイトに対して、上記ステップＳ７で行ったのと逆の処理を行う。
【００２９】
次に、各副ブロック内において連続するバイトの差分復元処理を行う（ステップＳ２４）。具体的には、上記ステップＳ２３と同様、連続する２つのバイトに対して、上記ステップＳ６で行ったのと逆の処理を行う。
【００３０】
次に、各副ブロック内においてランレングス復号処理を行う（ステップＳ２５）。具体的には、上記ステップＳ５で行ったのと逆の処理を行う。すなわち、符号化時の規則に基づいて、データ値部のバイト値とランレングス部のバイト値から、元の形式の副ブロックを復元する。
【００３１】
次に、各副ブロック間の差分復元処理を行う（ステップＳ２６）。具体的には、上記ステップＳ４で行ったのと逆の処理を行う。すなわち、各副の先頭から１バイト目同士、先頭から２バイト目同士、という具合に副ブロック内の全てのバイトに対してバイト同士の値の加算を行い、加算した結果は、差分値が記録されていた副ブロックのバイトの値として格納される。他方の副ブロックの各バイトの値はそのままである。この結果、図４（ｂ）に示したような配列の２つの副ブロックの値が、図４（ａ）に示すような配列の２つの副ブロックに復元される。
【００３２】
次に、各副ブロックを統合して主ブロックを復元する（ステップＳ２７）。具体的には、上記ステップＳ３で行ったのと逆の処理を行う。すなわち、各副ブロックの先頭から順にバイトデータを並べて一つの主ブロックとする処理を行うことになる。この結果、例えばＫｍ＝２の場合、図２（ｂ）に示したような２つの副ブロックが、図２（ａ）に示すような配列の主ブロックに統合されることになる。
【００３３】
主ブロックが復元されたら、その主ブロックを出力ファイルに書き込んでいく（ステップＳ２８）。上記ステップＳ２１〜ステップＳ２８の処理を各符号化ブロック単位で処理することにより、圧縮符号化前の元のデータファイルが復元されることになる。
【００３４】
上記、ステップＳ２２〜ステップＳ２７の各処理については、符号化時にステップＳ３〜ステップＳ８の処理を行った場合にのみ実行される。そのため、図６のフローチャートに示した判断に基づいて、各処理を行った場合には、その際に記録された処理パラメータに従って、復号処理を行うことになる。この場合、上記ステップＳ２１において処理パラメータを読み込み、その処理パラメータに処理を行った旨の情報が記録されているステップについてのみ復号処理を行うようにする。
【００３５】
以上、本発明の好ましい実施形態について説明したが、本発明は上記実施形態に限定されず、種々の変形が可能である。例えば、上記実施形態では、主ブロックを複数の副ブロックに分離した後、各副ブロックに対してステップＳ４〜ステップＳ８の各処理を行っているが、これらの処理は、必ずしも全て行う必要はなく、少なくとも１つ以上を実行するようにすれば良い。
【図面の簡単な説明】
【００３６】
【図１】本発明に係るデータファイルの符号化方法の概要を示すフローチャートである。
【図２】主ブロックを複数の副ブロックに分離した状態を示す図である。
【図３】典型的な主ブロックのバイト配列を示す図である。
【図４】副ブロック間における差分演算を示す図である。
【図５】ランレングス符号化処理の一例を示す図である。
【図６】ランレングス符号化処理の異なる例を示す図である。
【図７】各処理前後のどちらのデータを利用するかの判断処理を示すフローチャートである。
【図８】データファイルの復号方法の概要を示すフローチャートである。
【図１】
2005210584.tif 000004
【図２】
2005210584.tif 000005
【図３】
2005210584.tif 000006
【図４】
2005210584.tif 000007
【図５】
2005210584.tif 000008
【図６】
2005210584.tif 000009
【図７】
2005210584.tif 000010
【図８】
2005210584.tif 000011