首页 / 专利库 / 电脑编程 / 算法 / 滑动窗口算法 / Device and method for compressing data using matching string retrieval and huffman coding

Device and method for compressing data using matching string retrieval and huffman coding

阅读:194发布:2022-01-28

专利汇可以提供Device and method for compressing data using matching string retrieval and huffman coding专利检索,专利查询,专利分析的服务。并且PURPOSE: To obtain higher compressibility at a higher speed with a smaller number of memories by using the Humman coding of tokens indicating raw bytes generated by matching strings and string retrieval. CONSTITUTION: In a compressing unit 4, input data 22 to be compressed are processed by using the window size of an MEMSIZE byte and the sliding window string retrieving algorithm of a block 24. The output of the block 24 is outputted as a series of tokens 26. Each token 26 is a matching string having a raw byte or a given length and offset. When no matching string is found in a previously processed MEMSIZE byte, a raw byte token is generated. A string token indicates the offset from the found string matching length and sliding window. The length and offset of the matching string are sufficient for the reconstruction of an elongated unit to the original data.,下面是Device and method for compressing data using matching string retrieval and huffman coding专利的具体信息内容。

【特許請求の範囲】
  • 【請求項1】 入力バイトのウインドウ内のマッチングストリングに対する探索であって、生のバイトまたは一定の長さおよび該ウインドウへ戻る一定のオフセットを有するマッチングストリングのいずれかを表現するトークンからなるストリームを生成する探索を実行するステップと、 該トークンを予め定義されているビンに割り当てるステップであって、該ビンのいくつかは、所定の長さおよび一定のオフセット範囲内にあるマッチングストリングを有するステップと、 各ビンに割り当てられたトークンの発生頻度に基づいて、可変長コードを各ビンに割り当てるステップと、 生成された各トークンに対し、各トークンが割り当てられた該ビンの該可変長コードを、出力データストリームに出力するステップと、 各可変長コードが出力された後、必要であれば、該ビン内の該トークンを正確に特定するために、余分なビットを出力するステップとを包含するデータ圧縮方法。
  • 【請求項2】 前記方法は、 前記可変長コードを割り当てる前に、入力データストリームの全てのマッチングストリング探索を完了するステップと、 該入力ストリーム全体から各ビンにおけるトークン発生数をカウントするステップと、 該発生カウントに基づいて前記可変長コードを割り当てるステップと、 各ビンに割り当てられた該可変長コードを示すコーディングテーブルを生成するステップと、 いかなる符合化されたトークンを出力する前に、該コーディングテーブルを前記出力データストリームに出力するステップとをさらに包含する、請求項1に記載の方法。
  • 【請求項3】 前記可変長コードを割り当てるステップが、前記発生カウントに基づいてハフマンのアルゴリズムを用いて該可変長コードを割り当てるステップをさらに包含する、請求項2に記載の方法。
  • 【請求項4】 前記コーディングテーブルを生成するステップが、前記可変長コードの長さのみを有するコーディングテーブルを生成するステップをさらに包含する、
    請求項3に記載の方法。
  • 【請求項5】 前記方法は、ランレングス圧縮体系を用いて前記コーディングテーブルを圧縮するステップをさらに包含する、請求項4に記載の方法。
  • 【請求項6】 前記方法は、 ハフマンコーディングを用いて、前記コーディングテーブルを圧縮するステップと、 該コーディングテーブル中の可変長に割り当てられたハフマンコードを特定するために使用される予備テーブルを生成するステップとをさらに包含する、請求項4に記載の方法。
  • 【請求項7】 前記方法は、 圧縮された出力データの末端部を示す特別なビンを割り当てるステップと、 全ての他のトークンが出力された後に、該圧縮された出力データビンの該末端部のコードを出力するステップとをさらに包含する、請求項1に記載の方法。
  • 【請求項8】 前記方法は、前記ビンを以下に示すように割り当てるステップ 【表1】 をさらに包含する、請求項1に記載の方法。
  • 【請求項9】 前記方法は、 ビン256から318のコードの後にストリングオフセットを特定する一定数の余分なビットを以下に示すように続けるステップ 【表2】 をさらに包含する、請求項8に記載の方法。
  • 【請求項10】 前記方法は、 ビン319から334のコードの後にストリングオフセットを特定する一定数の余分なビットを以下に示すように続けるステップ 【表3】 をさらに包含する、請求項9に記載の方法。
  • 【請求項11】 前記方法は、 ビン334のコードおよびオフセットビットの後にストリング長を特定する余分なビットを以下に示すように続けるステップ 【表4】 をさらに包含する、請求項10に記載の方法。
  • 【請求項12】 圧縮された入力データストリームを伸張するデータ伸張方法であって、 全てのバイト出力の履歴アレイを維持するステップと、 入力データストリームが消耗するまで、または該圧縮された入力データストリームの末端部を示すコードが見つかるまで、以下のステップを繰り返すステップと、 該圧縮された入力データストリームからビンコードを抜き出すステップと、 該ビンコードに関連したトークンを正確に決定するために必要とされる余分なビットを抜き出すステップと、 該トークンが生のバイトに相当する時、該生のバイトを出力するステップと、 該トークンがマッチングストリングに相当する時、該ストリングのオフセットを用いて該履歴アレイにインデックスバックすることにより該ストリングの全てのバイトを出力するステップとを包含する、データ伸張方法。
  • 【請求項13】 前記方法は、 前記圧縮された入力データストリームの開始部からコーディングテーブルを抜き出すステップと、 該コーディングテーブルからカテゴリーに対する可変長コードを抜き出すステップとをさらに包含する、請求項12に記載の方法。
  • 【請求項14】 入力バイトのウインドウ内のマッチングストリングに対する探索であって、生のバイトまたは一定の長さおよび該ウインドウへ戻る一定のオフセットを有するマッチングストリングのいずれかを表現するトークンからなるストリームを生成する探索を実行する手段と、 該トークンを予め定義されているビンに割り当てる手段であって、該ビンのいくつかは、所定の長さおよび一定のオフセット範囲内にあるマッチングストリングを有する手段と、 各ビンに割り当てられたトークンの発生頻度に基づいて、可変長コードを各ビンに割り当てる手段と、 生成された各トークンに対し、各トークンが割り当てられた該ビンの該可変長コードを、出力データストリームに出力する手段と、 各可変長コードが出力された後、必要であれば、該ビン内の該トークンを正確に特定するために、余分なビットを出力する手段とを備えた、データ圧縮装置。
  • 【請求項15】 前記装置は、 前記可変長コードを割り当てる前に、入力データストリームの全てのマッチングストリング探索を完了する手段と、 該入力ストリーム全体から各ビンにおけるトークン発生数をカウントする手段と、 該発生カウントに基づいて前記可変長コードを割り当てる手段と、 各ビンに割り当てられた該可変長コードを示すコーディングテーブルを生成する手段と、 いかなる符合化されたトークンを出力する前に、該コーディングテーブルを前記出力データストリームに出力する手段とをさらに備えている、請求項14に記載の装置。
  • 【請求項16】 前記可変長コードを割り当てる手段が、前記発生カウントに基づいてハフマンのアルゴリズムを用いて該可変長コードを割り当てる手段をさらに備えている、請求項15に記載の装置。
  • 【請求項17】 前記コーディングテーブルを生成する手段が、前記可変長コードの長さのみを有するコーディングテーブルを生成する手段をさらに備えている、請求項16に記載の装置。
  • 【請求項18】 前記装置は、 ランレングス圧縮体系を用いて前記コーディングテーブルを圧縮する手段をさらに備えている、請求項17に記載の装置。
  • 【請求項19】 前記装置は、 ハフマンコーディングを用いて、前記コーディングテーブルを圧縮する手段と、 該コーディングテーブル中の可変長に割り当てられたハフマンコードを特定するために使用される予備テーブルを生成する手段とをさらに備えている、請求項17に記載の装置。
  • 【請求項20】 前記装置は、 圧縮された出力データの末端部を示す特別なビンを割り当てる手段と、 全ての他のトークンが出力された後に、該圧縮された出力データビンの該末端部のコードを出力する手段をさらに備えている、請求項14に記載の装置。
  • 【請求項21】 前記装置は、前記ビンを以下に示すように割り当てる手段 【表5】 をさらに備えている、請求項14に記載の装置。
  • 【請求項22】 前記装置は、 ビン256から318のコードの後にストリングオフセットを特定する一定数の余分なビットを以下に示すように続ける手段 【表6】 をさらに備えている、請求項21に記載の装置。
  • 【請求項23】 前記装置は、 ビン319から334のコードの後にストリングオフセットを特定する一定数の余分なビットを以下に示すように続ける手段 【表7】 をさらに備えている、請求項22に記載の装置。
  • 【請求項24】 前記装置は、 ビン334のコードおよびオフセットビットの後にストリング長を特定する余分なビットを以下のように続ける手段 【表8】 をさらに備えている、請求項23に記載の装置。
  • 【請求項25】 圧縮された入力データストリームを伸張するデータ伸張装置であって、 全てのバイト出力の履歴アレイを維持する手段と、 該圧縮された入力データストリームからビンコードを抜き出す手段と、 該ビンコードに関連したトークンを正確に決定するために必要とされる余分なビットを抜き出す手段と、 生のバイトを出力する手段と、 マッチングストリングの全てのバイトを、該ストリングのオフセットを用いて該履歴アレイにインデックスバックすることにより出力する手段とを備えている、データ伸張装置。
  • 【請求項26】 前記装置は、 前記圧縮された入力データストリームの開始部からコーディングテーブルを抜き出す手段と、 該コーディングテーブルから該カテゴリーに対する可変長コードを抜き出す手段とをさらに備えている、請求項25に記載の装置。
  • 说明书全文

    【発明の詳細な説明】

    【0001】

    【産業上の利用分野】本発明は、一般的にはデータ格納及び伝送システムに関し、詳細には、データ格納及び伝送の能を改善する、データ圧縮システム及び方法に関する。

    【0002】

    【従来の技術】データ格納システムとデータ伝送システムとの間のデータ圧縮の重要でない違いによって、データ格納システムのみが、特に、このようなシステムに格納されたデータファイルに言及される。 しかし、全てのデータ格納システムは、データ伝送システム及び他のアプリケーションをカバーするように、容易に拡張され得る。 ファイルはバイト又はキャラクタの連続するストリームであると考えられ、そこではバイトは幾つかの固定された数のビットから成り、圧縮システムはこの入力バイトのストリームを、「圧縮された」バイトの出力ストリームに変換し、これから伸張ユニットによって、オリジナルファイルの内容が再構築され得る。

    【0003】コンピュータデータファイルが典型的に膨大な量の冗長性を含むということは、定着している。 これらのファイルがディスク又はテープ記憶媒体上でより小さいスペースを占めるように、又は1200ボーのモデムラインのような伝送チャネルに於いてより短い時間で移送され得るように、これらのファイルを「圧縮」するために多くの技術が長年用いられてきた。 例えば、パーソナルコンピュータに使用される幾つかの広く用いられている市販のプログラムがある(例えば、Systems En
    hancement Associates, Inc., Wayne, NJ, 1985のAR
    Cソフトウェア)。 このプログラムはファイル上で圧縮及び伸張の機能を果たす。 減少量はファイルの内容に大きく依存して変化するが、このようなプログラムにとって、与えられたファイルの大きさを2:1の比(又はそれ以上)に減少させることは一般的ではない。

    【0004】データ圧縮のための従来技術における多くのアプローチがなされている。 これらのアプローチの幾つかは、ファイル又はファイル内のデータの一定のタイプについて、暗黙の前提を作り出している。 例えば、スキャナを用いて生成されたページのビットイメージは、
    殆どが空白の画素であり、この傾向は、このようなファイルの大きさを大きく減少させる圧縮アルゴリズムによって利用される。 同様に、ワードプロセッシングファイルは、関係する言語(即ち、英語)に最もよく現れるキャラクタ(又はワード)の知識を用いて容易に圧縮される、多くのアスキーキャラクタを含んでいる。 他の圧縮方法はファイルのタイプから独立しており、そのデータに「適応」するようにされている。 一般に、特定のタイプ用の圧縮技術は、その技術が最適化されるファイル上では、一般用のアルゴリズムよりも高い圧縮性能を供給する。 しかし、もしファイルモデルが正しくないと、それらは非常に低い圧縮性能を有する傾向にある。 例えば、英語のテキストに最適化された圧縮方法は、フランス語のテキストを含むファイル上では、不完全にしか機能しないかも知れない。

    【0005】典型的には、格納システムはどんなタイプのデータがその中に格納されているかを知らない。 従って、特定のデータ用の圧縮技術は避けられ、又はそれらは可能な技術の集合の一つとして用いられるのみである。 例えば、ARCは多くの方法を用い、そして各ファイルに最適のそれを選択する。 しかし、このアプローチは単一の圧縮方法を用いるのに比べて、非常なコンピュータのオーバーヘッドを必要とする。

    【0006】圧縮方法の他の重要な見地は、ファイルが処理される速度である。 もし圧縮(又は伸張)の速度が非常に遅く、システムの性能を著しく低下させる場合には、たとえそれが競合する方法よりも高い圧縮比を達成し得ても、その圧縮方法は受け入れられない。 例えば、
    ストリームテープシステムでは、もしテープ駆動に必要な速度でデータを供給するのに十分速くファイルが圧縮されなければ、テープは流れの速度を落し、圧縮による性能及び/又は容量利得は無駄になる。

    【0007】最も一般的な圧縮技術の一つは、ランレングスコード化として知られている。 このアプローチは、
    ゼロ又はスペースキャラクタのような同じバイト(キャラクタ)が繰り返されたストリングを、ファイルがしばしば有しているという事実を利用している。 このようなストリングは「エスケープ」キャラクタを用いてコード化され、繰り返し数、繰り返されるキャラクタが続く。
    ランの形式で現れなかった他の全てのキャラクタは、それらを「普通テキスト」として出力ストリームに置くことによってコード化される。 エスケープキャラクタは滅多に使用しないバイトとなるように選ばれ、入力ストリームにおけるその出現は、キャラクタとしてのエスケープキャラクタそれ自身を有する長さ1のランとしてコード化される。 ランレングスコード化はあるタイプのファイル上ではよく機能するが、もしファイルが繰り返しのキャラクタを有していなければ(又はファイルにエスケープキャラクタがしばしば出現すれば)、低い圧縮比率しか有し得ない。 従って、一般に、エスケープキャラクタの選択は、データ上で最も使用の少ないバイトを捜すという余分な経路を必要とし、このようなシステムの効率を低下させる。

    【0008】最も洗練されたアプローチは、ハフマンコードとして知られている(Huffman,David A., "A Metho
    d for the Construction of Minimum Redundancy Code
    s",Proceedings of the IRE, pp. 1098-1110, Septembe
    r 1952を参照せよ)。 この方法では、あるバイトはファイル内で他のバイトよりしばしば多く現れると仮定される。 例えば英語のテキストでは、文字「t」又は「T」
    は文字「Q」より多く存在する。 各バイトはビットストリングに割り当てられ、その長さは、逆にファイル内におけるそのバイトの相対的な頻度に関係する。 これらのビットストリングは、もし1ビットがある時に処理されると、唯一の結果しか生じないようにデコードされるように選択される。 ハフマンはファイルに対する相対的頻度の統計に基づく、ビットストリングの最適割当てのためのアルゴリズムを導いている。

    【0009】ハフマンアルゴリズムは、達成される圧縮が漸近的にファイルの「エントロピー」に近づくことを保証し、それは以下のように正確に定義される。

    【0010】 H=SUM−[p(i)log 2 (p(i))] ここで、 p(i)=ファイル内のキャラクタiの確率 =(iの出現数)/(ファイル内のキャラクタの総数) Hの単位はビットであり、それはファイル内のキャラクタを表現するのに(平均して)どれだけのビットが必要であるかを測定する。 例えば、もしエントロピーが8ビットバイトを用いて4.0ビットであれば、ハフマン圧縮システムはファイル上で2:1の圧縮をなし得る。 エントロピーが高いほど、データはより「乱雑」(従って、あまり圧縮できない)である。

    【0011】ハフマンのコード化は多くのタイプのファイル上で非常によく機能する。 しかし、ビットストリングのバイトへの割当ては、多くの実際的な困難を伴う。
    例えば、予め設定されたコード化スキームが用いられる場合(例えば、英語における文字の出現の頻度に基づいて)、もしその予め設定されたスキームが、ファイル内の実際に存在するものとかなり異なる頻度統計であると仮定すると、ハフマンのコード化はファイルを大きく拡張するかもしれない。 これに加えて、ファイルの内容に基づくコード化スキームの演算は、ハフマンアルゴリズムを頻度統計に適応するのと同様に、データ上での2つのパスを必要とするのみならず(従って、システムの効率を低下させる)、コード化テーブルがデータに沿って格納されるということが必要とされ、これは圧縮率の上での否定的な衝撃を有する。 更に、バイトの相対的頻度は、ファイル内で動的に容易に変えられ得る。 そのため、どの点でも特定のコード化割当てはうまく機能しない。

    【0012】ハフマンアプローチの多くの変形があり(例えば、Jones, Douglas W., "Application of Splay
    Trees to Data Compression", Communications of the
    ACM,pp. 996-1007, Vol. 31, No. 8, August 1988)、
    通常、それらは処理された入力バイトの最新の履歴に基づいた、動的コード割当てを含んでいる。 このようなスキームは上で議論した問題点を回避する。 他のアプローチは同時に2バイトワード(バイグラム(bi-gram))
    を見ることを含み、ハフマンのコード化をそのワード上で行う。

    【0013】近年のハフマンのコード化の変形は、MacC
    riskenの米国特許第4,730,348号(及びその中で参照されている他の特許)に現れている。 MacCriskenの米国特許では、ハフマンコードは先のバイトのコンテキストにおけるバイトに割り当てられる。 言い換えれば、複数のコード化テーブルが用いられ、各テーブルは先のバイトに従って選択される。 このアプローチは、例えば、英語では文字「u」は頻繁には現れないが、「q」の後には殆ど常に現れるという観察に基づいている。 従って、
    「u」に割り当てられるコードは、先の文字が「q」
    (又は「Q」)であるかどうかに依存して異なるであろう。 多数のテーブルと動的コード割当てとを用いる同様のスキームについては、Jones, Douglas W., "Applicat
    ion of SplayTrees to Data Compression"を参照されたい。

    【0014】上述のハフマンタイプのアプローチは、コンピュータによって強化される傾向にあり、例外的に高い圧縮比率を達成するものではない。 この観察に対する一つの説明は、8ビットバイトに基づく純粋なハフマンコードは最も良い場合には8:1の圧縮比率を達成し得ること、そしてそれはファイルが同じバイトの繰り返し(即ち、エントロピー=0)から成る最善の状況でのみ達成され得ることである。 同じ状況では、単純なランレングスコード化スキームは50:1以上の圧縮率を達成し得る。 平均の性能は最善及び最悪の場合の数の同じ組み合わせであろう。 そして、最善の場合の限度は、その平均をも制限する。 ハフマンのコード化の公知の限度は、確率が厳密に2の累乗でなければ、理論的な限度の1ビットの範囲内となることは保証されるが、エントロピーを達成し得ないことである。 これは、全てのハフマンコードが長さにおける正確なビット数であるという事実のためである。 一方、全ての場合においてエントロピーを達成するためには、断片的なビット長が必要である。 言い換えると、ハフマンのアルゴリズムはまるめの問題を有している。 一般に、高い確率でトークンがある場合に問題は悪化する。 なぜなら、「エラー」のビットの断片が、割り当てられたコードのサイズの大きなパーセンテージを占めるからである。

    【0015】数学的コード化は、まるめの問題を実際に克服することのできる公知の技術である。 しかしながら、数学的コード化に必要なテーブルは、ハフマンのテーブルのように圧縮可能ではなく、またテーブルサイズの問題を克服するために数学的アルゴリズムを動的に行うことは、可能ではあるが、計算上非常に集中的である。 最終的な結果として、数学的コード化を用いて実際に達成される利得は、理論的見地から望まれるほど大きくはない。

    【0016】圧縮のための全体的に異なるアプローチが、Lempel及びZivによって開発され(Ziv, J.及びLemp
    el, A., "Compression of Individual Sequences via V
    ariable-Rate Coding", IEEE Transactions on Informa
    tion Theory, Vol. IT-24, pp. 530-536, September 19
    78を参照せよ)、Welchによって改良されている(Welc
    h, Terry A., "A Technique for High-Performance Dat
    a Compression", IEEE Computer, pp. 8-19, June 1984
    を参照せよ)。 可変長のコードを固定された大きさのバイトに割り当てる代わりに、Lempel-Zivアルゴリズム(「LZ」)は、固定長のコードを可変の大きさのストリングに割り当てる。 ファイルからの入力バイトが処理されるにつれて、ストリングのテーブルが作成され、各バイト又はバイトのストリングは、テーブル内のストリングのインデックスのみを出力することにより、圧縮される。 典型的にはこのインデックスは11〜14ビットの範囲であり、12ビットが一般的である。 なぜならこれは単純な手法に向いているからである。 テーブルは先にコード化されたバイトのみを用いて作成されるので、
    圧縮及び伸張のシステムの両方は、テーブル情報を移送するのに必要な余分なオーバーヘッド無しに、同じテーブルを維持することができる。 ハッシングアルゴリズムがマッチするストリングを効率的に捜すのに用いられる。 ファイルの初めでは、テーブルはアルファベットの各キャラクタに対して一つのストリングが初期化される。 従って、たとえそのストリングが長さ1のみを有していても、全てのバイトは少なくとも一つのストリングに見いだされるということを確実にする。

    【0017】Lempel-Zivアルゴリズムは、それ自身をデータに適合させ、ファイルの内容に根拠を置く予め設定されたテーブルを必要としないので、魅力がある。 更に、ストリングを極端に長くし得るので、最適の場合の圧縮比率は非常に高く、実際のLZ出力は、ほとんどのタイプのファイルでハフマンスキームに匹敵する。 また、それは装置にとっても非常に単純であり、この単純さが高い効率に現れている。

    【0018】しかし、幾つかの障害もまた、LZ圧縮法に存在する。 LZストリング探索は「どん欲な」アルゴリズムである。 例えば、次のストリングを考える。

    【0019】ABCDEFBCDEF ここで、A、B、C、D、E、Fは異なったバイトである。 LZストリング探索は、AB、BC、CD、DE、
    EF、BCD、DEFのストリングをストリングテーブルに付け加え、このアルゴリズムを用いて出力され得る長さ2又はそれ以上のストリングは、上で示した時点ではBC及びDEのみであることに注意しなければならない。 実際にはストリングBCDEFは既に入力に現れている。 従って、第2のBCDEFストリングは最初のB
    CDEFに戻って参照されるのが理想であるが、実際にはこれは行われない。

    【0020】LZアプローチにとって重大な欠点は、圧縮されたデータを保持するためのストリングテーブルが、長いファイルを満たしてしまう傾向にあることである。 しかし、テーブルの大きさは増大されることができ、このアプローチはストリングを表すのにより多くのビットを必要とし、従って、効率が低下するであろう。
    この欠点を扱うための一つのアプローチは、テーブルがいっぱいになったときにそのテーブルの全部又は一部を捨てることであろう。 アルゴリズムの構造のために、最新に見いだされたストリングが最初に捨てられる。 なぜなら、それらは先のストリングに戻って参照するからである。 しかし、ローカルデータに動的に適合しているのは、最新のストリングであり、それらを捨てるのもまた効率的ではない。 基本的にはLZストリングは無限の長さのメモリを有しているので、ファイル内のデータのタイプの変更は、もしストリングテーブルがいっぱいであれば、非常なコード化の効率の悪さを引き起こし得る。

    【0021】同時に1より多くの方法を用いる圧縮システムを設計することも可能である。 このシステムは、ファイル内でその方法が最も効率的になるように動的に後ろ及び前にスイッチングする。 装置の観点からは、このようなスキームは非常に高価であるかも知れないが(即ち、遅く及び/又は高価である)、結果として得られる圧縮比率を非常に高くすることができる。

    【0022】動的に前後にスイッチするこのような一つの方法は、MacCriskenの特許に開示されている。 上述のように、バイグラムハフマン法は主要な圧縮技術として使用されている。 典型的には、圧縮及び伸張システムは予め定義された(即ち、統計的に)コードテーブルのセットを用いてスタートする。 おそらく、英語、フランス語及びパスカルソースコードのためのこのようなテーブルのセットがある。 圧縮ユニット(送信機)は、使用されるテーブルの短い記述を最初に移送又は格納する。 伸張ユニット(受信機)はこのコードを分析し、適切なテーブルを選択する。 圧縮の間に、もし現在のテーブルが十分に機能しないことが決定されると、送信機は特別の(「エスケープ」)ハフマンコードを移送する。 このコードは、他の特定の予め定義されたテーブルを選択するか、又は伸張された先のデータに基づいて新たなテーブルを計算するかどうかを受信機に伝える。 送信機及び受信機の両方は、同じアルゴリズムを用いてテーブルを計算するので、テーブル全体を送る必要はないけれども計算を行うのに幾らかの時間がかかる。 ひとたび新たなテーブルが計算されると、以前と同様に圧縮が行われる。
    かなりのコンピュータのオーバーヘッドが存在するけれども、この技術が更に動的ハフマンスキームに用いられ得ないという理由は無いことに注意されなければならない。

    【0023】ハフマンのコード化に加えて、MacCrisken
    は第2のストリングに基づく圧縮方法を用いている。 送信機及び受信機の両方が、最新の移送された入力バイトの履歴バッファを保持する。 それぞれの新たな入力バイト(A)に対してバイグラムハフマンコードが生成されるが、ハッシングスキームを用いて履歴内の次の3つの入力バイト(ABC)によって表現されるストリングを見つける試みもまた行われる。 ハッシュが3バイトストリング上で行われ、ハッシュリスト内の古い入力の廃棄を可能とするために、2重にリンクされたハッシュリストが維持される。 もしストリングが見つかると、ストリングが続くことを示すために特別のハフマンエスケープコードが生成され、履歴バッファ内のストリングの長さとオフセットが送られる。 オフセットは10ビットにコードされ、長さは3〜18バイトの長さを表現する4ビットにコードされる。 しかし、このようなストリングが送られる前に、圧縮ユニットはストリング内の全てのバイトに対するハフマンコードを発生し、そのハフマンコードの大きさをストリングビットの大きさと比較する。
    典型的にはハフマンストリングエスケープコードは4ビットであり、ストリングを表すのに19ビットを要する。 2つの量の小さい方が送られる。

    【0024】MacCriskenストリング法は、Lempel-Ziv法のストリングテーブルは決していっぱいにならないという問題点を避けているということに注意しなければならない。 なぜなら、古い入力はハッシュリストから除くことによって廃棄されるからである。 従って、最新の(1
    キロバイト以内)のストリングのみがテーブルを占める。 また、原理的には全てのマッチするストリングが見いだされるので、それは「どん欲」ではない。 実際には、ストリング探索の長さの制限が課されている。 これに加えて、MacCrisken法は2つの圧縮アルゴリズムを同時に効率的に行い、従って、コンピュータのオーバーヘッドが非常に高くなるので、コンピュータで行うには非効率的である。

    【0025】データの最新処理されたバイトの「スライディングウインドウ」を維持し、マッするバイトのストリングに対するウインドウを走査するLempel-Ziv技術のうちのMacCrisken法の変形を用いるアルゴリズムが他にもいくつかある。 ストリングが見いだされると、マッチするストリングの長さ及びウインドウ内のそのオフセットが出力される。 他の場合では、「生の」バイトが出力される。 圧縮エンジンのコード化部分は、ストリングと生のバイトとの間の差異を示すタグを送り、ストリング及び生のバイト自体は多くの方法でコード化され得る。

    【0026】明らかに、データのタイプが異なると、ストリングの長さ及びオフセットの分布も異なるので、単一の固定されたコード化が全ての可能なファイルに対して最適とはなり得ない。 従って、見いだされたストリングに基づいてコード化を決定するための様々な技術が開発されている。 例えば、ハフマンコード化は、ストリングの長さ及びオフセットをコード化するために用いられることができる。 実際には、全ての長さ及びオフセットが個々のハフマンコードを与えられるわけではない。 その代わりに、長さ及びオフセットの範囲が、単一のハフマンコードによって表されることができる。 範囲内の値を区別するために特別なビットがハフマンコードの後ろに続いている。 これらの範囲、つまりビン(bin)は、
    データにおいて典型的に観察される分布を近似するように選択される。

    【0027】そのようなアプローチの利点の一つは、選択されるビンの制約内で、コード化が、圧縮されたイメージのサイズを最小化するように処理されるているデータに対して最適化され得ることである。 そのようなアプローチの1つの欠点は、コード化フォーマットを記述するタイプのテーブルがデータと共に送られなければならず、従って、可変コード化によって得られる余分な圧縮をある程度打ち消すことになる。 実際に、十分大きなデータブロックに対して、このオーバーヘッドは、コード化における利得によって補償されるよりも大きい。 他の欠点は、このタイプのアプローチは本質的に、ハードウエアであってもソフトウエアであっても、固定コード化スキームよりも実行が困難であることである。 ここでも、補償率における利得が、複雑さの増大よりも重要となることがよくある。 データの各バイトが処理される毎にコード化を動的に修正してテーブルの必要性を除去することはできるが、そのようなスキームは、さらに非常に複雑であるので、典型的には、圧縮率の対応する劇的利得を伴わずに圧縮及び伸張のスループットを劇的に低速化させる。 3番目の欠点は、多くの場合に重要ではないが、このタイプのアルゴリズムが本質的に2経路アプローチであるので、いずれかのコード化トークンが出力され得る前にストリング探索エンジンによって全てのデータが処理されることが必要であることである。

    【0028】ストリングをコード化することに加えて、
    生バイトもまたコード化され得る。 スライディングウインドウ法を用いて、各アイテム出力はストリング又は生バイトのいずれかであるので、生バイト及びストリングが共にコード化され得る。 例えば、単一ハフマンコードが、生バイト又はある長さのストリングのいずれかを表すことができる。 コード化に生バイトを含ませることは、用いられる特定のコード化を特定するテーブルのサイズをさらに大きくする傾向があるが、このテーブルサイズの増大は、得られる圧縮の利得によって典型的には克服される。

    【0029】PKZIP version 2.0及びLHA version 2.13
    は共通に、このタイプの圧縮方法を用いるMS−DOS
    コンピュータに対して利用可能な圧縮ユーティリティである。 これらのプログラムによって用いられるストリング探索技術は異なるが、得られる圧縮フォーマットは、
    スタイルが極めて似ている。 意外ではないが、非常に似た圧縮率が得られる。 各プログラムは、スライディングウインドウ及び最小のストリングの長さである3を用いており、圧縮データの一部として格納される2つのハフマンテーブルを発生させる。 第1(及び大きい方)のハフマンテーブルは生バイト及びストリング長さをコード化する。 例えば、PKZIPは、各種サイズの29レングスビンの合計を用いて、ハフマンコード0〜255に生バイトを割当て、ハフマンコード257〜285に3〜2
    58のストリング長を割当てる。

    【0030】第2のハフマンテーブルは、PKZIP及びLHA
    によって用いられて、ストリング長が特定されると、ストリングオフセットを表す。 言い換えると、(生バイトとは反対に)ストリング長に対応するハフマンコードの後ろに、ストリングオフセットを特定するために異なるハフマンコードが用いられる。 PKZIPは、1から327
    68の範囲の30個のオフセットビンに対するハフマンコードを有しているが、LHAは、1から8191の範囲の13個のオフセットビンを有している。 これらのアルゴリズムは、サイズが8Kバイト又はそれ以上のデータのブロックを圧縮する際に最も効果的であるので、ブロックサイズの一部であるテーブルオーバーヘッドは最小となる。

    【0031】これらの製品において、ハフマンのアルゴリズムによって発生されるコードの長さを与えるだけで、ハフマンコードの独特のセットを発生させて割り当てることができるという公知の事実によって、ハフマンテーブルは、それ自体が圧縮形態で格納されている。 従って、ハフマンコードの長さのみが格納される必要があるので、テーブルはコード自体よりもかなり小さくなる(さらに圧縮可能である)。 実際、ハフマン長はハフマンコード化を用いて圧縮されるので、ハフマン長を引き出すために用いられる初期の(未圧縮の)ハフマンテーブルが実際にあり、それはその後、データの圧縮及び伸張において用いられるハフマンコードを発生させるために用いられる。

    【0032】典型的には、これらのアプローチは固定コード化技術よりも10〜15%小さいサイズまでデータを圧縮することができる。 データ圧縮に関する文献及び研究の多くが、コード化技術よりもストリング探索方法に注目しているが、コード化が行われる方法に厳密に傾注することによって、大きな利得が(複雑さを犠牲にして)達成され得ることが経験的に明らかである。 しかしながら、複雑さの局面を無視しても、固定コード化は、
    テーブルが送られ得ない多くのアプリケーションに対してはやはり重要である。 例えば、多くの伝送システムにおいて、データの小さなパケット(多くの場合、100
    バイトよりも小さい)が圧縮されなくてはならない。 テーブルオーバーヘッドはこの場合重要である。 同様に、
    いくつかのアプリケーションにおいて、データは、テーブルが発生され得るように、受け取られる全ブロックを待つことなく、データが受け取られるとすぐに圧縮され移送されなくてはならない。

    【0033】可変コード化スキームを用いる圧縮比率における利得の主要な部分は、可変コード化自体から得られるものであり、生バイト及びストリングの分布に適合する。 しかしながら、利得の他の重要な成分は、可変コード化によって提供されるより大きなウインドウサイズ(例えば、8Kバイト以上)に帰することができる。 より大きなウインドウによって、より多くのストリングが見いだされることが可能となる。 なぜなら、より大きな履歴がストリング探索のために利用可能となるからである。 固定コード化スキームでは、残念なことに、オフセットのコード化サイズの増大は、より多くのストリングが見いだされるという事実を打ち消す傾向がある。 一方、可変コード化スキームでは、余分のストリングがオフセットコード化の適合性によって全体の圧縮比率を増大させる。

    【0034】

    【発明が解決しようとする課題】実施する観点から、より大きなウインドウサイズに伴う一つの問題は、全体の圧縮及び伸張エンジンが単一の集積回路上に配置されるべきである場合には特に、必要なハードウエアのコストが非常に高いことである。 同様に、ソフトウエアの実現には通常、ウインドウサイズに比例するメモリサイズが必要であり、これが多くの場合に許容され得ない。 あらゆる場合において、通常は、圧縮アルゴリズムの互換性のあるソフトウエア及びハードウエアのバージョンを有することが望ましい。 アルゴリズムによって達成され得る圧縮比率と共に、ハードウエア及びソフトウエアの両方のコスト及び速度が考慮されなくてはならない。

    【0035】

    【課題を解決するための手段】本発明のデータ圧縮方法は、入力バイトのウインドウ内のマッチングストリングに対する探索であって、生のバイトまたは一定の長さおよび該ウインドウへ戻る一定のオフセットを有するマッチングストリングのいずれかを表現するトークンからなるストリームを生成する探索を実行するステップと、該トークンを予め定義されているビンに割り当てるステップであって、該ビンのいくつかは、所定の長さおよび一定のオフセット範囲内にあるマッチングストリングを有するステップと、各ビンに割り当てられたトークンの発生頻度に基づいて、可変長コードを各ビンに割り当てるステップと、生成された各トークンに対し、各トークンが割り当てられた該ビンの該可変長コードを、出力データストリームに出力するステップと、各可変長コードが出力された後、必要であれば、該ビン内の該トークンを正確に特定するために、余分なビットを出力するステップとを包含する。

    【0036】前記方法は、前記可変長コードを割り当てる前に、入力データストリームの全てのマッチングストリング探索を完了するステップと、該入力ストリーム全体から各ビンにおけるトークン発生数をカウントするステップと、該発生カウントに基づいて前記可変長コードを割り当てるステップと、各ビンに割り当てられた該可変長コードを示すコーディングテーブルを生成するステップと、いかなる符合化されたトークンを出力する前に、該コーディングテーブルを前記出力データストリームに出力するステップとをさらに包含することもできる。

    【0037】前記可変長コードを割り当てるステップが、前記発生カウントに基づいてハフマンのアルゴリズムを用いて該可変長コードを割り当てるステップをさらに包含することもできる。

    【0038】前記コーディングテーブルを生成するステップが、前記可変長コードの長さのみを有するコーディングテーブルを生成するステップをさらに包含することもできる。

    【0039】前記方法は、ランレングス圧縮体系を用いて前記コーディングテーブルを圧縮するステップをさらに包含することもできる。

    【0040】前記方法は、ハフマンコーディングを用いて、前記コーディングテーブルを圧縮するステップと、
    該コーディングテーブル中の可変長に割り当てられたハフマンコードを特定するために使用される予備テーブルを生成するステップとをさらに包含することもできる。

    【0041】前記方法は、圧縮された出力データの末端部を示す特別なビンを割り当てるステップと、全ての他のトークンが出力された後に、該圧縮された出力データビンの該末端部のコードを出力するステップとをさらに包含することもできる。

    【0042】前記方法は、前記ビンを以下に示すように割り当てるステップ

    【0043】

    【表9】

    【0044】をさらに包含することもできる。

    【0045】前記方法は、ビン256から318のコードの後にストリングオフセットを特定する一定数の余分なビットを以下に示すように続けるステップ

    【0046】

    【表10】

    【0047】をさらに包含することもできる。

    【0048】前記方法は、ビン319から334のコードの後にストリングオフセットを特定する一定数の余分なビットを以下に示すように続けるステップ

    【0049】

    【表11】

    【0050】をさらに包含することもできる。

    【0051】前記方法は、ビン334のコードおよびオフセットビットの後にストリング長を特定する余分なビットを以下に示すように続けるステップ

    【0052】

    【表12】

    【0053】をさらに包含することもできる。

    【0054】他の局面によれば、本発明の圧縮された入力データストリームを伸張するデータ伸張方法は、全てのバイト出力の履歴アレイを維持するステップと、入力データストリームが消耗するまで、または該圧縮された入力データストリームの末端部を示すコードが見つかるまで、以下のステップを繰り返すステップと、該圧縮された入力データストリームからビンコードを抜き出すステップと、該ビンコードに関連したトークンを正確に決定するために必要とされる余分なビットを抜き出すステップと、該トークンが生のバイトに相当する時、該生のバイトを出力するステップと、該トークンがマッチングストリングに相当する時、該ストリングのオフセットを用いて該履歴アレイにインデックスバックすることにより該ストリングの全てのバイトを出力するステップとを包含する。

    【0055】前記方法は、前記圧縮された入力データストリームの開始部からコーディングテーブルを抜き出すステップと、該コーディングテーブルからカテゴリーに対する可変長コードを抜き出すステップとをさらに包含することもできる。

    【0056】他の局面によれば、本発明のデータ圧縮装置は、入力バイトのウインドウ内のマッチングストリングに対する探索であって、生のバイトまたは一定の長さおよび該ウインドウへ戻る一定のオフセットを有するマッチングストリングのいずれかを表現するトークンからなるストリームを生成する探索を実行する手段と、該トークンを予め定義されているビンに割り当てる手段であって、該ビンのいくつかは、所定の長さおよび一定のオフセット範囲内にあるマッチングストリングを有する手段と、各ビンに割り当てられたトークンの発生頻度に基づいて、可変長コードを各ビンに割り当てる手段と、生成された各トークンに対し、各トークンが割り当てられた該ビンの該可変長コードを、出力データストリームに出力する手段と、各可変長コードが出力された後、必要であれば、該ビン内の該トークンを正確に特定するために、余分なビットを出力する手段とを備えている。

    【0057】前記装置は、前記可変長コードを割り当てる前に、入力データストリームの全てのマッチングストリング探索を完了する手段と、該入力ストリーム全体から各ビンにおけるトークン発生数をカウントする手段と、該発生カウントに基づいて前記可変長コードを割り当てる手段と、各ビンに割り当てられた該可変長コードを示すコーディングテーブルを生成する手段と、いかなる符合化されたトークンを出力する前に、該コーディングテーブルを前記出力データストリームに出力する手段とをさらに備えることもできる。

    【0058】前記可変長コードを割り当てる手段が、前記発生カウントに基づいてハフマンのアルゴリズムを用いて該可変長コードを割り当てる手段をさらに備えることもできる。

    【0059】前記コーディングテーブルを生成する手段が、前記可変長コードの長さのみを有するコーディングテーブルを生成する手段をさらに備えることもできる。

    【0060】前記装置は、ランレングス圧縮体系を用いて前記コーディングテーブルを圧縮する手段をさらに備えることもできる。

    【0061】前記装置は、ハフマンコーディングを用いて、前記コーディングテーブルを圧縮する手段と、該コーディングテーブル中の可変長に割り当てられたハフマンコードを特定するために使用される予備テーブルを生成する手段とをさらに備えることもできる。

    【0062】前記装置は、圧縮された出力データの末端部を示す特別なビンを割り当てる手段と、全ての他のトークンが出力された後に、該圧縮された出力データビンの該末端部のコードを出力する手段をさらに備えることもできる。

    【0063】前記装置は、前記ビンを以下に示すように割り当てる手段

    【0064】

    【表13】

    【0065】をさらに備えることもできる。

    【0066】前記装置は、ビン256から318のコードの後にストリングオフセットを特定する一定数の余分なビットを以下に示すように続ける手段

    【0067】

    【表14】

    【0068】をさらに備えることもできる。

    【0069】前記装置は、ビン319から334のコードの後にストリングオフセットを特定する一定数の余分なビットを以下に示すように続ける手段

    【0070】

    【表15】

    【0071】をさらに備えることもできる。

    【0072】前記装置は、ビン334のコードおよびオフセットビットの後にストリング長を特定する余分なビットを以下のように続ける手段

    【0073】

    【表16】

    【0074】をさらに備えることもできる。

    【0075】他の局面によれば、本発明の圧縮された入力データストリームを伸張するデータ伸張装置は、全てのバイト出力の履歴アレイを維持する手段と、該圧縮された入力データストリームからビンコードを抜き出す手段と、該ビンコードに関連したトークンを正確に決定するために必要とされる余分なビットを抜き出す手段と、
    生のバイトを出力する手段と、マッチングストリングの全てのバイトを、該ストリングのオフセットを用いて該履歴アレイにインデックスバックすることにより出力する手段とを備えている。

    【0076】前記装置は、前記圧縮された入力データストリームの開始部からコーディングテーブルを抜き出す手段と、該コーディングテーブルから該カテゴリーに対する可変長コードを抜き出す手段とをさらに備えることもできる。

    【0077】

    【作用】本発明は、磁気ディスク又はテープ記憶装置のようなデジタル記憶装置の容量を増大させる、圧縮/伸張システムである。 圧縮方法は完全に適合性があり、予め初期化されたコード化テーブルを必要とせずに、コンピュータファイルのようなバイトに適応したキャラクタストリームを最適化する。 それは従来技術に見られる多くの困難を克服し、上述で議論した先行する技術の何れよりも、より少ないメモリ要件で、より速くより高い圧縮率を達成する。

    【0078】圧縮は、まず、以前のマッチするストリング又はバイトに対して、入力データストリーム全体に探索を行うことによって達成される。 ストリング探索は、
    以前に処理されたバイトの履歴アレイを維持することによって達成される。 マッチするストリングが見いだされると、マッチするストリングの長さ及び履歴アレイ内でのマッチするストリングのオフセット(相対的位置)を示す出力トークンが発生される。 現在調べられているバイトを含むマッチするストリングが見いだされない場合には、「生の」バイトであることを示す出力トークンが発生される。

    【0079】圧縮プロセスは、マッチするストリング及びストリング探索によって発生される生のバイトを表すトークンのハフマンに基づくコード化を用いることによって完結する。 単一のハフマンコード化ツリーが、生のバイト及び多くの最も共通するストリング長/オフセットの対に対して用いられる。 ハフマンテーブル自体は、
    データの圧縮イメージの一部として圧縮形態で格納される。

    【0080】本発明の好ましい実施例は、圧縮ユニットから出力されるコード化データストリームを伸張するための方法も包含している。 伸張するための方法は、以下のステップを包含している。 第1に、コード化されたハフマン長テーブルが受け取られてデコードされる。 各ハフマンビンに対するコードの長さが分かると、ハフマンコードが各トークンビンに割り当てられる。 トークンビンに対してハフマンコードが与えられると、ハフマンツリーがトークンをデコードするために構築され、それが圧縮入力データストリームから引き出される。 ハフマンビンが生のバイトに対応する場合には、伸張ユニットが生のバイトを出力する。 ハフマンビンがストリングに対応する場合には、ストリングオフセット及び長さを特定するために必要な全ての余分なビットが、入力データストリームから引き出される。 その後、ストリングが、同時に1バイト出力される。 好ましい実施例において、たいていのスライディングウインドウ伸張スキームと同様に、これは、最新のバイト出力の履歴アレイを維持し、
    オフセットによって履歴アレイにインデックスし直すことによって行われ、1バイトが引き出される。 生バイト又はストリングバイトのいずれか全てのバイト出力が履歴アレイに加えられる。

    【0081】

    【実施例】図1(a)及び図1(b)において、本発明による圧縮ユニット4及び伸張ユニット6のブロック図が示される。 ユニット4及び6の両方は、ハードウエアモジュールであっても、ソフトウエアモジュールであってもよい。 しかし、好ましい実施例においては、圧縮ユニット4及び伸張ユニット6は1個の集積回路に組み入れられる(図10)。 この集積回路は、マイクロプロセッサ5によって制御されるデータ記憶システム又はデータ伝送システムの一部として用いられる。 図1(a)において、入力データストリーム8は、ホスト10と称されるデータ送信装置から圧縮ユニット4に入力される。
    コード化され、圧縮されたデータストリーム12は装置14と称されるデータ受信装置へ伝送される。

    【0082】同様に、図1(b)に於いて、伸張ユニット6は、装置14(ここではデータ送信装置)から圧縮されたデータストリーム18を受け取り、元の圧縮されていないデータストリーム20を再構成し、そのデータストリームをホスト10(ここではデータ受信装置)へ出力する。 好ましい実施例において、伸張及び圧縮は同時には行われない。 しかし、他の実施例に於いては伸張及び圧縮は同時に行われ得る。

    【0083】図2では、本発明によって動作するように構成された圧縮ユニット4のブロック図が示されている。 入力データ22は、圧縮されるべき入力データストリームである。 入力データ22は、MEMSIZEバイトのウインドウサイズを用いて、ブロック24に示されるように、スライディングウインドウストリング探索アルゴリズムを用いて処理される。 多くの異なるストリング探索アルゴリズムがブロック24において用いられ得る。 スライディングウインドウアルゴリズムの出力は一連のトークン26である。

    【0084】トークン26のそれぞれは、生バイト又は与えられた長さ及びオフセットを有するマッチするストリングである。 すでに処理された以前のMEMSIZE
    バイトにおいてマッチするストリングが見いだされない場合に、生バイトトークンが生成される。 ストリングトークンは、見いだされたストリングマッチの長さ及びスライディングウインドウからのそのオフセットを示す。
    長さ及びオフセットは、伸張ユニット6が元のデータを再構成し得るには十分である。

    【0085】出力トークンは、ハフマンコードがトークンビンのそれぞれに割り当てられるまで中間バッファ2
    8に一時的に格納される。 この割当ては、入力データ2
    2の全てがマッチするストリングを捜すために探索され、全てのトークンが生成されるまで起こらない。 トークンが生成されて格納されると、それらは、異なるビン又はカテゴリに割り当てられる。 ビンは、生バイト、各種ストリング長さ/オフセット対及び幾つかの個々のストリング長から成る。

    【0086】トークンはまた、入力データ22から生成される全てのトークンに対して1ビン当たりのトークンの数をカウントするビンカウンタ30へ入力される。 各ビンに対するカウントは、初期的にはゼロに設定され、
    ビンに対応するトークンが生成される毎に1ずつインクリメントされる。 他の実施例において、ビンカウントは、中間バッファにおけるトークンを再処理することによってスライディングウインドウ探索が完了した後にのみ計算されて、カウントを累積する。 他の実施例において、中間トークンは、バイト配列された固定コード化を用いて(ビット配列フォーマットではなく)格納される。 バイト配列された固定コード化には、より大きな格納空間が必要ではあるが、より効率的に処理され得る。

    【0087】全ての入力データがスライディングウインドウ探索24によって処理され、全ての出力トークンが一時的に格納されてビンカウントが計算されると、ハフマンのアルゴリズムが用いられて、ハフマンコード32
    が各種ビンに割り当てられる。 ハフマンコード32は、
    ビンカウンタ30によって維持されるビンカウントから生成される。 各ビンに対するハフマンの確率は、ビンカウントに比例するので、一般に、大きなカウントを有するビンほど短いコードを割り当てられ、小さなカウントを有するビンほど長いコードを割り当てられる。

    【0088】単一のハフマンツリーを用いることによって、データと共に格納されるテーブルのサイズが小さくなる。 より重要なことに、ストリング長さ/オフセット対を単一ハフマンコードに組み合わせることは、所定の長さ及びオフセットのビンからのストリングが、例えばオフセットとは独立した所定の長さのストリングよりもかなり確率が低くなることを意味している。 従って、ハフマンコード化に付随するまるめの問題が最小化され、
    高圧縮比率が小さなウインドウサイズでも達成され得る。 小さなウインドウサイズは、ハードウエア及びソフトウエア実現において、より許容可能なコストとなる。

    【0089】好ましい実施例において、ハフマンのアルゴリズムは、各ハフマンコードの長さを生成させるためにのみ用いられており、ビットコードそのものを生成させるためには用いられていない。 各ビンに対してハフマンコードの長さを与えると、実際のコードは、以下に説明されるように、図15において示されるアルゴリズムを用いて一意的に生成される。 ハフマンコードの長さのみが圧縮データと共に格納され、伸縮ユニット6は図1
    5の同様のアルゴリズムを用いてコードを割り当てる。
    従って、圧縮及び伸縮の一致が保証される。

    【0090】中間バッファ28からのトークン及びハフマンコード32がいずれもハフマンエンコーダ34へ入力される。 ハフマンエンコーダ34は、圧縮された出力データ36の第1の部分として、各ビン対するハフマンコードレングスを出力する。 そのレングスは、ハフマンビン0から始まり、最後のハフマンビンまで出力される。 好ましい実施例では1〜15ビットの範囲であるコードレングス自体は、空間を節約するために圧縮フォーマットで出力される。 レングスフィールドにおいてゼロであるということは、所定のビンが起こらないことを意味している。 好ましい実施例において、単一のランレングス圧縮フォーマットは、4ビットによって表される各レングスを用いて、このレングステーブルをコード化するために用いられる。 他の実施例において、そのレングス自身も、可変ハフマンコードを用いてコード化されることができ、ハフマン長のためのコード化を特定するためにデータの始めにさらに他のテーブルが置かれている。 このテーブルは、圧縮されずに含まれている。 なぜなら、繰り返される連続レングス(つまり、ラン)がハフマンコードとしてどのように含まれているか(或いは含まれているかどうか)に応じて、32個よりも少ないコードが典型的には含まれるからである。

    【0091】割り当てられ出力されたハフマンコードと共に、その後、ハフマンエンコーダは、中間バッファ2
    8内のトークンを処理して、各トークンに対するハフマンコードを圧縮された出力データストリーム36へ出力する。 たいていのストリングトークンは、ハフマンコードの後に添付される余分なビットを必要とする。 先ず、
    ストリングオフセットを特定するために必要な余分のビットが出力される。 好ましい実施例において、長さ6以上のストリング(ハフマンビン319〜334)の後ろには、図13に示されるように、ストリングオフセットコード化が後続している。 レングス3、4及び5(ハフマンビン256〜318)のストリングに対するコードの後ろには、図14に示されるように、特定された余分のオフセットビットの数が後続している。 次に、ストリング長を十分に特定するために必要な余分のビットが出力される。 好ましい実施例において、図14に示されるように、ハフマンビン334のみが余分なレングスビットを必要としている。 他の実施例において、中間バッファに出力トークンを格納する代わりに、元の入力データが、スライディングウインドウ探索アルゴリズムによって再び処理され、最初のスライディングウインドウ探索後に生成されるハフマンコードに基づいて、トークンストリームが、2回目の生成されるようにコード化される。

    【0092】圧縮ユニット4の出力はビットストリームである。 好ましい実施例において、ビットは、16ビットワードで出力され、第1のビットがワードの最上位ビットであり、連続ビットがワードの最下位ビットまで満たしている。 ワードが満たされると、最下位バイトが最初に出力され、再びワードの最上位ビットから始まる最初のワードが蓄積される。 全てのトークンがコード化されて出力されると、特別のハフマンコード(好ましい実施例においては335)が圧縮データの終了を示すために出力され、パッドビットが出力ワードの残りを埋めるために出力される。 最終コードは伸張ユニット6を停止するために用いられる。 他の実施例においては、ビットが8ビットバイトで出力されることも可能であり、或いは、ビットが最下位ビットを先頭として蓄積されることもでき、或いは、ワードが最上位バイトを先頭として出力されることもできる。

    【0093】図3は、スライディングウインドウ探索ブロック24によるトークン生成の一例を含む単純な結果のテーブルを示している。 テーブルは、2つの列に分けられており、第1列50は、入力データストリームを示しており、第2列52は、トークン及び生データの出力ストリームを示している。 トークンを生成させるために必要な最小マッチストリング長は好ましい実施例においては3である。 なぜなら、それが、経験的に最良の結果を与えるようであるからである。

    【0094】第2列52は、行60〜70によって参照される。 第1の入力バイトはキャラクタ「A」であり、
    これは以前には現れなかったもので、生のバイト「A」
    に対応する出力トークンを有している(行60)。 次の入力バイトはキャラクタ「B」であり、これは同様に以前には現れなかったもので(スライディングウインドウ履歴は「A」のみを有している)、従って、生のバイト「B」に対応する出力トークンを有している(行6
    2)。 次の入力バイトはキャラクタ「A」である。 好ましい実施例において、3又はそれ以上を有するストリングのみがマッチするストリングとしてコード化されるので、キャラクタ「A」は、生のバイト「A」として出力される(行64)。 しかしながら、次の「A」キャラクタが起こると、全ての「A」キャラクタが処理された後に、オフセット1でレングス5を有するマッチするストリングが見いだされる。 従って、対応するトークン(行66)が生成される。 次の入力バイトは「C」であり、
    これは以前には現れなかったもので、従って、生のバイト「C」に対応する出力トークンを有している(行6
    8)。 次の3つのバイト「ABA」は、入力データストリームの先頭のストリングにマッチしている。 従って、
    オフセット9でのレングス3のストリングのマッチを示すマッチするストリングのためのトークンが出力される(行70)。

    【0095】全てのデータ構造(例えば、履歴アレイ1
    02、ハッシュテーブル100、及びオフセットアレイ104(図4))は、RAM16内に維持され、RAM
    16は1つ又は多数のRAMユニットを有していることができる。 好ましい実施例において行われる好ましいデータ構造のより詳細な説明は、それらを構築し維持する圧縮ユニット4の説明の間に、以下に説明される。

    【0096】以下に論じられる全ての数値パラメータの値(例えば、MEMSIZE、16ビットHPTRサイズ等)が、本発明の圧縮伸張技術の背後にある基本概念に影響を与えることなく修正され得ることを、当業者は認識するであろう。

    【0097】上記実施例において、バイトがマッチしなかった場合には、スライディングウインドウ探索24
    が、入力バイトストリームの履歴アレイを遡って現在の入力バイトまでマッチし、現在の入力バイトを含むストリングを探索する。 そのような新たなストリングが見いだされた場合には、マッチの長さがインクリメントされ、新たなマッチストリングの位置が定められて記憶される。 このように、このストリングマッチが「拡張」されている。 そのような新たなストリングが見いだされない場合には、或いは、非常に多くの以前の入力バイトエントリーが探索されなくてはならない場合には、現在のマッチするストリングが最大のストリングであると見なされ、そのコード化トークンが出力される。 コード化されたトークンは、その長さ及び入力バイトストリームを格納する履歴内の相対位置を含んでいる。 オフセットは、バッファ内のストリングの開始位置からマッチしたバイトまでのバイト数として算出される。 このバイト数は、好ましい実施例においては1からメモリサイズ(M
    EMSIZE−1)の範囲である。

    【0098】ハッシング技術は、好ましい実施例においては、効率的なストリング探索を行うために用いられる。 入力バイトストリームに対するストリング探索操作を行うために多くの実現方法があることを当業者は認識するであろう。 特に、マッチするストリングを見いだすために用いられ得る多くのハッシング技術及び探索方法がある。 各種のハッシング技術についての完全な背景に関しては、KnuthのSorting and Searching, The Art of
    Computer Programming (Vol. 3) pp. 506-549 (1973)
    を参照されたい。 この文献は参考として本明細書に援用されている。 以下は、好ましい実施例によって用いられる特定のハッシング構造の詳細な説明である。 説明されるデータ構造及びアプローチが選択された理由は、それらが、ストリング探索機能のために必要なRAMサイクルの数を最小とし、システムのスループットを最大とするからである。

    【0099】図4を参照して、ハッシュ構造の好ましい実施例が説明される。 すでに処理された(圧縮された、
    又は生データとして圧縮されなかった)入力データの最後のMEMSIZE(好ましくは2048)のキャラクタを包含する履歴アレイ102がRAM16に格納されている(図1(a))。 新たな入力データがスライディングウインドウ探索24によって受け取られると、本発明は、先ず、新たな入力データ中の少なくとも2バイトの「ストリング」が履歴アレイ102中のストリングとマッチするかどうかをチェックする。 マッチすれば、少なくとも3バイト長のマッチするストリングを見いだすように探索が拡張される。 少なくとも3バイト長のマッチするストリングが見いだされると、マッチするストリングを表すトークンが出力される。 少なくとも3バイト長のマッチするストリングが見いだされない場合には、
    現在処理されているバイトを表す生データトークンが出力される。

    【0100】ハッシュテーブル100は、履歴アレイ1
    02中の特定のストリングを素早く見いだすために用いられる。 ハッシュテーブル100は、履歴アレイ102
    への履歴アレイポインタを含む一連のエントリで構成されている。 オフセットアレイ104と称されている他のデータ構造はハッシュリンクテーブルである。 オフセットアレイ104中の各リンクリストの第1の要素は、特定のハッシュ値に対応する履歴アレイ中の前のエントリを指し示している。 リンクリスト中の最後の要素(この要素は無効なポインタであってもよい)はこのハッシュ値に関連付けられた最も古いエントリを指し示している。 スライディングウインドウ探索24は、各入力バイトが処理された後にインクリメントされる16ビットの履歴ポインタHPTR108を維持している。 HPTR
    108は0に初期化される。 好ましい実施例において、
    圧縮操作は、64Kサイズよりも大きなブロックに関しては行われない。 従って、HPTR108は、64Kバイトがスライディングウインドウ探索24によって処理された後に、0へ戻るように「ラップ」する必要はない。 HPTR108がラップしないので、HPTR10
    8の「ラッピング」によって無効となったハッシュテーブルからの古いエントリを取り除く必要がない。 オフセットアレイ104は実際には単純リンクリストから構成された2次ハッシュである。 ある特定のオフセットがM
    EMSIZE−MAXSTR(ここでMAXSTRは探索されている最大のストリングである)よりも大きいか、又はリストの最近のエントリからの全てのリンクの合計がMEMSIZE−MAXSTRよりも大きい場合には、特定のハッシュビン(値)中に有効なエントリはもはや存在しない。 このようにして、MEMSIZE−
    MAXSTRよりも古いエントリは履歴アレイ102の終わりから効果的に「離れ落ちる(fall off)」。 本発明のこの点により、オフセットアレイ104中の単純リンクリストの使用を可能にする。 単純リンクリストの維持は、二重リンクリストに比べて半分以下のメモリアクセスによって行うことができる。

    【0101】図5〜図7及び図8を参照して、本発明のスライディングウインドウ探索の詳細な流れ図が論じられる。 流れ図(図5〜図7及び図8)の特定のデータ経路を示すハード的に配線された版を図9に示す。

    【0102】より詳細には、図5〜図7において、スライディングウインドウ探索ルーチンがブロック109でスタートする。 次に、ブロック110では、初期化ルーチン(図8)が呼び出され、図4に示すハッシュ構造が初期化される。 この操作は、新たなウインドウ探索操作のそれぞれの開始時に行われる。

    【0103】図8において、ブロック112では、ハッシュポインタ108(HPTR)が0に設定される。 ブロック114(図8)では、現在コード化されているビットストリングの現在の長さを追跡するためのマッチ長変数(「MATCHLEN」)が0に設定される。 次に、ブロック120の間に、ハッシュテーブル100が値HPTR−MEMSIZEで埋められる。 このステップにより、ハッシュテーブル100の以前の有効な全ての値が効果的に空にされる。

    【0104】図5〜図7を再び参照すると、初期化ルーチン(図8)の終了後、入力されるデータストリームからのバイトを受け入れるためにスライディングウインドウ探索が始まり得る。 ブロック128の間に、操作を初期化するために、履歴アレイ102の最初の2つのバイトが入力データで埋められる。 この2バイトは、レジスタINREG0及びINREG1に保持される。 新たな1バイトが処理される度に、第1バイト及び次の入力バイトのハッシュ(「H」)が計算される。 好ましい実施例において、INREG0を左に4ビットシフトたものとINREG1との排他的論理和を求めることによってハッシュが計算される。 上述のように、Knuth(以前に参照した)によって論じられるいずれのハッシュ関数も適用可能である。 新たな1個の入力バイトが処理される度に、INREG1の内容がINREG0へ移され、I
    NREG1には新たなバイト値がロードされる。

    【0105】ブロック128で処理される各バイトに対して、ハッシュ値H(「H」)が計算され、新たなハッシュ値に対応するハッシュリスト内の古いエントリが読み出されてNEXTと称される変数に格納される。 また、ブロック128では、現在のハッシュ値に対応するハッシュテーブル中の古いエントリがHPTRの現在の値で置換される。 ブロック140では、HPTR−NE
    XT>=MEMSIZE−MAXSTRであるかどうかが判定される。 変数MAXSTRは、履歴アレイ102
    中で見いだされるバイトのマッチするストリングが現在処理されているバイトによって上書きされないことを保証する、探索されている最大ストリングサイズの値である。 MEMSIZE−MAXSTRよりも大きいか又は等しい値にであると判定されると、処理はブロック14
    2へ進み、変数NEXTはHPTR−MEMSIZEに等しく設定される。 言い換えると、履歴の最後のMEM
    SIZEバイト中にマッチするストリングがなかったため、ハッシュビンが空にされる。

    【0106】MEMSIZE−MAXSTRよりも大きいか又は等しい値となるかどうかの判定に拘らず、処理はブロック144へ進む。 ブロック144では、値HP
    TR−NEXTが対応するオフセットアレイ104のエントリであるOFFSET(HPTR)に書き込まれる。 同様に、ブロック144では、INREG1の値が履歴アレイ102のエントリであるHISTORY(H
    PTR)に置かれる。 上記ブロック128、140、1
    42及び144で行われるステップにより、現在処理されているバイトに必要なデータ構造の保守は完了し、この時点で、履歴アレイ102の内容のストリング探索が開始され得る。 スライディングウインドウ探索がストリングマッチを現在処理しているかどうかに拘らず、処理される全ての入力バイトに対して上記ハウスキーピング機能が行われることに注意されたい。 他の実施例において、ハウスキーピング機能の幾つかは、圧縮比率でのわずかなコストでの操作のスループットを増大させるために、処理される入力バイトの幾つかに対してのみ行われる。

    【0107】ブロック146では、マッチ長変数MAT
    CHLENが0に等しいかどうかが判定される。 ブロック114の初期化ルーチン(図8)ではMATCHLE
    N変数が0に設定されたことを想起されたい。 MATC
    HLENは、現在のストリングマッチ長を包含しており、操作の開始時には0である。 ここで、圧縮操作の開始時での処理を行っており、MATCHLENが0である場合には、内部ハッシュカウンタHASHCNTが0
    に設定される。 HASHCNTは、いずれかの特定のストリング探索の反復を制限するために用いられる。 次に、ブロック150では、HPTR−NEXT>=ME
    MSIZE−MAXSTRであるかどうかが判定される。 得られる値がMEMSIZE−MAXSTRよりも小さいと判定されると、処理はブロック152へ進む。
    ブロック152の間に、変数INREG1が履歴アレイのHISTORY(NEXT)の値に等しいかどうかが判定される。 このステップの目的は、履歴アレイ中の先行するエントリに対して、INREG0及びINREG
    1における2バイトにマッチする2バイトストリングを探索することである。 INREG1における値のみがH
    ISTORY(NEXT)の値と比較される。 なぜなら、ハッシュ機能が、INREG0に対して1対1の写影が行われるように選択されるので、ハッシュリスト中の各ストリングからの1バイトのみがINREG1と比較される必要があるからである。 このステップは、本実施例の性能を高める。 なぜなら、2バイト比較に代えて1バイトの比較を行うだけでよいからである。 ブロック150においてMEMSIZE−MAXSTRよりも大きい又は等しいと判定された場合には、処理はブロック158へ進む。 ブロック158では、INREG0バイトを示す生のデータバイトトークンが出力され、処理がブロック125へ進む。 ブロック125では、次の入力バイトが得られ、処理全体が再び開始される。

    【0108】ブロック152においてマッチしていると判定された場合には、処理はブロック160へ進み、変数MATCHPTRが変数NEXTの値に等しく設定される。 加えて、変数MATCHLENが2バイトマッチを示すように2に設定され、長さ2よりも大きなマッチするストリングが結局ない場合には、INREG0の内容が変数OLDRAWに格納される。 処理は、ブロック125へ進み、そこで、次の入力バイトが得られる。 しかしながら、HISTORY(NEXT)での値がマッチしない場合には、処理はブロック154へ進み、HA
    SHCNTの値がインクリメントされ、変数NEXTがNEXT−OFFSET(NEXT)に等しく設定される。 このステップにより、オフセットアレイ104によってリンクされている次のエントリが効果的に指し示される。 処理はブロック156へ進み、HASHCNTが所定の最大カウント値MAXHCNT(典型的には8)
    に達しているかどうかが判定される。 HASHCNTがMAXHCNTよりも大きい又は等しい場合には、処理はブロック158へ進み、INREG0に対する出力生バイトトークンが出力され、処理はブロック125へ進む。 しかしながら、HASHCNTがMAXHCNTよりも大きくなく又は等しくもない場合には、HASHC
    NTがMAXHCNT(つまり、好ましい実施例では8)に達するまで、又はハッシュリスト中にそれ以上有効なエントリが存在しなくなるまで(ブロック150で判定される)、又はマッチするストリングが見いだされるまで(ブロック152)、ブロック150、152、
    154及び156の処理を継続する。

    【0109】最終的に、処理はブロック125へ進み、
    この時点で、スライディングウイントウ探索は、次の入力データバイトを処理する準備ができている。 ブロック125では、HPTRがインクリメントされる。 MAT
    CHLENがブロック146で0よりも大きいと判定されるまで、ブロック128、140、142、144、
    146、148、150、152、154、156、1
    58、160及び125の処理が継続される。 ブロック146では、MATCHLENが0に等しくない場合には、処理がブロック162へ進むことに注意されたい。
    ブロック162では、変数MATCHPTRが1だけインクリメントされる。 このように、新たな値INREG
    1は、履歴アレイ102中のMATCHPTRにおいて見いだされるMATCHLEN+1の長さのストリームにおける次のバイトと比較される。 ブロック164では、バイトがマッチしているかどうかの判定がなされる。 バイトがマッチする場合には、ブロック180でM
    ATCHLENがインクリメントされてストリングが拡張され、処理はブロック125へ進む。 しかしながら、
    バイトがマッチしない場合には、処理はブロック166
    へ進み、変数NEXTがMATCHPTR−MATCH
    LEN+1に等しく設定される。 処理は、ブロック16
    8へ進み、変数NEXTがNEXT−OFFSET(N
    EXT)に等しく設定される。 加えて、ブロック168
    では、変数HASHCNTがインクリメントされる。 ステップ166及び168は、ハッシュリストの残りの連続するストリングエントリにおいた、マッチがとれる元のストリングを探索するスライディングウインドウ探索を効果的に引き起こす。 ブロック170では、HPTR
    −NEXT>=MEMSIZE−MAXSTRであるかどうかが判定される。 MEMSIZE−MAXSTRよりも大きいと判定された場合には、有効なエントリはそれ以上存在せず、処理はブロック124へ進む。 ブロック124では、MATCHLENが2よりも大きいかどうかが判定される。 大きくないと判定されると、処理はブロック126へ進み、変数OLDRAWにおける生データバイトを表す出力トークンが出力される。 その後、
    NEXTはINREG1及びINREG0の最新のハッシュ値に対応して、ハッシュリストで置換される。 その後、MTACHLENが0にリセットされ、処理はブロック148から再開される。

    【0110】ブロック124でMATCHLENが2よりも大きいと判定された場合には、処理はブロック18
    2へ進み、スライディングウインドウ探索24が、マッチするストリングの長さ(MATCHLEN)及び履歴アレイ102内でのそのオフセット(OFFSET=H
    PTR−MATCHPTR)を表すトークンを出力する。 処理はブロック184へ進み、MATCHLENが0に設定され、処理は、新たなバイトに対してブロック125を開始する。

    【0111】しかしながら、ブロック170においてM
    EMSIZE−MAXSTRよりも小さいと判定された場合には、処理はブロック172へ進み、MATCHL
    EN>=MAXSTRであるかどうかが判定される。 M
    ATCHLEN>=MAXSTRである場合には、探索は限界に達し、処理はブロック124へ続く。 しかしながら、MATCHLENがMAXSTRよりも大きくなく、等しくもないと判定される場合には、処理はブロック174へ進む。

    【0112】ブロック174では、位置HISTORY
    (NEXT)におけるMATCHLEN+1の現在のストリングが内部マッチバッファの内容に等しいかどうかが判定される。 内部マッチバッファは、現在のマッチしているストリングのMATCHLEN個の全てのバイトを包含している。 このバッファによって、このストリングをマッチさせる最初の試みが失敗しても、新たなストリングの探索が高速化される。 マッチが行われる度にマッチをとろうとするバイトを得るためにRAMにアクセスする必要はなく、マッチをとろうとするバイトがチップ内で即座に利用可能であるので効率的である。 言い換えると、マッチバッファは、処理を効率的に向上するためのルックアサイド(look aside)バッファとして機能する。 マッチバッファの長さは有限である(好ましい実施例においてMAXSTR=8バイト)。

    【0113】HISTORY(NEXT)におけるMA
    TCHLEN+1のストリングがマッチバッファの内容に等しい場合には、処理はブロック178へ進み、変数MATCHPTRがNEXT+MATCHLENに等しく設定される。 処理はブロック180へ進み、そこで、
    MATCHLENがインクリメントされ、処理はブロク125へ進む。 ブロック125では、入力データストリームにおける次の新たなバイトが処理される。 しかしながら、HISTORY(NEXT)におけるストリングがマッチバッファに等しくない場合には、処理がブロック176へ進み、変数HASHCNTがMAXHCNT
    よりも大きい又は等しいかどうかに関する判定がなされる。 HASHCNTがMAXHCNTよりも大きい又は等しい場合には、処理はブロック182及び184へ進み、履歴アレイにおけるマッチの長さ及びオフセットを含むマッチストリングトークンが出力され、変数MAT
    CHLENが0に設定される。 処理は、ブロック125
    へ進み、次の新たな入力データバイトが処理される。 しかしながら、ブロック176においてHASHCNTがMAXHCNTよりも大きくなく又は等しくもない場合には、処理は、MATCHLEN+1の長さのマッチが見いだされるまで、又はHASHCNTがMAXHCN
    Tに達するまで、又は有効なハッシュエントリがそれ以上存在しなくなるまで(HPTR−NEXT>=MEM
    SIZE−MAXSTR)、ブロック168、170、
    172、174及び176の処理を継続する。

    【0114】好ましい実施例において、上記操作は、R
    AM16(図1(a))が全てのクロックサイクルでも使用中であることを保証するために、パイプライン化される。 なぜなら、RAMサイクルカウントが性能を制限する要因であるからである。

    【0115】典型的には、記憶システムにおいて、データは、一定サイズのセクタ又はブロックへ分割されなくてはならず、所定段階で圧縮が切り捨てられ、次に、残りの入力ストリームに関する新たな処理が再スタートする。 圧縮ユニット4はその後、後述される特別な「圧縮データの終わり」トークンを出力する。

    【0116】本発明がなされる過程において、圧縮方法の広範なソフトウエアシミュレーションが行われた。 M
    AXHCNT、HASHSIZE、マッチバッファサイズ及びMEMSIZEを含む全てのパラメータの値が変化させられて、スループット及び圧縮比に対するそれらのパラメータの影響が調べられた。 好ましい実施例の特定の形式及びパラメータの組は、これらの性能上の論点に対して受け入れ可能なトレードオフが得られるように選択された。 しかし、多くの類似のパラメータの組及びコード化は実質的に同様の性能に帰着する。

    【0117】図9に、好適な実施態様におけるスライディングウインドウ探索24(図2)および出力トークンの生成を含む回路図228を示す。 回路228の要素はデジタル論理によって実現される。 回路228は、圧縮コントローラ兼シーケンスユニット230によって制御される。 圧縮コントローラ兼シーケンスユニット230
    は、回路228の要素のそれぞれに一連の制御ライン(図示せず)によってリンクされている。 好適な実施態様では、毎秒数メガヘルツで作動する内部クロック(図示せず)は、作動中の各クロックサイクルにおいて1個以上の要素に働きかけるコントローラ兼シーケンスユニット230の活性化レベルを定める。 実際の作動およびそれらのシーケンスは、すでに論じた図5〜図7および図8に示されている。

    【0118】回路228におけるデータフローのより詳細な説明を行う。 入力バイトストリームの圧縮されていないバイトは、圧縮ユニット4に入力され、ライン24
    4を介して入力FIFO232に与えられる。 入力FI
    FO232に格納されたバイトは、2個の拡張FIFO
    レジスタINREG1(233)およびINREG0
    (235)に転送される。 より詳細には、FIFO23
    2からのデータはライン246を介してINREG1レジスタ233に与えられる。 INREG1レジスタ23
    3に格納されたデータは、次にライン248および25
    0を介してINREG0レジスタ235に転送される。
    INREG1およびINREG0レジスタの目的はハッシュ関数237への入力を発生することにあることを想起されたい。 ハッシュ関数237の出力はライン255
    を介してマルチプレクサ256へ伝送される。

    【0119】INREG1レジスタ233において、マッチングストリングが見い出せない場合には、それはライン248、254、および258を介して出力管理部260へ送られる。 出力管理部260の目的は、生のデータバイトおよびマッチングストリングの出力トークンを生成することにある。 出力管理部260の出力は、ライン262を介してビットバイト変換器264へ伝送される。 次にこのデータはライン268を介して出力FI
    FO234に入力される。 出力トークンは、出力FIF
    O234からライン270を介して中間バッファ(図2
    の28)へ出力される。

    【0120】INREG1レジスタ233の内容はまた、ライン248、254、および272を介して内部マッチバッファ274へ送られる。 内部マッチバッファ274の目的は、マッチングプロセスの能力を効果的に向上させるための「ルックアサイド(lookaside)」バッファとして機能することにある。 マッチバッファ27
    4の内容はバイト比較レジスタ276の内容と比較される。 マッチバッファの内容は、ライン278上に多重化されてバイト比較レジスタ276へ送られる。 バイト比較レジスタ276の内容は外部のRAM238内に格納されている履歴アレイ102(図4)から得られる。 履歴アレイのエントリの内容は、ライン280を介してラッチ282に入力され、次に、ライン284および28
    6を介してバイト比較レジスタ276へ送られる。 ブロック276によって実行されるバイト比較の結果は、ライン288を介して圧縮コントローラ兼シーケンスユニット230に伝達される。 圧縮コントローラ兼シーケンスユニット230は比較結果を評価し、制御ライン(図示せず)を介して回路228の様々な要素に適切な制御信号を送り出す。

    【0121】INREG0レジスタ235の内容はまた、ライン251および290を介してマルチプレクサ292へ送られ得る。 マルチプレクサ292は調停を行い、INREG0の内容をライン294を介してラッチ296へ送る。 ラッチ296の内容は、ライン298を介してRAM238内のデータ構造の履歴アレイ102
    (図4)へ出力される。

    【0122】ライン280を介してRAM238から入力されるデータはまた、ラッチ282並びにライン28
    4、300、および302を介してレジスタ304へ送られる。 このパス上のデータは、NEXTと称される変数に格納された古いハッシュポインタを含んでいる。 レジスタ304の内容は、ライン305、306、および307を介してマルチプレクサ256へ出力される。 レジスタ304の出力はまた、ライン305および308
    を介してオフセットレジスタ310に与えられる。 オフセットレジスタ310の機能について簡単に説明する。
    レジスタ304の内容はまた、ライン304、305、
    306、および312を介してMATCHPTRのための変数内容を含むレジスタ314へ送られる。 レジスタ314の出力(MATCHPTR)は、ライン316を介してマルチプレクサ256へ送られる。 レジスタ31
    8の目的は、ポインタHPTRをインクリメントすることである。 レジスタ318の出力は、ライン320および322を介してマルチプレクサ256へ送られる。 他に、レジスタ318の出力はまた、ライン320および324を介してオフセットレジスタ310へ送られる。
    オフセット関数の目的は、履歴アレイ中の適切なオフセットを計算すること、またはライン324および308
    を介してレジスタ318および304から入力されるデータからHPTR−NEXTを計算することにある。

    【0123】修正スイッチ328はライン330を介してオフセットレジスタ310に与えられ、これによってオフセット関数はライン324を介して入力される現在のHPTRのみを出力するようになる。 修正スイッチ3
    28が、オフセット関数が定められるように設定された場合には、オフセット関数310の出力は、マルチプレクサ292または出力管理部260のいずれかに送られる。 その出力が出力管理部260へ送られる場合には、
    それはライン332および336を介して送られる。 オフセットは出力管理部260においてコード化ストリングにコード化される。 他方、その出力はライン332および334を介してマルチプレクサ292へ送られ、次にライン294を介してラッチ296へ、そしてライン298を介してRAM238へ出力される。 しかし、修正スイッチ328がオフセットレジスタ310の出力が現在のHPTRであるように設定された場合には、その出力は、ライン294上の出力を調停するマルチプレクサ292へライン332および334を介して送られる。

    【0124】出力管理部260へのコード化のための長さ入力は、回路図228の最下部に示されているレジスタ338によって維持されている。 レジスタ338の出力はライン340を介して出力管理部260に与えられる。 マルチプレクサ256の目的は、RAM238内の適切なデータ構造を選択するために、ライン316、3
    22、307および255上のアドレスの内のいずれを出力するかを調停することにある。

    【0125】図10を参照して、入力および出力FIF
    Oの使用について説明する。 入力FIFO232(図9)および出力FIFO234(図9)を、圧縮ユニット4の入力および出力側に示す。 入力および出力FIF
    Oは好ましくは、圧縮ユニット4および伸張ユニット6
    と同じチップ内にある。

    【0126】図11に、本発明の圧縮されたデータ出力フォーマットを400として示す。 圧縮されたデータ出力フォーマット400は、圧縮されたハフマン長テーブル402およびコード化されたハフマントークン404
    から構成される。 コード化されたハフマントークン40
    4は、生のデータバイトまたはハフマン長テーブルに従ったマッチングストリングを表現している。 図11にも示す各コード化されたハフマントークン404はハフマンビンコード406を有している。 ハフマンビンコード406が1より多い可能なオフセットを有するマッチングストリングを示すなら、コード化されたハフマントークン404はまた、特定のハフマンビンコード406に対するストリングの正確なオフセットを示す余分なオフセットビット408を有する。 同様に、ハフマンビンコード406が1より多い可能な長さを有するマッチングストリングを示すなら、コード化されたハフマントークン404はまた、特定のハフマンビンコード406に対するストリングの正確な長さを示す余分な長さビット4
    10を有する。

    【0127】ほとんどのデータにおいて、ストリングの大部分が長さ3、4、または5であることが経験によって判明している。 このため、好適な実施態様では、これらのストリング長は複数のハフマンビンに分割され、これによりオフセット分布に対するハフマンコードのより良いマッチングが可能となっている。 ハフマンビン内のこれらのストリングの長さおよびオフセットを組み合わせなければ、ストリングのハフマン丸め誤差はより有意なものとなる。 例えば、これらの長さのストリングに対するトークン確率によれば(オフセットを無視して)、
    大抵が2〜5ビットの長さを有するハフマンコードを導いている。 長さおよびオフセットを基にしてこれらのビンを分割すると、これらのビンのハフマン長は典型的には6〜10ビットの範囲である。 このビン分割によって得られる余分なコーディング効率により、ほんの2Kバイトのウインドウサイズでもってしても良好な圧縮比率が得られる。 また、より大きいウインドウを用いると、
    組み合わせたビンを用いない場合よりも組み合わせた長さ/オフセット対を用いる方がわずかに高い圧縮比率が得られた。

    【0128】図12は、本発明に従ったトークンビンの配列の一例を示す表である。 列450はハフマンビンの数を示し、列452は各ビンによって表現されているものの記述を示し、また列454は、存在するならば、各ビンによって表現されているオフセットの範囲内での正確なオフセットを特定する必要がある余分なオフセットビットの数を示している。 例えば行462はハフマンビン0から255がコード0から255を有する生のバイトを表現することを示している。 生のバイトコードはA
    SCIIまたは他の類似のコード体系から決定され得る。 生のバイトはマッチングストリングではないので、
    ハフマンビン0から255は余分なオフセットビットを必要としない。 別の実施例では、行464はハフマンビン256から258が1のオフセットを有している長さ3、4、および5のマッチングストリングそれぞれを表現していることを示している。 1つのオフセット値のみがハフマンビン256から258のそれぞれによって示されるので、これらのビンは余分なオフセットビットを必要としない。 さらなる実施例では、行466はハフマンビン295から297が128から191の範囲のオフセット値を有する、長さ3、4、および5のマッチングストリングそれぞれを表現していることを示している。 128から191の範囲にある64個のオフセット値の何れが所定の出力トークンによって表現されるかを特定するために、6つの余分なオフセットビットが必要とされる。

    【0129】さらに別の実施例では、行468がハフマンビン319から333が長さ6から20のマッチングストリングそれぞれを表現することを示している。 6以上の長さを有するマッチングストリングに対するオフセットを特定するために必要とされる余分なオフセットビットを図13に示し、以下に説明する。 さらに別の実施例では、行470はハフマンビン334が長さ21以上のストリングを表現することを示している。 このビンは1つの特定の長さより長いストリングを表現しているため、余分な長さビットはこのビンを含有するトークンによって表現される特定の長さを特定する必要がある。 このビン中のマッチングストリングの長さを特定する必要がある余分な長さビットを図14に示し、以下に説明する。 長さが6以上のマッチングストリングのオフセットを特定する必要がある余分なオフセットビットを図13
    に示し、以下に説明する。 最後の実施例では、行472
    はハフマンビン335が圧縮されたデータマーカーの末端部を表現することを示している。 明らかに余分なオフセットビットは必要とされない。

    【0130】当業者であれば、基本圧縮技術を変えることなく、本明細書に記載の全てのパラメータ(例えば、
    MEMSIZE、特定のビン配列等)の値を改変し得ることを認識するだろう。

    【0131】好適な実施態様では、長さが6以上の全てのストリングは図13に示す固定オフセットコード化を用いている。 別の実施態様では、長さが6以上のストリングもまた、好適な実施態様において長さ3、4、および5のストリングに用いられたものと同様の、組み合わせたストリング長およびオフセット範囲を持つビンを有し得る。 しかし、ほとんどのストリングが長さ5以下であるため、追加のハフマンテーブルエントリを格納するために必要とされる余分なスペースは、より長いストリング上におけるより良いコーディングによる利得と匹敵するものであり、そのような実施態様においては、圧縮比率において極めて適度な利得が得られたことが、経験により判明した。 同様に、別の実施態様において2バイトである最小のストリング長を用いると、ほとんどまたは全く圧縮比率利得が経験的に観察されなかったが、これは生のバイト上のハフマンがストリングコード化と同様に長さが2のストリングを典型的にコード化するためであろう。

    【0132】図13の502に示すように、1から32
    の範囲のオフセットが2つのビット「00」およびそれに続く5ビットからなる余分なオフセットビットにより表現されている。 504に示すように、33から160
    の範囲のオフセットが2つのビット「01」およびそれに続く7ビットからなる余分なオフセットビットで表現されている。 506に示すように、161から672の範囲のオフセットが2つのビット「10」およびそれに続く9ビットからなる余分なオフセットビットで表現されている。 508に示すように、673から2047の範囲のオフセットが2つのビット「11」およびそれに続く11ビットからなる余分なオフセットビットで表現されている。

    【0133】図14に、長さが21以上であるストリングの長さを表現するために用いた余分な長さビットの配列の一例を表にして示す。 520の列は可能なストリング長を示しており、522の列は所定の長さを特定するために用いられる対応する余分な長さビットを示している。

    【0134】図15に、ハフマン長からハフマンコードを割り当てるアルゴリズムをCプログラム言語で記載する。 540において、一例であるサブルーチンを通過した変数を定義する。 変数「lengths」は各コードの長さの配列である。 変数「codes」は、サブルーチンによって生成される割り当てられたハフマンコードの配列であり、それぞれ32ビットを限度とする。 変数「size」は「lengths」配列中のエントリ数を表現する整数である。 542において、サブルーチンの頻度カウントが初期化される。 544において、各長さの頻度がカウントされる。 546において、ベースコードが割り当てられる。 548において実際のハフマンコードがビンに割り当てられる。

    【0135】図16において、本発明に従ってハフマン長さテーブルをコード化するために用いられるランレングス符合化の使用法を示す。 長さテーブル570は種々のセグメント572を含有する。 セグメント572は、
    ゼロカウント574、非ゼロカウント576および非ゼロ長さ580を有している。 ゼロカウント574および非ゼロカウント576はそれぞれカウント578を有している。 カウント578はゼロまたは非ゼロカウントを表現する。 カウント578は図16に示すようにコード化される。 「0000」のカウントは全テーブルの末端部を表現する。 カウント「0001」から「1110」
    はカウント1から14をそれぞれ表現する。 カウント1
    5から270は「1111」およびそれに続く8ビットからなるカウントによって表現される。 非ゼロ長さ58
    0は図16に示すようにコード化される。 「0000」
    の非ゼロ長さは全テーブルの末端部を示す。 「000
    1」から「1111」の非ゼロ長さは1から15の非ゼロ長さをそれぞれ表現する。

    【0136】テーブルの符合化の一例を582に示す。
    実施例において示す全ての数量は4ビットニブルである。 一例である長さテーブル584はコード化される以下の長さを含有する:0、0、0、0、8、9、1、
    0、5、4、0、0、0。 テーブルの最初のセグメントは4、3、8、9、1、であり、それは4つのゼロ、3
    つの非ゼロ、および3つの非ゼロ長さ8、9、1を表現している。 テーブルの第2のセグメントは1、2、5、
    4、であり、それは1つのゼロ、2つの非ゼロ、および2つの非ゼロ長さ5、4を表現している。 テーブルの最後のセグメントは3、0であり、それは3つのゼロおよびテーブルの末端部を表現している。

    【0137】図17〜図22を参照して、小さな入力ストリームに対する圧縮ユニット4の簡潔化されてはいるが完全な出力例の段階を、好適な実施態様におけるコード化方法を用いて、説明する。 この場合、入力ストリームのサイズは図に示すにはあまりに小さいため、出力データストリームは実際には入力データストリームより大きい。 しかし、この例は、どのように圧縮符合化ステップが実行されるかを正確に説明するのに役立つ。

    【0138】図17に、一例として、ASCIIテキストのフレーズ"this is a small small example"を示している。 列600に、スライディングウインドウ探索によって生成されたトークンを挙げている。 列602に、
    各トークンに対応するハフマンビンを図12に示すハフマンビン配列に従って表記する。

    【0139】図18において、列610にハフマンビンを数値順に表記する。 列612に列610の各ビンに対するビンカウントを表記する。 列614に列610の各ビンに対するハフマン長を表記する。 列616に、列6
    10の各ビンに対して割り当てられたハフマンコードを表記する。

    【0140】図19に、圧縮されたハフマンテーブルを示すが、全ての数値は16進法ニブルで表している。 圧縮されたテーブルのセグメントを列620に表記する。
    各テーブルセグメントに対応する記述を列622に載せる。

    【0141】図20に、コード化されたトークンのビットストリームを列630に示す。 対応するコード化されていないトークンを列632に表記する。

    【0142】図21に、テーブルおよびコード化されたトークンからなる出力バイトストリーム640を示す。
    図22に、出力ワードにプットバック(put back)された出力バイトストリーム640からなる、出力ワードストリーム642を示す。

    【0143】図23に、本発明に従ってコード化された伸張データの伸張操作を表わすフローブロック図を示す。 伸張操作は圧縮操作より簡潔であるが、それは主としてストリング探索が必要でないこと、およびデータが中間バッファなしに1回のパスで処理され得るためである。

    【0144】伸張操作はブロック700において開始し、伸張ユニット6が圧縮された入力ストリームからハフマン長テーブルを読み込む。 これらの長さは圧縮されたフォーマット内に格納されているため、それらは圧縮ユニット4に用いられる方法に従って圧縮された入力ビットストリームから伸張される。 好適な実施態様においては、図16のランレングス符合化が用いられるが、他の多くの技術もまた使用可能である。 公知の各ハフマンビンに対するコードの長さを用いて、処理はブロック7
    02に進み、図15に示すアルゴリズムを用いて、ハフマンコードが各ビンに割り当てられる。 トークンビンに対するハフマンコードの場合、処理はブロック704に進み、トークンをデコードするためにハフマンツリーが構築される。 好適な実施態様では、ハフマンツリーは図24の750に示すように、記憶装置中のデータ構造によって表現される。 ツリーを756に図示する。 対応するハフマンコードを758に列挙する。 データ構造7
    50の各メモリセルの内容は2つのフィールド、タグビットフィールド752および子/ビンフィールド754
    からなる。 メモリセル中のタグビットはセルがツリーの葉を含有しているか、または子があるかを知らせる。 タグビットが子があることを示すと、セルの残りのビットが左側の子のメモリアドレスNを与え、右側の子がアドレスN+1に現れる。 タグビットがこれがハフマンツリーの葉であることを示すなら、メモリセルの残りのビットは葉に関連したハフマンビン数を含有している。 好適な実施態様では、メモリ幅は、1つのタグビットおよび10のアドレスビットからなる少なくとも11のビットである。 好適な実施態様では、336*2メモリセルのみが実際に完全なツリーを含むことを要求され、これが10ビットのアドレスを必要としている。

    【0145】圧縮された入力データストリームからトークンを抜き出し、それらをデコードするために、一度に1ビットずつが読みだされる。 開始メモリアドレスがM
    =0に設定される。 ビットがゼロなら、左ノード(アドレスM)の内容が検査される。 ビットが1なら、右ノード(アドレスM+1)の内容が検査される。 問題のノードが葉でないなら、MはN(そのメモリセルの残りのビット)に等しくなるように設定され、ツリートラバーサルが、この方法で葉ノードが見つかるまで継続される。

    【0146】ハフマンビンが生のバイトに相当するなら、伸張ユニット6は生のバイトを出力する。 ハフマンビンがストリングに相当するなら、ストリングオフセットおよび長さを特定する必要がある余分なビットが入力データストリームから抜き出される。 次にストリングが、一度に1バイトずつ出力される。 好適な実施態様では、ほとんどのスライディングウインドウ伸張体系でそうであるように、これは最後のMEMSIZEバイト出力の履歴アレイを維持し、バイトを引き出すオフセットにより履歴アレイ中へインデックスバック(indexing b
    ack)することにより行われる。 出力された全てのバイト、生のバイトまたはストリングバイトのいずれかが、
    履歴アレイに加えられる。 ハフマンビンが圧縮されたデータマークの末端部に対応するなら、伸張ユニット6は停止する。 そうでなければ、各ストリングまたは生のバイトを処理した後、トークンを抜き出す処理は、入力ストリームが消耗するまで、または圧縮されたデータマークの末端部が見つかるまで継続される。

    【0147】別の実施態様では、ハフマンテーブルがマルチビットルックアップテーブルとして構築され、さらに速い操作を可能とする。 ビットの定数(K)が入力ストリームから抜き出され、2 kエントリを有するテーブル中でルックアップするために用いられる。 テーブルサイズは典型的には512または1024エントリであり、K=9または10に相当する。 各テーブルエントリはコード長(L)を含有しており、実際に必要とされるビット数を知らせる。 このコード長がK以下であれば、
    抜き出されたビットはハフマンビンを独特の方法で同定するに充分なものであり、またテーブルエントリの残りはハフマンビン数を特定する。 この場合、入力データストリームから抜き出されたK−Lビットは実際には必要でないため、それらはハフマンビン処理を進める前に入力ストリームに効果的に「プットバック」された。 KがLよりも大きければ、テーブルエントリの残りは、好適な実施態様において上述したように、一度に1ビットずつ、トラバースされるハフマンサブツリーの残りのメモリ位置(N)を特定する。 一般にテーブルの葉エントリは2 (KL)回反復される。 この技術は、ほとんどのハフマンビンが、ハフマンコード長の1ビット当り1メモリサイクルではなく、1回のメモリサイクルにより抜き出されることを可能にし、伸張プロセスの実質的なスピードアップを導いている。

    【0148】図23において、一度ハフマンツリーが構築されると、処理はブロック706に進み、圧縮された入力データストリームから次のハフマンコードが抜き出され、そのコードで表現されたビンを決定するハフマンコードに対するデータ構造へと続く。 次に、ブロック7
    08において、ハフマンビンが生のバイトであるかが決定される。 生のバイトであれば、処理はブロック710
    に進み、生のバイトが伸張データストリームに出力される。 次に処理はブロック706に戻る。

    【0149】ブロック708において、ハフマンビンが生のバイトでないと決定されると、処理はブロック71
    2に進み、ハフマンビンが「圧縮されたデータの末端部」マーカであるか否かが決定される。 是であれば、処理は終了し伸張は完了する。 否であれば、処理はブロック714に進み、特定のハフマンビンにとって必要であれば余分なストリングオフセットビットが抜き出される。 次に処理はブロック716に進み、特定のハフマンビンにとって必要であれば余分なストリング長ビットが抜き出される。

    【0150】次に処理はブロック718に進み、マッチングストリングの次のバイトが、所定のオフセットおよび長さで伸張ユニット6により維持された履歴アレイから出力される。 次に処理はブロック720に進み、出力されるマッチングストリング内に他にバイトがあるかが決定される。 あるならば、処理はブロック718に戻り、次のバイトが出力される。 マッチングストリング内に他にバイトがなければ、処理はブロック706に戻り、次のハフマンコードが抜き出される。

    【0151】本発明を例を挙げて、好適な実施態様により説明してきたが、本発明はそれらに限定されるものではない。

    【0152】

    【発明の効果】本発明によれば、完全に適合性があり、
    予め初期化されたコード化テーブルを必要とせず、コンピュータファイルのようにバイトに適応したキャラクタストリームを最適化するデータ圧縮が達成される。

    【図面の簡単な説明】

    【図1】(a)は、本発明による、未圧縮データを受け取り圧縮データを出力する圧縮ユニットを示すブロック図、(b)は、本発明による、圧縮データを受け取り伸張データを出力する伸張ユニットを示すブロック図である。

    【図2】本発明によって動作するように構成された圧縮ユニットのブロック図である。

    【図3】本発明による出力トークンの生成の例を示す図である。

    【図4】入力データストリームに関してマッチするストリングの探索を行うための、本発明の好ましい実施例によって実行されるデータ構造を示す図である。

    【図5】入力データストリームから出力トークンを生成させるためのスライディングウインドウ探索を示す流れブロック図である。

    【図6】入力データストリームから出力トークンを生成させるためのスライディングウインドウ探索を示す流れブロック図である。

    【図7】入力データストリームから出力トークンを生成させるためのスライディングウインドウ探索を示す流れブロック図である。

    【図8】図4に示されるデータ構造のハッシュテーブルを初期化するためのスライディングウインドウ探索(図5〜図7)の間に参照される初期化ルーチンの流れブロック図である。

    【図9】本発明のスライディングウインドウ探索及び出力トークン生成をハード的配線で示した概略ブロック図である。

    【図10】入力及び出力RAMFIFOを示すブロック図である。

    【図11】本発明において用いられる圧縮フォーマットを示す図である。

    【図12】本発明による、トークンビンの割当ての一例を示す表である。

    【図13】図12の例のハフマンビン割当てによる6及びそれ以上のストリングの長さに対する余分なオフセットビットのコード化の一例を示す図である。

    【図14】図12の例のハフマンビン割当てによって単一ハフマンビンに割り当てられる21及びそれ以上のストリングの長さに対する余分なレングスビットのコード化の一例を示す図である。

    【図15】ハフマンレングスからハフマンコードを割り当てるためのアルゴリズムを示す図である。

    【図16】本発明によるハフマンレングスをコード化するために用いられるランレングスコード化の使用を示す図である。

    【図17】本発明による圧縮コード化の簡単化された例のステージを示す図である。

    【図18】本発明による圧縮コード化の簡単化された例のステージを示す図である。

    【図19】本発明による圧縮コード化の簡単化された例のステージを示す図である。

    【図20】本発明による圧縮コード化の簡単化された例のステージを示す図である。

    【図21】本発明による圧縮コード化の簡単化された例のステージを示す図である。

    【図22】本発明による圧縮コード化の簡単化された例のステージを示す図である。

    【図23】本発明によるコード化データを伸張するための伸張動作を示す流れブロック図である。

    【図24】本発明によるコード化データを伸張するための伸張ハフマンツリーデータ構造を示す図である。

    【符号の説明】

    230 圧縮コントローラ兼シーケンスユニット 260 出力管理部 274 内部マッチバッファ 338 レジスタ

    ───────────────────────────────────────────────────── フロントページの続き (72)発明者 ダグラス エル. ホワイティング アメリカ合衆国 カリフォルニア 92009, カールズバッド,フェボ コート 3312 (72)発明者 グレン エイ. ジョージ アメリカ合衆国 カリフォルニア 91106, パサデナ,ピー. オー. ボックス 60545 (72)発明者 グレン イー. アイビー アメリカ合衆国 カリフォルニア 91106, パサデナ,サウス ミシガン ナンバー 202 146

    高效检索全球专利

    专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

    我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

    申请试用

    分析报告

    专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

    申请试用

    QQ群二维码
    意见反馈