(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-09-27
(45)【発行日】2024-10-07
(54)【発明の名称】圧縮装置および制御方法
(51)【国際特許分類】
H03M 7/42 20060101AFI20240930BHJP
【FI】
H03M7/42
(21)【出願番号】P 2021039512
(22)【出願日】2021-03-11
【審査請求日】2023-09-11
(73)【特許権者】
【識別番号】318010018
【氏名又は名称】キオクシア株式会社
(74)【代理人】
【識別番号】110001737
【氏名又は名称】弁理士法人スズエ国際特許事務所
(72)【発明者】
【氏名】小玉 翔
(72)【発明者】
【氏名】住吉 正人
(72)【発明者】
【氏名】中西 圭里
【審査官】鉢呂 健
(56)【参考文献】
【文献】特開平05-110450(JP,A)
【文献】特開平7-212243(JP,A)
【文献】特表2017-528015(JP,A)
【文献】米国特許第6690306(US,B1)
【文献】米国特許第6919826(US,B1)
(58)【調査した分野】(Int.Cl.,DB名)
H03M 3/00-9/00
(57)【特許請求の範囲】
【請求項1】
複数のシンボルの各々の出現頻度に基づいて、前記複数のシンボルにそれぞれ関連付けられる複数の符号長を決定し、
前記複数のシンボルが、上限値を超えた1つ以上の第1符号長にそれぞれ関連付けられた1つ以上の第1シンボルを含む場合、前記1つ以上の第1符号長を前記上限値に変更し、前記複数のシンボルの内、前記上限値未満である1つ以上の第2符号長にそれぞれ関連付けられた1つ以上の第2シンボルから、関連付けられた符号長が長いものから順に、少なくとも1つの第3シンボルを選択し、前記少なくとも1つの第3シンボルに関連付けられた少なくとも1つの第3符号長を前記上限値に変更し、変更した前記1つ以上の第1符号長および前記少なくとも1つの第3符号長を少なくとも用いて、前記複数のシンボルと、前記複数のシンボルにそれぞれ関連付けられた複数の可変長符号とを示す符号化情報を生成する符号化情報生成部と、
前記符号化情報を用いてシンボルを可変長符号に変換する符号化部とを具備し、
前記複数の可変長符号の各々の符号長は、1から前記上限値までのビット長である圧縮装置。
【請求項2】
前記符号化情報生成部は、前記少なくとも1つの第3符号長を前記上限値に変更した場合、クラフト不等式
【数1】
に基づいて、前記クラフト不等式の左辺の値を計算し、
Sは、前記複数のシンボルを示し、
sは、前記複数のシンボルに属するシンボルを示し、
l(s)は、シンボルsに関連付けられた符号長を示し、
前記符号化情報生成部は、計算した前記クラフト不等式の左辺の値が1より大きい場合、前記1つ以上の第2シンボルから、関連付けられた符号長が長いものから順に、まだ選択されていない少なくとも1つの第4シンボルを選択し、前記少なくとも1つの第4シンボルに関連付けられた少なくとも1つの第4符号長を前記上限値に変更し、前記クラフト不等式の左辺の値を計算する処理を、前記クラフト不等式の左辺の値が1以下になるまで繰り返し行う、請求項1記載の圧縮装置。
【請求項3】
前記少なくとも1つの第3シンボルは、M個のシンボルであり、
前記Mは、2以上の整数であり、
前記符号化情報生成部は、
前記M個のシンボルにそれぞれ関連付けられたM個の符号長を並列に前記上限値に変更し、
前記クラフト不等式の左辺の値を計算する、請求項2記載の圧縮装置。
【請求項4】
前記少なくとも1つの第4シンボルは、N個のシンボルであり、
前記Nは、前記M以下の整数であり、
前記符号化情報生成部は、
前記N個のシンボルにそれぞれ関連付けられたN個の符号長を並列に前記上限値に変更し、
前記クラフト不等式の左辺の値を計算する、請求項3記載の圧縮装置。
【請求項5】
圧縮装置の制御方法であって、
符号化情報生成部によって、複数のシンボルの各々の出現頻度に基づいて、前記複数のシンボルにそれぞれ関連付けられる複数の符号長を決定し、
前記複数のシンボルが、上限値を超えた1つ以上の第1符号長にそれぞれ関連付けられた1つ以上の第1シンボルを含む場合、前記符号化情報生成部によって、前記1つ以上の第1符号長を前記上限値に変更し、前記複数のシンボルの内、前記上限値未満である1つ以上の第2符号長にそれぞれ関連付けられた1つ以上の第2シンボルから、関連付けられた符号長が長いものから順に、少なくとも1つの第3シンボルを選択し、前記少なくとも1つの第3シンボルに関連付けられた少なくとも1つの第3符号長を前記上限値に変更し、変更した前記1つ以上の第1符号長および前記少なくとも1つの第3符号長を少なくとも用いて、前記複数のシンボルと、前記複数のシンボルにそれぞれ関連付けられた複数の可変長符号とを示す符号化情報を生成し、
符号化部によって、前記符号化情報を用いてシンボルを可変長符号に変換し、
前記複数の可変長符号の各々の符号長は、1から前記上限値までのビット長である制御方法。
【請求項6】
前記少なくとも1つの第3符号長を前記上限値に変更した場合、前記符号化情報生成部によって、クラフト不等式
【数2】
に基づいて、前記クラフト不等式の左辺の第1の値を計算し、
Sは、前記複数のシンボルを示し、
sは、前記複数のシンボルに属するシンボルを示し、
l(s)は、シンボルsに関連付けられた符号長を示し、
計算した前記クラフト不等式の左辺の値が1より大きい場合、前記符号化情報生成部によって、前記1つ以上の第2シンボルから、関連付けられた符号長が長いものから順に、まだ選択されていない少なくとも1つの第4シンボルを選択し、前記少なくとも1つの第4シンボルに関連付けられた少なくとも1つの第4符号長を前記上限値に変更し、前記クラフト不等式の左辺の値を計算する処理を、前記クラフト不等式の左辺の値が1以下になるまで繰り返し行う、請求項5記載の制御方法。
【請求項7】
前記少なくとも1つの第3シンボルは、M個のシンボルであり、
前記Mは、2以上の整数であり、
前記符号化情報生成部によって、前記M個のシンボルにそれぞれ関連付けられたM個の符号長を並列に前記上限値に変更し、
前記符号化情報生成部によって、前記クラフト不等式の左辺の値を計算する、請求項6記載の制御方法。
【請求項8】
前記少なくとも1つの第4シンボルは、N個のシンボルであり、
前記Nは、前記M以下の整数であり、
前記符号化情報生成部によって、前記N個のシンボルにそれぞれ関連付けられたN個の符号長を並列に前記上限値に変更し、
前記符号化情報生成部によって、前記クラフト不等式の左辺の値を計算する、請求項7記載の制御方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、圧縮装置および制御方法に関する。
【背景技術】
【0002】
動的ハフマン符号化は、符号化対象のシンボルの出現頻度に基づいて動的に符号化テーブルを生成する可変長符号化方式である。動的ハフマン符号化では、出現頻度が高いシンボルには短い符号語が割り当てられ、出現頻度が低いシンボルには長い符号語が割り当てられる。
【0003】
データ圧縮規格で定められた制約や、圧縮装置および伸張装置のハードウェア実装における制約によっては、動的ハフマン符号化で割り当てられる符号語の長さ(符号長)が、制約に基づく上限値を超えないようにしなければならない場合がある。このような場合には、シンボル毎の出現頻度を用いて符号化テーブルを生成する段階において、シンボルに割り当てられる符号語の長さが上限値以下となるように符号化テーブルを生成する必要がある。
【先行技術文献】
【特許文献】
【0004】
【文献】米国特許出願公開第2020/0099958号明細書
【発明の概要】
【発明が解決しようとする課題】
【0005】
本発明が解決しようとする課題は、符号長を上限値以下に制約する場合に圧縮性能の低下を抑制できる圧縮装置、および制御方法を提供することである。
【課題を解決するための手段】
【0006】
実施形態によれば、圧縮装置は、符号化情報生成部と符号化部とを具備する。符号化情報生成部は、複数のシンボルの各々の出現頻度に基づいて、前記複数のシンボルにそれぞれ関連付けられる複数の符号長を決定する。前記符号化情報生成部は、前記複数のシンボルが、上限値を超えた1つ以上の第1符号長にそれぞれ関連付けられた1つ以上の第1シンボルを含む場合、前記1つ以上の第1符号長を前記上限値に変更し、前記複数のシンボルの内、前記上限値未満である1つ以上の第2符号長にそれぞれ関連付けられた1つ以上の第2シンボルから、関連付けられた符号長が長いものから順に、少なくとも1つの第3シンボルを選択し、前記少なくとも1つの第3シンボルに関連付けられた少なくとも1つの第3符号長を前記上限値に変更し、変更した前記1つ以上の第1符号長および前記少なくとも1つの第3符号長を少なくとも用いて、前記複数のシンボルと、前記複数のシンボルにそれぞれ関連付けられた複数の可変長符号とを示す符号化情報を生成する。符号化部は、前記符号化情報を用いてシンボルを可変長符号に変換する。前記複数の可変長符号の各々の符号長は、1から前記上限値までのビット長である。
【図面の簡単な説明】
【0007】
【
図1】第1実施形態に係る圧縮装置を含む情報処理システムの構成例を示すブロック図。
【
図2】第1実施形態の圧縮装置の構成例を示すブロック図。
【
図3】第1実施形態の圧縮装置に設けられる動的ハフマン符号化器の構成例を示すブロック図。
【
図4】第1実施形態の圧縮装置において実行される符号長決定処理の手順の例を示すフローチャート。
【
図5】第1実施形態の圧縮装置において用いられる頻度テーブルの構成例を示す図。
【
図6】第1実施形態の圧縮装置において生成されるハフマン木の例を示す図。
【
図7】第1実施形態の圧縮装置において用いられる符号長テーブルの構成例を示す図。
【
図8】第1実施形態の圧縮装置において実行される上限違反修正処理の手順の例を示すフローチャート。
【
図9】第1実施形態の圧縮装置において実行される冗長リーフ除去処理の手順の例を示すフローチャート。
【
図10】第1実施形態の圧縮装置における
図6のハフマン木の変形例を示す図。
【
図11】第1実施形態の圧縮装置における
図10のハフマン木の変形例を示す図。
【
図12】第1実施形態の圧縮装置における
図11のハフマン木の変形例を示す図。
【
図13】第1実施形態の圧縮装置における
図12のハフマン木の変形例を示す図。
【
図14】第1実施形態の圧縮装置における
図7の符号長テーブルの変更例を示す図。
【
図15】第1実施形態の圧縮装置における
図14の符号長テーブルの変更例を示す図。
【
図16】第1実施形態の圧縮装置における
図15の符号長テーブルの変更例を示す図。
【
図17】第1実施形態の圧縮装置における
図16の符号長テーブルの変更例を示す図。
【
図18】第1実施形態の圧縮装置において実行される、シンボルに符号ビット列を割り当てる疑似プログラムの例を示す図。
【
図19】第1実施形態の圧縮装置におけるシンボルへの符号ビット列の割り当ての例を示す図。
【
図20】比較例に係る圧縮装置において実行される符号長制約処理の手順の例を示すフローチャート。
【
図21】比較例に係る圧縮装置におけるハフマン木の変形例を示す図。
【
図22】比較例に係る圧縮装置における
図22のハフマン木の変形例を示す図。
【発明を実施するための形態】
【0008】
以下、実施の形態について図面を参照して説明する。
【0009】
(第1実施形態)
図1は、第1実施形態に係る圧縮装置15を含む情報処理システム1の構成例を示す。情報処理システム1は、ホストデバイス2(以下、ホスト2と称する)と、メモリシステム3とを含む。
【0010】
メモリシステム3は、NAND型フラッシュメモリ5のような不揮発性メモリにデータを書き込み、不揮発性メモリからデータを読み出すように構成された半導体ストレージデバイスである。メモリシステム3は、例えばNAND型フラッシュメモリ5を備えるソリッドステートドライブ(SSD)として実現される。以下では、メモリシステム3がSSDとして実現される場合について例示するが、メモリシステム3はハードディスクドライブ(HDD)として実現されてもよい。
【0011】
ホスト2は、大量且つ多様なデータをメモリシステム3に保存するストレージサーバであってもよいし、パーソナルコンピュータであってもよい。
【0012】
メモリシステム3は、ホスト2のストレージとして使用され得る。メモリシステム3はホスト2に内蔵されてもよいし、ホスト2にケーブルまたはネットワークを介して接続されてもよい。
【0013】
ホスト2とメモリシステム3とを接続するためのインタフェースは、SCSI、Serial Attached SCSI(SAS)、ATA(AT Attachment)、Serial ATA(SATA)、PCI Express(PCIe)(登録商標)、Ethernet(登録商標)、Fibre channel、NVM Express(NVMe)(登録商標)等に準拠する。
【0014】
メモリシステム3は、コントローラ4およびNAND型フラッシュメモリ5を備える。コントローラ4は、System-on-a-chip(SoC)のような回路によって実現され得る。
【0015】
コントローラ4は、揮発性メモリであるランダムアクセスメモリ(RAM)、例えばダイナミックランダムアクセスメモリ(DRAM)6を備えていてもよい。あるいは、スタティックランダムアクセスメモリ(SRAM)のようなRAMがコントローラ4に内蔵されていてもよい。なお、DRAM6が、コントローラ4に内蔵されていてもよい。
【0016】
DRAM6等のRAMには、例えばNAND型フラッシュメモリ5からロードされるファームウェア(FW)の格納領域が設けられる。
【0017】
NAND型フラッシュメモリ5は複数のブロックを含む。各ブロックは複数のページを含む。1つのブロックは最小の消去単位として機能する。ブロックは、「消去ブロック」、または「物理ブロック」と称されることもある。各ページは、同一ワード線に接続された複数のメモリセルを含む。1つのページは、データ書き込み動作およびデータ読み出し動作の単位である。なお、ワード線をデータ書き込み動作およびデータ読み出し動作の単位としてもよい。
【0018】
各ブロックに対して許容できるプログラム/イレーズサイクル数には上限(最大P/Eサイクル数)がある。あるブロックの1回のP/Eサイクルは、このブロック内のすべてのメモリセルを消去状態にするための消去動作と、このブロックのページそれぞれにデータを書き込む書き込み動作とを含む。
【0019】
コントローラ4は、ホストインタフェース(ホストI/F)11、CPU12、NANDインタフェース(NAND I/F)13、DRAMインタフェース(DRAM I/F)14、および圧縮装置15を含んでもよい。これらホストI/F11、CPU12、NAND I/F13、DRAM I/F14、および圧縮装置15は、バス10を介して相互接続され得る。
【0020】
コントローラ4は、Toggle DDR、Open NAND Flash Interface(ONFI)等のインタフェース規格に対応するNAND I/F13を介して、NAND型フラッシュメモリ5に電気的に接続されている。NAND I/F13は、NAND型フラッシュメモリ5を制御するように構成されたNAND制御回路として機能する。
【0021】
コントローラ4は、NAND型フラッシュメモリ5を制御するように構成されたメモリコントローラとして機能する。
【0022】
コントローラ4は、NAND型フラッシュメモリ5のデータ管理およびブロック管理を実行するように構成されたフラッシュトランスレーション層(FTL)として機能してもよい。このFTLによって実行されるデータ管理には、(1)論理アドレスそれぞれとNAND型フラッシュメモリ5の物理アドレスそれぞれとの間の対応関係を示すマッピング情報の管理、(2)ページ単位のリード/ライト動作とブロック単位の消去(イレーズ)動作とを隠蔽するための処理、等が含まれる。論理アドレスは、メモリシステム3をアドレス指定するためにホスト2によって使用されるアドレスである。
【0023】
論理アドレスそれぞれと物理アドレスそれぞれとの間のマッピングの管理は、論理物理アドレス変換テーブルを用いて実行される。コントローラ4は、論理物理アドレス変換テーブルを使用して、論理アドレスそれぞれと物理アドレスそれぞれとの間のマッピングを特定の管理サイズ単位で管理する。ある論理アドレスに対応する物理アドレスは、この論理アドレスのデータが書き込まれたNAND型フラッシュメモリ5内の物理記憶位置を示す。論理物理アドレス変換テーブルは、メモリシステム3の電源オン時にNAND型フラッシュメモリ5からDRAM6にロードされてもよい。
【0024】
1つのページへのデータ書き込みは、1回のP/Eサイクル当たり1回のみ可能である。このため、コントローラ4は、ある論理アドレスに対応する更新データを、この論理アドレスに対応する以前のデータが格納されている物理記憶位置ではなく、別の物理記憶位置に書き込む。そして、コントローラ4は、この論理アドレスをこの別の物理記憶位置に関連付けるように論理物理アドレス変換テーブルを更新することにより、以前のデータを無効化する。
【0025】
ブロック管理には、不良ブロックの管理、ウェアレベリング、ガベージコレクション、等が含まれる。
【0026】
ホストI/F11は、メモリシステム3と、メモリシステム3の外部装置であるホスト2との通信を行うハードウェアインタフェースである。ホストI/F11は、ホスト2から様々なコマンド、例えば、I/Oコマンド、各種制御コマンドを受信する回路として機能する。I/Oコマンドには、ライトコマンド、リードコマンド、が含まれ得る。制御コマンドには、アンマップコマンド(トリムコマンド)、フォーマットコマンドが含まれ得る。ホストI/F11は、コマンドに応じた応答やデータをホスト2に送信する回路としても機能する。
【0027】
DRAM I/F14は、DRAM6のアクセスを制御するように構成されたDRAM制御回路として機能する。DRAM6の記憶領域は、FWを格納するための領域や、リード/ライトバッファ等として利用されるバッファ領域に割り当てられる。
【0028】
CPU12は、ホストI/F11、NAND I/F13、およびDRAM I/F14を制御するように構成されたプロセッサである。CPU12は、DRAM6にロードされたFWを実行することによって様々な処理を行う。つまり、FWはCPU12の動作を制御するための制御プログラムである。CPU12は、前述のFTLの処理に加え、ホスト2からの様々なコマンドを処理するためのコマンド処理等を実行することができる。なお、FTL処理およびコマンド処理の一部または全部は、コントローラ4内の専用ハードウェアによって実行されてもよい。
【0029】
圧縮装置15は、NAND型フラッシュメモリ5に書き込むべきデータを符号化することにより、そのデータを圧縮する。圧縮装置15は、例えばホスト2からライトコマンドを受け付けたことに応じて受信した平文のデータを、符号化する。圧縮装置15は、データを圧縮するために、例えば動的ハフマン符号化を実現するための構成を有する。
【0030】
図2は圧縮装置15の一構成例を示す。圧縮装置15は、例えば、動的ハフマン符号化器21とパック処理部22とを備える。
【0031】
動的ハフマン符号化器21は、入力されたシンボルに対して、動的ハフマン符号化を行う。動的ハフマン符号化は、符号化対象のシンボルの出現頻度を用いて動的に符号化テーブルを生成する可変長符号化方式である。符号化テーブルは、複数のシンボルと、複数のシンボルにそれぞれ関連付けられた複数の可変長符号(符号語)とを示す情報を含む。動的ハフマン符号化では、出現頻度が高いシンボルには短い符号語が割り当てられ、出現頻度が低いシンボルには長い符号語が割り当てられる。動的ハフマン符号化器21は、このような割り当てに従い、入力されたシンボルを符号語に変換する。つまり、変換により得られる符号語は、可変長符号である。なお、シンボルは、例えば固定長のデータである。
【0032】
動的ハフマン符号化器21は、動的ハフマン符号化により得られた可変長符号をパック処理部22に送出する。また、動的ハフマン符号化器21は、符号化テーブルに示される複数のシンボルにそれぞれ割り当てられた複数の可変長符号の長さ(すなわち複数の符号長)を、特定のシンボル順にパック処理部22に送出する。特定のシンボル順は、例えば、対応する複数のシンボルのアルファベット順に従う順序である。つまり、特定のシンボル順に並べられた複数の符号長は、例えば、アルファベット順に並べられた複数のシンボルとそれぞれ対応するように並べ替えられた複数の符号長である。
【0033】
パック処理部22は、動的ハフマン符号化器21から出力された1つ以上の可変長符号をまとめて、特定のデータサイズ毎の圧縮データ(圧縮ストリーム)として出力し得る。パック処理部22は、特定のシンボル順に並べられた複数の符号長を、この圧縮データのヘッダとして挿入する。特定のシンボル順に並べられた複数の符号長は、伸張装置16が圧縮データを復号する際に、符号化テーブル(復号テーブル)を復元するために用いられる。
【0034】
動的ハフマン符号化器21およびパック処理部22の一部または全ては、回路のようなハードウェアとして実現されてもよいし、少なくとも1つのプロセッサによって実行されるプログラム(すなわちソフトウェア)として実現されてもよい。
【0035】
なお、コントローラ4は、伸張装置16を備えていてもよい。伸張装置16は、NAND型フラッシュメモリ5から読み出された圧縮データを復号することにより、その圧縮データを伸張する。例えば、コントローラ4がホスト2からリードコマンドを受け付けたことに応じて、伸張装置16は、NAND型フラッシュメモリ5から読み出された圧縮データを、復号する。コントローラ4は、ホスト2からのリードコマンドに対する応答として、復号したデータをホスト2へ送信する。伸張装置16は、圧縮装置15による圧縮のための構成に準じて、圧縮データを伸張(すなわち逆変換)するための構成を備える。
【0036】
コントローラ4は、さらに、ECCエンコーダとECCデコーダを備えてもよい。この場合、ECCエンコーダが、パック処理部22から出力される圧縮データに対して誤り訂正用のパリティ(ECCパリティ)を生成し、生成したECCパリティと圧縮データとを有する符号語を生成する。そして、CPU12が、符号語をNAND I/F13経由でNAND型フラッシュメモリ5へ書き込むように構成される。また、この場合、コントローラ4が例えばホスト2から発行されるリードコマンドに基づいてNAND型フラッシュメモリ5からデータを読み出す際に、CPU12がNAND I/F13経由でNAND型フラッシュメモリ5から符号語を読み出し、ECCデコーダが当該読み出された符号語に対して、エラー検出処理、エラー訂正処理を実行し、圧縮データを生成する。そして、伸張装置16が、生成された圧縮データを伸張するように構成される。すなわち、コントローラ4は、パック処理部22から出力される圧縮データに基づくデータをNAND型フラッシュメモリ5に書き込み、NAND型フラッシュメモリ5から読み出したデータに基づいて圧縮データを生成し、生成された圧縮データを伸張するように構成されてもよい。
【0037】
図3は、動的ハフマン符号化器21の構成例を示すブロック図である。動的ハフマン符号化器21は、例えば、ディレイバッファ31、符号化テーブル生成部32、および符号化部33を備える。
【0038】
ディレイバッファ31は、動的ハフマン符号化器21に入力されたシンボルを記憶(バッファリング)する。ディレイバッファ31は、記憶したシンボルを、例えば特定のタイミングまで遅延させて、符号化部33に送出する。
【0039】
符号化テーブル生成部32は、動的ハフマン符号化器21に入力されたシンボルを用いて、符号化テーブル43を生成する。符号化テーブル43は、複数のシンボルと、複数のシンボルにそれぞれ関連付けられた複数の可変長符号(すなわち複数の符号ビット列)とを示す情報を含む。
【0040】
より詳しくは、符号化テーブル生成部32は、特定単位の入力データに含まれる複数のシンボルの出現頻度に基づき、符号長の上限値の制約を考慮して、符号化テーブル43を生成する。特定単位は、特定のデータ量単位であってもよいし、ファイルのような特定のまとまりを単位としてもよい。特定のまとまりを単位とする場合、符号化テーブル生成部32は、入力データの終端を示すデータを検出することにより、特定単位の入力データを認識する。また、符号長の上限値の制約とは、シンボルが動的ハフマン符号化によって変換される可変長符号の長さ(符号長)の上限値に関する制約である。符号長の上限値は、例えば、データ圧縮規格で定められた制約や、圧縮装置15および伸張装置16のハードウェア実装における制約に基づき決定される。符号化テーブル生成部32は、符号長の上限値の制約に従って、符号化テーブル43に示される各シンボルに割り当てられる可変長符号の長さが、制約に基づく上限値を超えないように、符号化テーブル43を生成する。
【0041】
符号化テーブル生成部32は、例えば、頻度テーブル生成部321、符号長決定部322、符号長上限違反修正部323、およびカノニカルハフマン処理部324を備える。
【0042】
頻度テーブル生成部321は、入力されたシンボルを用いて頻度テーブル41を生成する。頻度テーブル41は、複数のシンボルと、複数のシンボルそれぞれの出現頻度とを示すテーブルである。頻度テーブル41の具体的な構成例については、
図5を参照して後述する。
【0043】
符号長決定部322は、頻度テーブル41を用いて、複数のシンボルにそれぞれ関連付けられる複数の符号長を決定する。符号長決定部322は、例えば、出現頻度が高いシンボルに短い符号長を関連付け、出現頻度が低いシンボルに長い符号長を関連付ける。なお、シンボルに関連付けられる符号長とは、そのシンボルに割り当てられる可変長符号(すなわち符号ビット列)の長さである。符号長は、例えばビット単位の長さで表される。以下では、シンボルに関連付けられる符号長を、単に、シンボルの符号長とも称する。なお、符号長決定部322は、複数のシンボルの各々の符号長を決定する際に、符号長の上限値の制約を考慮しない。符号長決定部322の具体的な動作は、
図4を参照して後述する。
【0044】
符号長上限違反修正部323は、符号長の上限値の制約があって、符号長テーブル42に示される複数のシンボルが、上限値を超えた符号長に関連付けられたシンボルを含む場合、そのシンボルの符号長を上限値に変更(修正)する。また、符号長上限違反修正部323は、符号長テーブル42に示される複数のシンボルの内、上限値未満である符号長に関連付けられた1つ以上のシンボルから、関連付けられた符号長が長いものから順に、少なくとも1つのシンボルを選択する。符号長上限違反修正部323は、選択した少なくとも1つのシンボルに関連付けられた符号長を上限値に変更する。
【0045】
そして、符号長上限違反修正部323は、修正した符号長を含む符号長テーブル42をカノニカルハフマン処理部324に送出する。また、符号長上限違反修正部323は、修正した符号長を含む符号長テーブル42に示される符号長を、特定のシンボル順にパック処理部22に送出する。特定のシンボル順は、例えば、対応するシンボルのアルファベット順に従う順序である。
【0046】
なお、符号長上限違反修正部323は、符号長決定部322によって生成された符号長テーブル42に、上限値を超えた符号長が含まれていない場合、その符号長テーブル42をそのままカノニカルハフマン処理部324に送出する。また、符号長上限違反修正部323は、その符号長テーブル42に示されるシンボルの符号長を、特定のシンボル順にパック処理部22に送出する。
【0047】
符号長上限違反修正部323は、例えば、符号長ソート部351、符号長クリップ部352、符号長変更部353、クラフト不等式左辺計算部354、終了判定部355、および冗長リーフ除去部356を備える。これら各部の動作については、
図8および
図9を参照して後述する。
【0048】
カノニカルハフマン処理部324は、符号長上限違反修正部323によって修正された符号長を含む符号長テーブル42を用いて、例えばカノニカルハフマン方式により符号化テーブル43を生成する。修正された符号長を含む符号長テーブル42は、例えば、上限値を超えた値から上限値に変更された符号長と、上限値未満の値から上限値に変更された符号長とを少なくとも含み得る。また、カノニカルハフマン方式は、シンボルの符号長のみを用いて、シンボルに割り当てる符号ビット列(可変長符号)を決定可能な方式である。カノニカルハフマン処理部324は、生成した符号化テーブル43を符号化部33に送出する。カノニカルハフマン処理部324の具体的な動作については、
図18および
図19を参照して後述する。
【0049】
符号化部33は、カノニカルハフマン処理部324によって送出された符号化テーブル43を用いて、ディレイバッファ31によって送出されたシンボルを、可変長符号(符号ビット列)に変換する。符号化部33は、変換により得られた可変長符号をパック処理部22に送出する。
【0050】
以上の構成により、動的ハフマン符号化器21は、入力されたシンボルを動的ハフマン符号化して、可変長符号に変換できる。
【0051】
ここで、符号化テーブル生成部32内の、符号長決定部322、符号長上限違反修正部323、およびカノニカルハフマン処理部324のそれぞれの動作について具体的に説明する。
【0052】
図4は、符号長決定部322によって実行される符号長決定処理の手順の例を示すフローチャートである。符号長決定処理は、頻度テーブル41を用いて、複数のシンボルそれぞれの符号長を決定するための処理である。符号長決定部322は、例えば、特定単位の入力データに含まれる複数のシンボルに対応する頻度テーブル41が生成されたことに応じて、符号長決定処理を実行する。
【0053】
まず、符号長決定部322は、頻度テーブル41において出現頻度が0より高い全てのシンボルを、ハフマン木上のリーフノードとして追加する(ステップS11)。つまり、符号長決定部322は、頻度テーブル41内の出現頻度が0より高いシンボルの数に相当するリーフノードを含むハフマン木を生成する。
【0054】
次いで、符号長決定部322は、ハフマン木において、親ノードを持たない全てのリーフノードおよび中間ノードから、出現頻度が最も低いノードAと、次に低いノードBを選択する(ステップS12)。符号長決定部322は、選択したノードAとノードBを子として持つ中間ノードをハフマン木に追加する(ステップS13)。そして、符号長決定部322は、追加した中間ノードの出現頻度として、ノードAとノードBの出現頻度の和を設定する(ステップS14)。
【0055】
符号長決定部322は、ハフマン木に、親ノードを持たないリーフノードと中間ノードが合わせて2つ以上存在しているか否かを判定する(ステップS15)。ハフマン木に、親ノードを持たないリーフノードと中間ノードが合わせて2つ以上存在している場合(ステップS15のYES)、符号長決定部322による処理はステップS12に進む。つまり、符号長決定部322は、親ノードを持たないリーフノードおよび中間ノードを子として持つ中間ノードを追加するための手順をさらに行う。
【0056】
ハフマン木に、親ノードを持たないリーフノードと中間ノードが合わせて2つ未満である場合(ステップS15のNO)、符号長決定部322は符号長決定処理を終了する。
【0057】
以上の符号長決定処理によって、符号長決定部322はハフマン木を構築できる。構築したハフマン木は、出現頻度が1以上である複数のシンボルにそれぞれ対応する複数のリーフノードを含む。符号長決定部322は、出現頻度が低いシンボルに対応するリーフノードからボトムアップにハフマン木を構築する。符号長決定部322は、構築したハフマン木を用いて、複数のシンボルそれぞれの符号長を決定できる。ルートノードを起点とするリーフノードの深さは、対応するシンボルの符号長に相当する。よって、符号長決定部322はハフマン木を用いて、シンボルの符号長を決定できる。
【0058】
図5から
図7を参照して、頻度テーブル41を用いて符号長テーブル42が生成される具体的な例を説明する。
【0059】
図5は、頻度テーブル生成部321によって生成される頻度テーブル41の構成例を示す。頻度テーブル41は、複数のシンボルにそれぞれ対応する複数のエントリを含む。複数のエントリの各々は、例えば、シンボルフィールドと出現頻度フィールドとを含む。
【0060】
シンボルフィールドは、対応するシンボルを示す。
出現頻度フィールドは、対応するシンボルの出現頻度を示す。より具体的には、出現頻度フィールドは、例えば、処理対象の入力データにおいて、対応するシンボルが出現した回数を示す。
【0061】
なお、以下では、シンボルフィールドに示される値を、単に、シンボルとも称する。頻度テーブル41の他の各フィールドに示される値、および他のテーブルの各フィールドに示される値についても同様である。
【0062】
図5に示す例では、シンボル“a”の出現頻度は120である。シンボル“b”の出現頻度は60である。シンボル“c”の出現頻度は29である。シンボル“d”の出現頻度は14である。シンボル“e”の出現頻度は4である。シンボル“f”およびシンボル“g”の出現頻度は3である。シンボル“h”の出現頻度は2である。シンボル“i”およびシンボル“j”の出現頻度は0である。
【0063】
図6は、符号長決定部322によって生成されるハフマン木50の例を示す。ここでは、符号長決定部322が、
図5に示した頻度テーブル41を用いてハフマン木50を生成する場合について例示する。
【0064】
まず、符号長決定部322は頻度テーブル41から、出現頻度が0より高い8つのシンボル“a”,“b”,“c”,“d”,“e”,“f”,“g”,“h”を選択する。符号長決定部322は、選択した8つのシンボルをそれぞれ割り当てる8つのリーフノード511,521,531,541,561,562,563,564を含むハフマン木50を生成する。各リーフノードには、対応するシンボルの出現頻度が設定される。以下では、リーフノードを割り当てたシンボルの集合(すなわち出現頻度が0より高いシンボルの集合)を、シンボルの集合Sとも称する。
【0065】
符号長決定部322は、ハフマン木50の親ノードを持たない全リーフノードおよび全中間ノードから、出現頻度が最も低いシンボル“h”のリーフノード564と、次に低いシンボル“g”のリーフノード563とを選択する。そして、符号長決定部322は、選択したリーフノード564とリーフノード563とを子として持つ中間ノード552を、ハフマン木50に追加する。符号長決定部322は、中間ノード552の出現頻度として、リーフノード564の出現頻度とリーフノード563の出現頻度の和(=2+3=5)を設定する。
【0066】
次に、符号長決定部322は、ハフマン木50の親ノードを持たない全リーフノードおよび全中間ノードから、出現頻度が最も低いシンボル“f”のリーフノード562と、次に低いシンボル“e”のリーフノード561とを選択する。そして、符号長決定部322は、選択したリーフノード562とリーフノード561とを子として持つ中間ノード551を、ハフマン木50に追加する。符号長決定部322は、追加した中間ノード551の出現頻度として、リーフノード562の出現頻度とリーフノード561の出現頻度の和(=3+4=7)を設定する。
【0067】
次いで、符号長決定部322は、ハフマン木50の親ノードを持たない全リーフノードおよび全中間ノードから、出現頻度が最も低い中間ノード552と、次に低い中間ノード551とを選択する。そして、符号長決定部322は、選択した中間ノード552と中間ノード551とを子として持つ中間ノード542を、ハフマン木50に追加する。符号長決定部322は、追加した中間ノード542の出現頻度として、中間ノード552の出現頻度と中間ノード551の出現頻度の和(=5+7=12)を設定する。
【0068】
同様にして、符号長決定部322は、ハフマン木50において、親ノードを持たないリーフノードと中間ノードが合わせて1つ以下になるまで(すなわち、親ノードを持たないノードがルートノード501のみになるまで)、中間ノードを追加する動作を繰り返し行う。これにより、
図6に示すハフマン木50を構築できる。
【0069】
符号長決定部322は、構築したハフマン木50を用いて符号長テーブル42を生成する。符号長テーブル42は、複数のシンボルと、複数のシンボルにそれぞれ関連付けられた複数の符号長とを管理するためのテーブルである。
【0070】
具体的には、符号長決定部322は、構築したハフマン木50を用いて、8つのシンボル“a”,“b”,“c”,“d”,“e”,“f”,“g”,“h”の各々の符号長を決定する。1つのシンボルに対応するリーフノードの、ルートノード501を起点とする深さは、そのシンボルの符号長を示す。例えば、シンボル“a”のリーフノード511の、ルートノード501を起点とする深さは1である。よって、シンボル“a”の符号長は、1ビットである。また例えば、シンボル“h”のリーフノード564の、ルートノード501を起点とする深さは6である。よって、シンボル“h”の符号長は、6ビットである。
【0071】
図7は、符号長決定部322によって生成される符号長テーブル42の構成例を示す。符号長テーブル42は、複数のシンボルにそれぞれ対応する複数のエントリを含む。複数のエントリの各々は、例えば、シンボルフィールドと符号長フィールドとを含む。
【0072】
シンボルフィールドは、対応するシンボルを示す。
符号長フィールドは、対応するシンボルに対して、符号長決定部322によって決定された符号長を示す。符号長は、前述した通り、ハフマン木50における、対応するシンボルのリーフノードの、ルートノード501を起点とする深さに基づき決定される。以下では、符号長決定部322によって決定された符号長を、制約前符号長と称することがある。つまり、制約前符号長は、シンボルの出現頻度に基づき、符号長の上限値の制約を考慮せずに決定された符号長である。
【0073】
図7では、
図6に示したハフマン木50を用いて生成された符号長テーブル42を例示している。具体的には、符号長テーブル42は、シンボル“a”の符号長(制約前符号長)が1ビットであることを示している。符号長テーブル42は、シンボル“b”の符号長が2ビットであることを示している。符号長テーブル42は、シンボル“c”の符号長が3ビットであることを示している。符号長テーブル42は、シンボル“d”の符号長が4ビットであることを示している。また、符号長テーブル42は、シンボル“e”,“f”,“g”,“h”のそれぞれの符号長が6ビットであることを示している。
【0074】
次いで、符号長上限違反修正部323の具体的な動作例について説明する。符号長上限違反修正部323は、符号長決定部322によって生成された符号長テーブル42を用いて、上限値を超えた符号長を、上限値以下に修正する。
【0075】
図8は、符号長上限違反修正部323によって実行される上限違反修正処理の手順の例を示すフローチャートである。上限違反修正処理は、シンボルに関連付けられる符号長の上限値が設定されている場合に、上限値を超えた符号長を、上限値以下に修正するための処理である。符号長上限違反修正部323は、例えば
図4に示した符号長決定処理の実行が完了した後に、上限違反修正処理の実行を開始する。
【0076】
まず、符号長上限違反修正部323の符号長ソート部351は、符号長テーブル42内のエントリを符号長でソートする(ステップS21)。符号長ソート部351は、符号長テーブル42内のエントリを、例えば、符号長の昇順にソートする。そして、符号長クリップ部352は、符号長テーブル42において、上限値を超えている全てのシンボルの符号長を上限値に変更する(ステップS22)。
【0077】
次いで、符号長変更部353は、符号長テーブル42において、符号長が長いシンボルから順に、符号長が上限値よりも小さいM個のシンボルを選択する(ステップS23)。なお、Mは1以上の整数である。符号長変更部353は、符号長テーブル42において、選択したM個のシンボルの符号長を並列に上限値に変更する(ステップS24)。このように、Mは、符号長を並列に変更するシンボルの数を示す。Mが大きいほど、一度に符号長を上限値に変更するシンボルの数が増える。以下では、Mを、並列度とも称する。
【0078】
クラフト不等式左辺計算部354は、変更した符号長を含むシンボルの集合Sの符号長を用いて、クラフト不等式の左辺の値Kを計算する(ステップS25)。クラフト不等式は、以下の式(1)で表される。
【0079】
【数1】
なお、sは、シンボルの集合Sに属するシンボルを示す。l(s)は、シンボルsに関連付けられた符号長を示す。
【0080】
シンボルの集合Sと各シンボルs∈Sの符号長l(s)がクラフト不等式を満たす場合、有効な符号化テーブル43が存在することが保証される。つまり、各シンボルs∈Sの符号長l(s)に基づき生成された符号化テーブル43を用いて、正しく符号化および復号を行うことができる。
【0081】
これに対して、シンボルの集合Sと各シンボルs∈Sの符号長l(s)がクラフト不等式を満たさない場合、有効な符号化テーブル43が存在しない。よって、各シンボルs∈Sの符号長l(s)に基づき生成された符号化テーブル43を用いて、正しく符号化および復号を行うことができない。
【0082】
終了判定部355は、計算したクラフト不等式の左辺の値Kが1以下であるか否かを判定する(ステップS26)。つまり、終了判定部355は、現在の符号長テーブル42に示されるシンボルの集合Sに含まれる複数のシンボルsの符号長l(s)が、クラフト不等式を満たしているか否かを判定する。
【0083】
クラフト不等式の左辺の値Kが1より大きい場合(ステップS26のNO)、符号長上限違反修正部323による処理はステップS23に戻る。つまり、符号長変更部353およびクラフト不等式左辺計算部354は、関連付けられた符号長が長いものから順に、まだ選択されていない、上限値より小さい符号長のM個のシンボルを選択し、選択したM個のシンボルの符号長を上限値に変更し、クラフト不等式の左辺の値Kを計算する処理を、符号長テーブル42に示されるシンボルの集合Sに含まれる複数のシンボルsの符号長l(s)が、クラフト不等式を満たすまで(すなわち、クラフト不等式の左辺の値が1以下になるまで)、繰り返し行う。
【0084】
なお、前述した通り、Mが大きいほど、一度に符号長を上限値に変更するシンボルの数は増える。したがって、Mを2以上に設定することで、Mが1である場合よりも、クラフト不等式を満たすまでのサイクル数を低減し得る。ここで、サイクル数は、ステップS23からステップS25までの手順を1回実行することを1サイクルとして、1サイクルの処理が実行される回数を指す。符号長上限違反修正部323は、例えば、圧縮装置15に要求されるレイテンシの上限を満たすように、Mの値を設定し得る。
【0085】
クラフト不等式の左辺の値Kが1以下である場合(ステップS26のYES)、冗長リーフ除去部356は冗長リーフ除去処理を実行し(ステップS27)、上限違反修正処理を終了する。冗長リーフ除去処理は、上限値よりも小さい符号長を上限値に変更したことによって発生した冗長なリーフノードを、ハフマン木50から除去するための処理である。冗長リーフ除去処理の具体的な手順については、
図9のフローチャートを参照して後述する。
【0086】
以上の上限違反修正処理により、符号長上限違反修正部323は、シンボルに関連付けられた上限値を超えた符号長を、上限値に変更できる。この変更により、符号長テーブル42に示されるシンボルの集合Sに含まれる複数のシンボルsの符号長l(s)は、クラフト不等式を満たさなくなる。そのため、符号長上限違反修正部323はさらに、符号長が上限値よりも小さいM個のシンボルを選択し、選択したM個のシンボルの符号長を上限値に変更する処理を、クラフト不等式を満たすまで繰り返し行う。これにより、符号長上限違反修正部323は、上限値以下であって、クラフト不等式を満たす符号長に関連付けられたシンボルの集合Sを含む符号長テーブル42を取得できる。
【0087】
図9は、冗長リーフ除去部356によって実行される冗長リーフ除去処理の手順の例を示すフローチャートである。冗長リーフ除去処理は、
図8を参照して前述した上限違反修正処理のステップS27に相当する。
【0088】
まず、冗長リーフ除去部356は、クラフト不等式の左辺の値Kが1未満であるか否かを判定する(ステップS301)。なお、このクラフト不等式の左辺の値Kは、冗長リーフ除去処理を実行する直前に、
図8を参照して前述した上限違反修正処理のステップS25で、クラフト不等式左辺計算部354によって計算された値である。したがって、このクラフト不等式の左辺の値Kは、1以下である。
【0089】
クラフト不等式の左辺の値Kが1未満でない場合(ステップS301のNO)、すなわち1である場合、冗長リーフ除去部356は冗長リーフ除去処理を終了する。つまり、冗長リーフ除去部356は、クラフト不等式の左辺の値Kが1である場合、ハフマン木50に冗長なリーフノードが存在していないと判断する。よって、冗長リーフ除去部356は冗長リーフ除去処理を終了する。
【0090】
クラフト不等式の左辺の値Kが1未満である場合(ステップS301のYES)、冗長リーフ除去部356は、制約前符号長が上限値未満であって、且つ符号長を上限値に変更したシンボル群を、制約前符号長が短い順に取得する(ステップS302)。冗長リーフ除去部356は、クラフト不等式の左辺の値Kが1未満である場合、ハフマン木50に冗長なリーフノードが存在していると判断する。冗長リーフ除去部356は変数iに1を設定する(ステップS303)。変数iは、取得したシンボル群に含まれる1つのシンボルを特定するために用いられる。
【0091】
次いで、冗長リーフ除去部356は、取得したシンボル群から、i番目のシンボルsを選択する(ステップS304)。冗長リーフ除去部356は、シンボルsの符号長を1ビット減少させる(ステップS305)。冗長リーフ除去部356は、変更した符号長を含むシンボルの集合Sの符号長を用いて、クラフト不等式の左辺の値Kを計算する(ステップS306)。なお、このクラフト不等式の左辺の値Kは、クラフト不等式左辺計算部354によって計算されてもよい。そして、冗長リーフ除去部356は、計算したクラフト不等式の左辺の値Kが1以下であるか否かを判定する(ステップS307)。つまり、冗長リーフ除去部356は、変更した符号長を含むシンボルの集合Sの符号長が、クラフト不等式を満たしているか否かを判定する。
【0092】
クラフト不等式の左辺の値Kが1より大きい場合(ステップS307のNO)、冗長リーフ除去部356は、シンボルsの符号長を1ビット増加させる(ステップS308)。つまり、冗長リーフ除去部356は、ステップS305でシンボルsの符号長を1ビット減少させたことによって、シンボルの集合Sの符号長がクラフト不等式を満たさなくなったと判断する。そのため、冗長リーフ除去部356は、シンボルsの符号長を元に戻す。そして、冗長リーフ除去部356は変数iに1を加え(ステップS309)、冗長リーフ除去部356による処理はステップS304に進む。これにより、冗長リーフ除去部356は、ステップS302で取得したシンボル群から、後続する別のシンボルを選択し、その別のシンボルの符号長を減少させるための処理を行う。
【0093】
クラフト不等式の左辺の値Kが1以下である場合(ステップS307のYES)、冗長リーフ除去部356は、クラフト不等式の左辺の値Kが1未満であるか否かを判定する(ステップS310)。
【0094】
クラフト不等式の左辺の値Kが1未満である場合(ステップS310のYES)、冗長リーフ除去部356による処理はステップS305に進む。これにより、シンボルsの符号長をさらに減少させるための処理が行われる。つまり、冗長リーフ除去部356は、クラフト不等式の左辺の値Kが1未満である場合、ハフマン木50に冗長なリーフノードが存在していると判断して、シンボルsの符号長をさらに減少させるための処理を行う。
【0095】
クラフト不等式の左辺の値Kが1未満でない場合(ステップS310のNO)、すなわち1である場合、冗長リーフ除去部356は冗長リーフ除去処理を終了する。つまり、冗長リーフ除去部356は、クラフト不等式の左辺の値Kが1である場合、ハフマン木50に冗長なリーフノードが存在していないと判断して、冗長リーフ除去処理を終了する。
【0096】
以上の冗長リーフ除去処理により、冗長リーフ除去部356は、上限違反修正処理において上限値よりも小さい符号長を上限値に変更したことによって発生した冗長なリーフノードを、ハフマン木50から除去できる。より具体的には、冗長リーフ除去部356は、クラフト不等式の左辺の値Kが1になるまで、制約前符号長が上限値未満であったシンボルの符号長を1ビットずつ減少させる処理を繰り返し行い得る。これにより、符号長上限違反修正部323は、クラフト不等式の左辺の値Kが1である符号長テーブル42を取得できる。
【0097】
図10から
図13を参照して、
図6のハフマン木50の変形例により、符号長上限違反修正部323がシンボルの集合Sの符号長を上限値に制約する動作を説明する。
図6のハフマン木50は、符号長決定部322が、シンボルの出現頻度に基づき、符号長の上限値を考慮することなく構築したハフマン木である。符号長上限違反修正部323は、符号長の上限値の制約とクラフト不等式とを満たすように、
図6のハフマン木50を変形する。ここでは、符号長の上限値が4であるものとする。また、説明を分かりやすくするために、並列度Mが1であるものとする。
【0098】
図10は、符号長上限違反修正部323が、符号長が上限値を超えているシンボルと、符号長を上限値まで伸ばすシンボルとを決定する例を示す。
【0099】
具体的には、符号長上限違反修正部323は、符号長が4を超えている4つのシンボル“e”,“f”,“g”,“h”(すなわち、リーフノード561,562,563,564)を決定する。符号長上限違反修正部323は、決定した4つのシンボル“e”,“f”,“g”,“h”の符号長を、6ビットから4ビットに変更する。
【0100】
また、符号長上限違反修正部323は、符号長が4ビット未満であるシンボルの内、最も長い符号長のシンボル“c”(すなわち、リーフノード531)を決定する。符号長上限違反修正部323は、決定したシンボル“c”の符号長を3ビットから4ビットに変更する。
【0101】
図11は、前述した変更により、4つのシンボル“e”,“f”,“g”,“h”の符号長と、シンボル“c”の符号長とが変更されたハフマン木50を示す。
【0102】
シンボル“c”の符号長を3ビットから4ビットに変更したことにより、ノード531はリーフノードから中間ノードに変更され、中間ノード531を親ノードとする2つのリーフノード543,544がハフマン木50に追加されている。リーフノード543には、シンボル“c”が割り当てられている。リーフノード544には、シンボル“e”が割り当てられている。
【0103】
また、ハフマン木50では、4つのシンボル“e”,“f”,“g”,“h”の符号長を6ビットから4ビットに変更したことにより、中間ノード532を親ノードとする4つのリーフノード541,545,546,542が生じている。よって、このハフマン木50は無効なハフマン木である。したがって、このハフマン木50に基づいて決定されるハフマン符号は、クラフト不等式を満たさない(すなわち、K>1である)無効なハフマン符号となる。
【0104】
そのため、符号長上限違反修正部323は、符号長を上限値まで伸ばすリーフノードをさらに決定する。具体的には、符号長上限違反修正部323は、符号長が4未満であるシンボルの内、最も長い符号長のシンボル“b”(すなわち、リーフノード521)を決定する。符号長上限違反修正部323は、決定したシンボル“b”の符号長を2ビットから4ビットに変更する。
【0105】
図12は、シンボル“b”の符号長が変更されたハフマン木50を示す。
【0106】
シンボル“b”の符号長を2ビットから4ビットに変更したことにより、ノード521はリーフノードから中間ノードに変更され、中間ノード531を親ノードとする2つの中間ノード533,534と、中間ノード533を親ノードとする2つのリーフノード547,548と、中間ノード534を親ノードとする2つのリーフノード545,546とがハフマン木50に追加されている。このハフマン木50は有効なハフマン木50である。したがって、このハフマン木50に基づいて決定されるハフマン符号は、クラフト不等式を満たす(すなわち、K<1である)有効なハフマン符号となる。
【0107】
符号長上限違反修正部323は、さらに、いずれのシンボルも割り当てられていない冗長なリーフノード548を除去する。
【0108】
図13は、冗長なリーフノード548が除去されたハフマン木50を示す。
冗長なリーフノード548と、リーフノード547と、中間ノード533とからなる二分木は、マージされ、リーフノード533となる。リーフノード533には、リーフノード547に割り当てられていたシンボル“b”が割り当てられる。つまり、シンボル“b”の符号長は、1ビット減少して、4ビットから3ビットになる。
【0109】
このハフマン木50は有効なハフマン木50である。したがって、このハフマン木50に基づいて決定されるハフマン符号は、クラフト不等式を満たし、且つ冗長な符号割り当てのない(すなわち、K=1である)有効なハフマン符号となる。
【0110】
次いで、
図14から
図17を参照して、符号長テーブル42の変更例により、符号長上限違反修正部323が符号長を上限値に制約する動作を説明する。
図14から
図17に示す符号長テーブル42は、符号長決定部322によって決定された制約前符号長に加えて、符号長上限違反修正部323によって決定(修正)された符号長も管理する。以下では、符号長上限違反修正部323によって決定された符号長を、制約後符号長と称することがある。制約後符号長は、シンボルの出現頻度と、符号長の上限値の制約とに基づいて決定された符号長である。
【0111】
図14は、符号長上限違反修正部323による符号長テーブル42の変更例を示す。符号長テーブル42の各エントリは、シンボルフィールド、制約前符号長フィールド、および制約後符号長フィールドを含む。
【0112】
シンボルフィールドは、対応するシンボルを示す。制約前符号長フィールドは、対応するシンボルの制約前符号長(すなわち、符号長決定部322によって決定された符号長)を示す。制約後符号長フィールドは、対応するシンボルの制約後符号長を示す。制約後符号長は、対応するシンボルの制約前符号長であるか、あるいは符号長上限違反修正部323によって制約前符号長から変更された符号長である。
【0113】
図14に示す例において、シンボルフィールドに設定されている値は、
図7に示した符号長テーブル42のシンボルフィールドに設定されている値と同一である。また、
図14に示す例において、制約前符号長フィールドに設定されている値は、
図7に示した符号長テーブル42の制約前符号長フィールドに設定されている値と同一である。
【0114】
符号長上限違反修正部323は、制約後符号長フィールドの初期値として、例えば、対応するシンボルの制約前符号長を設定する。そして、符号長上限違反修正部323は、制約後符号長フィールドに示される符号長が上限値を超えている場合、その符号長を上限値に変更する。
【0115】
図14に示す例では、上限値は4ビットである。この場合、符号長上限違反修正部323は、制約前符号長が上限値を超えている4つのシンボル“e”,“f”,“g”,“h”を特定する。そして、符号長上限違反修正部323は、特定した4つのシンボルそれぞれの制約後符号長を6ビットから4ビットに変更する。なお、制約前符号長が上限値を超えていない4つのシンボル“a”,“b”,“c”,“d”のそれぞれの制約後符号長は、制約前符号長と一致している。
【0116】
符号長テーブル42に示されるシンボルの集合Sの制約後符号長は、クラフト不等式を満たしていない。シンボルの集合Sは、符号長テーブル42に示される8つのシンボル“a”,“b”,“c”,“d”,“e”,“f”,“g”,“h”である。シンボルの集合Sの制約後符号長は、符号長テーブル42に示される8つのシンボル“a”,“b”,“c”,“d”,“e”,“f”,“g”,“h”にそれぞれ関連付けられた8つの制約後符号長である。したがって、符号長テーブル42に示される8つのシンボル“a”,“b”,“c”,“d”,“e”,“f”,“g”,“h”にそれぞれ関連付けられた8つの制約後符号長は、クラフト不等式を満たしていない(すなわち、K>1である)。そのため、符号長上限違反修正部323は、制約後符号長が上限値未満であるシンボルから、制約後符号長を伸ばすシンボルを選択する。
【0117】
図15は、符号長上限違反修正部323が、制約後符号長が上限値未満であるシンボルから、制約後符号長を伸ばすシンボルを選択し、選択したシンボルの制約後符号長を上限値に変更する例を示す。
【0118】
符号長上限違反修正部323は、制約後符号長が上限値未満であるシンボルの内、制約後符号長が長いものから順にM個のシンボルを選択する。なお、ここでは、説明を分かりやすくするために、Mが1である場合について例示する。よって、符号長上限違反修正部323は、制約後符号長が4ビット未満であるシンボルの内、制約後符号長が最も長いシンボル“c”を選択する。
【0119】
符号長上限違反修正部323は、選択したシンボル“c”の制約後符号長を、3ビットから4ビットに変更する。そして、符号長上限違反修正部323は、シンボルの集合Sの制約後符号長を用いてクラフト不等式の左辺の値Kを計算する。符号長上限違反修正部323は、クラフト不等式の左辺の値Kが1より大きいので、シンボルの集合Sの制約後符号長がクラフト不等式を満たしていないと判断する。そのため、符号長上限違反修正部323はさらに、制約後符号長が上限値未満であるシンボルの内、制約後符号長が長いものから順にM個のシンボルを選択し、選択したシンボルの制約後符号長を上限値に変更する。
【0120】
図16は、符号長上限違反修正部323が、さらに、制約後符号長が上限値未満であるシンボルから、制約後符号長を伸ばすシンボルを選択し、選択したシンボルの制約後符号長を上限値に変更する例を示す。
【0121】
具体的には、符号長上限違反修正部323は、制約後符号長が4未満であるシンボルの内、制約後符号長が最も長いシンボル“b”を選択する。符号長上限違反修正部323は、選択したシンボル“b”の制約後符号長を、2ビットから4ビットに変更する。そして、符号長上限違反修正部323は、シンボルの集合Sの制約後符号長を用いてクラフト不等式の左辺の値Kを計算する。符号長上限違反修正部323は、クラフト不等式の左辺の値Kが1以下であるので、シンボルの集合Sの制約後符号長がクラフト不等式を満たしていると判断する。
【0122】
次いで、符号長上限違反修正部323は、冗長に増加している制約後符号長を減少させる動作を行う。
【0123】
図17は、符号長上限違反修正部323が、冗長に増加している制約後符号長を減少させる例を示す。
【0124】
符号長上限違反修正部323は、制約前符号長が上限値未満であって、且つ制約後符号長が上限値に変更されたシンボルから、制約前符号長が短い順に、シンボルを1つずつ選択する。具体的には、符号長上限違反修正部323は、まず、符号長上限違反修正部323は、制約前符号長が上限値未満であって、且つ制約後符号長が上限値に変更された2つのシンボル“b”および“c”から、制約前符号長が最も短いシンボル“b”を選択する。符号長上限違反修正部323は、選択したシンボル“b”の制約後符号長を1ビット減少させて、4ビットから3ビットに変更する。
【0125】
そして、符号長上限違反修正部323は、シンボルの集合Sの制約後符号長を用いて、クラフト不等式の左辺の値Kを計算する。そして、符号長上限違反修正部323は、計算したクラフト不等式の左辺の値Kが1であるので、制約後符号長の変更を終了する。
【0126】
なお、もし、計算したクラフト不等式の左辺の値Kが1より大きいならば、符号長上限違反修正部323は、シンボル“b”の制約後符号長を元に戻し、別のシンボル(例えばシンボル“c”)の制約後符号長を1ビット減少させる。より具体的には、シンボル“b”の制約後符号長を1ビット増加させて、3ビットから4ビットに戻す。そして、符号長上限違反修正部323は、制約前符号長が上限値未満であって、且つ制約後符号長が上限値に変更された別のシンボル(例えばシンボル“c”)の制約後符号長を1ビット減少させる。そして、符号長上限違反修正部323は、シンボルの集合Sの制約後符号長を用いて、クラフト不等式の左辺の値Kを再度計算する。符号長上限違反修正部323は、計算したクラフト不等式の左辺の値Kが1である場合、制約後符号長の変更を終了する。
【0127】
また、もし、計算したクラフト不等式の左辺の値Kが1より小さいならば、符号長上限違反修正部323は、シンボル“b”の制約後符号長をさらに1ビット減少させる。そして、符号長上限違反修正部323は、シンボルの集合Sの制約後符号長を用いて、クラフト不等式の左辺の値Kを再度計算する。符号長上限違反修正部323は、計算したクラフト不等式の左辺の値Kが1である場合、制約後符号長の変更を終了する。
【0128】
このように、符号長上限違反修正部323は、制約前符号長が上限値未満であって、且つ制約後符号長が上限値に変更されたシンボルを、制約前符号長が短い順に1つずつ、制約後符号長を1ビット減少させて、クラフト不等式の左辺の値Kが1になったかどうかを判定する動作を繰り返し行う。また、1つのシンボルの制約後符号長を1ビット減少させた場合に、クラフト不等式の左辺の値Kが1より小さい場合、符号長上限違反修正部323は、そのシンボルの制約後符号長をさらに1ビット減少させる。
【0129】
クラフト不等式の左辺の値Kが1である場合、シンボルの集合Sの制約後符号長に基づいて決定されるハフマン符号は、クラフト不等式を満たし、且つ冗長な符号割り当てのない有効なハフマン符号となる。つまり、
図17に示すシンボルの集合Sの制約後符号長は、クラフト不等式を満たし、且つ冗長なリーフノードがない
図13のハフマン木50に相当する。
【0130】
符号長上限違反修正部323(より詳しくは、冗長リーフ除去部356)は、符号長テーブル42をカノニカルハフマン処理部324に送出する。具体的には、符号長上限違反修正部323は、符号長テーブル42に示される複数のシンボルと、複数のシンボルにそれぞれ関連付けられた複数の制約後符号長とを、カノニカルハフマン処理部324に送出する。
【0131】
また、符号長上限違反修正部323は、複数の制約後符号長を特定のシンボル順にパック処理部22に送出する。特定のシンボル順は、例えば、対応する複数のシンボルのアルファベット順に従う順序である。つまり、符号長上限違反修正部323は、複数のシンボルのアルファベット順に従って、対応する制約後符号長を順にパック処理部22に送出する。
【0132】
カノニカルハフマン処理部324は、符号長上限違反修正部323によって送出された符号長テーブル42を用いて、カノニカルハフマン方式により、符号化テーブル43を生成する。符号化テーブル43は、符号長上限違反修正部323によって修正された符号長を含み得る。カノニカルハフマン方式は、シンボルの符号長のみを用いて、シンボルに割り当てる符号ビット列(可変長符号)を決定可能な方式である。カノニカルハフマン方式では、以下の規則(1)および(2)に従って、シンボルに符号ビット列を割り当てる。
【0133】
(1)符号長が短いシンボルに割り当てる符号ビット列は、符号長が長いシンボルに割り当てる符号ビット列に対して、辞書順で先行する。
(2)符号長が等しい任意の2つのシンボルにおいて、シンボル順序で先行するシンボルに割り当てる符号ビット列は、シンボル順序で後続するシンボルに割り当てる符号ビット列に対して、辞書順で先行する。
【0134】
例えば、符号ビット列の辞書順を決定するために、ビット値“0”および“1”の辞書順を、“0”,“1”の順序と定義する。この場合、複数の符号ビット列に含まれる対応するビット値の順序(ビット順序)を、上位ビットから順に比較することによって、これら複数の符号ビット列の辞書順を決定できる。
【0135】
より具体的には、例えば、“1’b0”,“2’b10”,“3’b110”,“3’b111”は、辞書順に並んだ4つの符号ビット列である。なお、“X’b”に後続する0または1のビット値のデータ列は、Xビットのビットデータ列を示している。したがって、これら4つの符号ビット列において、1ビットの符号ビット列“1’b0”は、2ビットの符号ビット列“2’b10”に対して、最上位ビットのビット順序が先行する。2ビットの符号ビット列“2’b10”は、3ビットの符号ビット列“3’b110”に対して、最上位の次のビットのビット順序が先行している。3ビットの符号ビット列“3’b110”は、3ビットの符号ビット列“3’b111”に対して、最下位ビットのビット順序が先行する。
【0136】
図18は、カノニカルハフマン処理部324がシンボルに符号ビット列を割り当てるための疑似プログラムの例を示す。疑似プログラムにおいて、変数codeは、シンボルに割り当てられる符号ビット列を算出するために用いられる。
【0137】
まず、カノニカルハフマン処理部324は、codeに0(=1’b0)を設定する。なお、このcodeのビット数は、符号ビット列を割り当てるべき複数のシンボルにそれぞれ関連付けられた複数の符号長の内、最小の符号長に従う。
【0138】
次いで、カノニカルハフマン処理部324は、1回のwhileループにおいて、符号長が短い順、且つ同一符号長の場合は特定のシンボル順に、1つのシンボルに割り当てる符号ビット列を決定する。
【0139】
例えば、1回目のwhileループにおいて、カノニカルハフマン処理部324は、符号長が最も短いシンボルであって、且つ同一符号長の別のシンボルがある場合には特定のシンボル順で先になるシンボルを、符号ビット列を割り当てる対象として選択する。そして、カノニカルハフマン処理部324は、選択したシンボルの符号ビット列として、code(=1’b0)を割り当てる。なお、前述した通り、最初に割り当てるcodeのビット数は最小符号長に依存する。この例では、最小符号長が1であることを想定している。そして、カノニカルハフマン処理部324は、codeに1を加えた値を、次のシンボルの符号長から現在のシンボルの符号長を引いたビット数だけ、左にシフトするシフト演算を行い、このシフト演算により得られた値をcodeに設定する。例えば、次のシンボルの符号長から現在のシンボルの符号長を引いたビット数が1である場合、code(=1’b0)に1を加えた値である1’b1を、1ビット左にシフトした値2’b10が、codeに設定される。
【0140】
また例えば、2回目のwhileループにおいて、カノニカルハフマン処理部324は、符号長が2番目に短いシンボルか、あるいは符号長が最も短いシンボルであって、且つ同一符号長の別のシンボルがある場合には特定のシンボル順で2番目になるシンボルを、符号ビット列を割り当てる対象として選択する。カノニカルハフマン処理部324は、選択したシンボルの符号ビット列として、code(=2’b10)を割り当てる。そして、カノニカルハフマン処理部324は、codeに1を加えた値を、次のシンボルの符号長から現在のシンボルの符号長を引いたビット数だけ、左にシフトするシフト演算を行い、このシフト演算により得られた値をcodeに設定する。例えば、次のシンボルの符号長から現在のシンボルの符号長を引いたビット数が1である場合、code(=2’b10)に1を加えた値である2’b11を、1ビット左にシフトした値3’b110が、codeに設定される。
【0141】
このようなループ処理を行うことにより、カノニカルハフマン処理部324は、シンボル間の順序関係と、複数のシンボルにそれぞれ対応する複数の符号長とを用いて、複数のシンボルにそれぞれ符号ビット列を割り当てることができる。つまり、カノニカルハフマン処理部324は、シンボル間の順序関係と、各シンボルの符号長とが決定されることで、各シンボルに割り当てる符号ビット列を一意に決定できる。
【0142】
これは、パック処理部22によって出力される圧縮データに、ヘッダとして、予め規定したシンボル順に従って並べられた複数の符号長を符号化することで、伸張装置16が復号テーブルを復元可能であることを示している。シンボル順に従って並べられた複数の符号長を符号化することにより、符号ビット列そのものを符号化する場合と比較して、圧縮データの符号量オーバーヘッドを大幅に削減できる。
【0143】
したがって、前述したように、符号長上限違反修正部323(より詳しくは、冗長リーフ除去部356)は、修正後の符号長テーブル42に示される複数の符号長(制約後符号長)を、対応する複数のシンボルのシンボル順に従って、パック処理部22に送出する。パック処理部22は、シンボル順に従って並べられた複数の符号長を、圧縮データの先頭にヘッダとして付加する。
【0144】
図19は、カノニカルハフマン処理部324による、シンボルへの符号ビット列の割り当ての例を示す。ここでは、
図18に示した疑似プログラムを実行するカノニカルハフマン処理部324が、
図19に示す4つのシンボル“B”、“A”、“C”、“D”に対して、符号長を用いて符号ビット列を割り当てる例について説明する。
【0145】
4つのシンボル“B”、“A”、“C”、“D”は、符号長が短い順、且つ同一符号長の複数のシンボルがある場合には特定のシンボル順(ここではアルファベット順)にソートされている。具体的には、シンボル“B”の符号長は1であり、最も短い。シンボル“A”の符号長は2であり、2番目に短い。シンボル“C”およびシンボル“D”の符号長は3であり、3番目に短い。また、シンボル“C”は、シンボル“D”よりもアルファベット順で先行する。
【0146】
まず、カノニカルハフマン処理部324は、codeに0(=1’b0)を設定する。
【0147】
次に、カノニカルハフマン処理部324は、1回目のwhileループにおいて、符号長が最も短いシンボル“B”を、符号ビット列を割り当てる対象として選択する。カノニカルハフマン処理部324は、選択したシンボル“B”の符号ビット列として、code(=1’b0)を割り当てる。最初に割り当てるcodeのビット数は、4つのシンボル“B”、“A”、“C”、“D”の符号長の内、最小の符号長(すなわち、シンボル“B”の符号長)に従う。よって、このcodeのビット数は1である。そして、カノニカルハフマン処理部324は、codeに1を加えた値を、次のシンボル“A”の符号長から現在のシンボル“B”の符号長を引いた1ビット(=2-1)だけ、左にシフトするシフト演算を行い、このシフト演算により得られた値2’b10をcodeに設定する。
【0148】
2回目のwhileループにおいて、カノニカルハフマン処理部324は、符号長が2番目に短いシンボル“A”を、符号ビット列を割り当てる対象として選択する。カノニカルハフマン処理部324は、選択したシンボル“A”の符号ビット列として、code(=2’b10)を割り当てる。そして、カノニカルハフマン処理部324は、codeに1を加えた値を、次のシンボル“C”の符号長から現在のシンボルの符号長“A”を引いた1ビット(=3-2)だけ、左にシフトするシフト演算を行い、このシフト演算により得られた値3’b110をcodeに設定する。
【0149】
3回目のwhileループにおいて、カノニカルハフマン処理部324は、符号長が3番目に短く、同一符号長のシンボル“D”よりも特定のシンボル順で先になるシンボル“C”を、符号ビット列を割り当てる対象として選択する。カノニカルハフマン処理部324は、選択したシンボル“C”の符号ビット列として、code(=3’b110)を割り当てる。そして、カノニカルハフマン処理部324は、codeに1を加えた値を、次のシンボル“D”の符号長から現在のシンボルの符号長“C”を引いた0ビット(=3-3)だけ、左にシフトするシフト演算を行い、このシフト演算により得られた値3’b111をcodeに設定する。つまり、カノニカルハフマン処理部324は、2つのシンボル“C”および“D”の符号長が同一である場合には、codeに1を加えた値を、新たなcodeの値として設定する。
【0150】
4回目のwhileループにおいて、カノニカルハフマン処理部324は、符号長が3番目に短く、同一符号長のシンボル“C”よりも特定のシンボル順で後になるシンボル“D”を、符号ビット列を割り当てる対象として選択する。カノニカルハフマン処理部324は、選択したシンボル“D”の符号ビット列として、code(=3’b111)を割り当てる。
【0151】
以上により、カノニカルハフマン処理部324は、複数のシンボルそれぞれの符号長と、同一符号長の複数のシンボルがある場合の特定のシンボル順とに基づいて、複数のシンボルそれぞれに割り当てる符号ビット列を一意に決定できる。カノニカルハフマン処理部324は、複数のシンボルと、複数のシンボルにそれぞれ割り当てられた複数の符号ビット列とを示す符号化テーブル43を、符号化部33に送出する。
【0152】
これにより、符号化部33は、符号化テーブル43を用いて、ディレイバッファ31によって送出されたシンボルを、符号ビット列(可変長符号)に変換できる。
【0153】
以上の構成により、動的ハフマン符号化器21は、符号長を上限値以下に制約する場合に圧縮性能の低下を抑制できる。
【0154】
ここで、本実施形態の動的ハフマン符号化器21が、符号長を上限値以下に制約する場合に圧縮性能の低下を抑制できることを、比較例に係る圧縮装置に設けられる動的ハフマン符号化器を用いて説明する。
【0155】
図20は、比較例の動的ハフマン符号化器によって実行される符号長制約処理の手順の例を示すフローチャートである。動的ハフマン符号化器は、例えば、
図4を参照して前述した符号長決定処理を実行した後に、符号長制約処理を実行する。ここでは、動的ハフマン符号化器が、符号長決定部322によって生成された符号長テーブル42を用いる場合を例示する。符号長テーブル42は、複数のシンボルと、複数のシンボルにそれぞれ関連付けられた複数の符号長とを示す情報を含む。複数の符号長は、符号長の上限値を考慮せずに決定された符号長である。
【0156】
まず、比較例の動的ハフマン符号化器は、符号長テーブル42に示される複数のシンボルから、上限値を超えた符号長を有するn個のシンボル全てに符号化空間を提供可能なシンボルsを選択する(ステップS41)。n個のシンボル全てに符号化空間を提供可能であるとは、符号長テーブル42に対応するハフマン木において、n個のシンボル全てに、上限値以下の符号長に対応するリーフノードを割り当て可能であることを意味する。
【0157】
次いで、動的ハフマン符号化器は、シンボルsの符号長を上限値に変更する(ステップS42)。動的ハフマン符号化器は、n個のシンボルのそれぞれの符号長を上限値に変更する(ステップS43)。動的ハフマン符号化器は、シンボルsの符号長を上限値に変更したことで生じた符号化空間内の空きのリーフノードに、n個のシンボルを割り当てる(ステップS44)。そして、動的ハフマン符号化器は、いずれのシンボルにも割り当てられていないリーフノードを含む二分木をマージして(ステップS45)、符号長制約処理を終了する。
【0158】
以上の符号長制約処理により、比較例の動的ハフマン符号化器は、シンボルに関連付けられた上限値を超えた符号長を、上限値に変更できる。動的ハフマン符号化器は、上限値を超えた符号長を有するn個のシンボル全てに符号化空間を提供可能なシンボルsの符号長を上限値に変更することにより、n個のシンボルの符号長を上限値に変更する。
【0159】
しかし、シンボルsの符号長が大きく変更された場合、動的ハフマン符号化器の圧縮性能は大きく低下する可能性がある。
【0160】
図21および
図22を参照し、比較例の動的ハフマン符号化器が
図6のハフマン木50を変形する例を用いて、圧縮性能の低下について説明する。
図6のハフマン木50は、符号長決定部322が、シンボルの出現頻度に基づき、符号長の上限値を考慮することなく構築したハフマン木である。ここでは、符号長の上限値が4であるものとする。
【0161】
図21は、比較例の動的ハフマン符号化器が、上限値を超えた符号長のシンボルと、上限値を超えた符号長のシンボル全てに符号化空間を提供可能なシンボルを決定する例を示す。
【0162】
具体的には、動的ハフマン符号化器は、ハフマン木60において、符号長が4を超えている4つのシンボル“e”,“f”,“g”,“h”(すなわち、リーフノード661,662,663,664)を決定する。動的ハフマン符号化器は、決定した4つのシンボル“e”,“f”,“g”,“h”の符号長を、6ビットから4ビットに変更する。動的ハフマン符号化器は、ハフマン木60において、4つのシンボル“e”,“f”,“g”,“h”に対応するリーフノード661,662,663,664を接続する親ノードを変更することによって、符号長(すなわち、リーフノードの深さ)が4ビットになるように変更する。
【0163】
動的ハフマン符号化器は、4つのシンボル“e”,“f”,“g”,“h”の符号長を6ビットから4ビットに変更する場合、符号長が十分に短いリーフノードL(
図21に示す例では、リーフノード611)を選択する。そして、動的ハフマン符号化器は、選択したリーフノードLに対応するシンボル“a”と、符号長が4を超えている4つのシンボル“e”,“f”,“g”,“h”とをそれぞれ割り当てる5つのリーフノードを有し、ノードLを親ノードとする部分木を構成する。符号長が十分に短いリーフノードLは、この部分木を構成した場合に、全てのシンボルの符号長が上限値以下になるリーフノードを指す。動的ハフマン符号化器は、下記の式(2)を満たすリーフノードの内、符号長が最も長いリーフノードを、リーフノードLとして選択する。
2
(符号長上限値-リーフノードLの符号長)≧
1+符号長の上限値の制約に違反したシンボル数 式(2)
【0164】
式(2)の左辺は、リーフノードLを親ノードとし、ルートノード601からの深さが上限値以下となる部分木の最大リーフノード数を示す。すなわち、式(2)の左辺は、リーフノードLを親ノードとして、全てのリーフノードが符号長の上限値の制約を満たす部分木を構築した場合に、その部分木で受け持つことが可能な最大のシンボル数を示している。
【0165】
式(2)の右辺は、リーフノードLに対応するシンボルの数(すなわち、1)と、符号長の上限値の制約に違反し、符号長の変更が必要であるシンボルの数との和を示す。
【0166】
式(2)を満たすリーフノードに対してハフマン木の変形処理を行うことによって、リーフノードLを親ノードとする部分木で、リーフノードLに対応するシンボルと、符号長の上限値の制約に違反したシンボルとのそれぞれに、リーフノードを割り当てることができる。
【0167】
図21に示す例では、動的ハフマン符号化器は、4つのシンボル“e”,“f”,“g”,“h”全てに符号化空間を提供可能なシンボル“a”(すなわち、リーフノード611)を決定する。シンボル“a”の符号長は1ビットである。シンボル“a”の符号長を1ビットから4ビットに変更することにより、7個のリーフノードがハフマン木60に追加される。より詳しくは、シンボル“a”の符号長を1から4に変更することにより、ハフマン木60に、符号長(深さ)が4ビットである8個(=2
(4-1))のリーフノード643,644,654,646,647,648,649,640を有する部分木が設けられる。この8個のリーフノード643,644,654,646,647,648,649,640の内、1つのリーフノード647には、シンボル“a”が割り当てられる。よって、シンボル“a”の符号長を1ビットから4ビットに変更することにより、7個のリーフノードがハフマン木60に追加されることになる。
【0168】
追加されるリーフノードの数(=7)は、符号長が4を超えているシンボルの数(=4)以上である。したがって、シンボル“a”は、4つのシンボル“e”,“f”,“g”,“h”全てに符号化空間を提供可能であると云える。つまり、シンボル“a”に対応するリーフノード611は、式(2)を満たしている(24-1=8≧1+4)。
【0169】
なお、符号長が次に長いシンボル“b”に対応するリーフノード621は、式(2)を満たしていない(24-2=4<1+4)。よって、動的ハフマン符号化器は、4つのシンボル“e”,“f”,“g”,“h”全てに符号化空間を提供可能なシンボル“a”を決定する。
【0170】
動的ハフマン符号化器は、4つのシンボル“e”,“f”,“g”,“h”を、例えば、追加されたリーフノード647,648,649,640にそれぞれ割り当てる。
【0171】
また、動的ハフマン符号化器は、いずれのシンボルも割り当てられていない冗長な3つのリーフノード643,644,645を除去してもよい。動的ハフマン符号化器は、冗長なリーフノード643,644,645を有する二分木を順次マージすることにより、冗長なリーフノードを除去する。3つのリーフノード643,644,645の除去により、中間ノード623は、シンボル“a”が割り当てられたリーフノード623になる。つまり、シンボル“a”の符号長は2ビットになる。
【0172】
図22は、4つのシンボル“e”,“f”,“g”,“h”とシンボル“a”の符号長が変更された後、冗長なリーフノードが除去されたハフマン木60を示す。
【0173】
このハフマン木60では、4つのシンボル“e”,“f”,“g”,“h”の符号長は4ビットである。また、シンボル“a”の符号長は2ビットである。したがって、全てのシンボルの符号長が上限値(4ビット)以下であるハフマン木60が構築されている。
【0174】
図21および
図22に示したハフマン木60の変形例では、動的ハフマン符号化器は、元の符号長が最も短いシンボル“a”の符号長を増加させている。関連付けられた符号長が短いシンボルほど、出現頻度は高い。よって、そのシンボルに対応する可変長符号が圧縮データに出現する頻度も高くなる。そのため、関連付けられた元の符号長(制約前符号長)が短いシンボルほど、符号長を増加させることによる圧縮性能への影響が大きい。
【0175】
比較例の動的ハフマン符号化器は、
図21および
図22のハフマン木60に示すように、シンボル“a”に関連付けられた最も短い符号長を2倍に増加させている。これは、動的ハフマン符号化器の圧縮性能を大きく低下させる。
【0176】
これに対して、第1実施形態に係る圧縮装置15の動的ハフマン符号化器21は、上限値未満であって、より長い符号長に関連付けられたシンボルから優先して、符号長を増加させる。つまり、動的ハフマン符号化器21は、出現頻度がより低いシンボルを、符号長を増加させるシンボルとして、高い優先度で選択する。これにより、符号長を上限値以下に制約する場合にも圧縮性能の低下を抑制できる。
【0177】
第1実施形態の動的ハフマン符号化器21によって変形された
図13のハフマン木50が、比較例の動的ハフマン符号化器によって変形された
図22のハフマン木60よりも、圧縮性能で優れることを、以下に証明する。ここでは、シンボルxの出現頻度をF(x)と表記する。比較例の動的ハフマン符号化器が、
図22のハフマン木60に基づきシンボルを符号化した場合の総符号量をCodeBit1とする。また、第1実施形態の動的ハフマン符号化器21が、
図13のハフマン木50に基づきシンボルを符号化した場合の総符号量をCodeBit2とする。
【0178】
CodeBit1は下記の式(3)で計算される。
CodeBit1=
2×F(a)+2×F(b)+3×(F(c)+F(d))
+4×(F(e)+F(f)+F(g)+F(h)) 式(3)
【0179】
CodeBit2は下記の式(4)で計算される。
CodeBit2=
1×F(a)+3×F(b)+4×(F(c)+F(d))
+4×(F(e)+F(f)+F(g)+F(h)) 式(4)
【0180】
CodeBit1とCodeBit2の差は、下記の式(5)で計算される。
CodeBit1-CodeBit2=
F(a)-(F(b)+F(c)+F(d)) 式(5)
【0181】
また、変形前の
図6のハフマン木50によれば、シンボルの出現頻度には以下の3つの関係が成り立つ。
F(c)≧F(d)+F(e)+F(f)+F(g)+F(h)
F(b)≧F(c)+F(d)+F(e)+F(f)+F(g)+F(h)
F(a)≧F(b)+F(c)+F(d)+F(e)+F(f)+F(g)+F(h)
【0182】
したがって、第1実施形態の動的ハフマン符号化器21による総符号化量CodeBit2は、比較例の動的ハフマン符号化器による総符号化量CodeBit1よりも小さい。よって、第1実施形態の動的ハフマン符号化器21によって変形された
図13のハフマン木50に基づく圧縮性能は、比較例の動的ハフマン符号化器によって変形された
図22のハフマン木60に基づく圧縮性能よりも高い。つまり、第1実施形態の動的ハフマン符号化器21は、符号長を上限値以下に制約する場合に、比較例の動的ハフマン符号化器と比較して、圧縮性能の低下を抑制できる。
【0183】
なお、第1実施形態の動的ハフマン符号化器21は、シンボルの符号長を上限値以下に制約する場合に、符号長が上限値未満であって、且つより長いシンボルから順に、1つ以上のシンボルの符号長を増加させる。そのため、第1実施形態の動的ハフマン符号化器21は、1つのシンボルの符号長を増加させる比較例の動的ハフマン符号化器と比較して、シンボルの符号長を増加させるためのステップ数(すなわち、処理サイクル数)が増加する可能性がある。
【0184】
ステップ数の増加に対処するため、第1実施形態の動的ハフマン符号化器21は、M個のシンボルそれぞれの符号長を並列に増加させる。これにより、第1実施形態の動的ハフマン符号化器21は、第1実施形態の動的ハフマン符号化器21は、シンボルの符号長を増加させるためのステップ数の増加を抑制できる。
【0185】
したがって、第1実施形態の動的ハフマン符号化器21は、符号長を上限値以下に制約する場合に、シンボルの符号長を増加させるためのステップ数の増加を抑制しながら、圧縮性能の低下を抑制できる。
【0186】
(第2実施形態)
第1実施形態では、動的ハフマン符号化器21の符号長上限違反修正部323は、1サイクルの処理において、符号長が上限値未満であるM個のシンボルを選択し、M個のシンボルの符号長を並列に上限値に変更する。これに対して、第2実施形態では、符号長上限違反修正部323は、1サイクルの処理において、符号長が上限値未満であるM個のシンボルを選択し、M個のシンボルの符号長を並列に上限値に変更し、この1サイクルの処理より後の別の1サイクルの処理において、符号長が上限値未満であるN個のシンボルを選択し、N個のシンボルの符号長を並列に上限値に変更する。なお、NはM以下の整数である。
【0187】
第2実施形態に係る圧縮装置15の構成は第1実施形態の圧縮装置15と同様であり、第2実施形態と第1実施形態とでは、符号長上限違反修正部323によって実行される処理の手順のみが異なる。以下、第1実施形態と異なる点を主に説明する。
【0188】
図8のフローチャートに示した上限違反修正処理のステップS23からステップS25までの手順は、クラフト不等式の左辺の値Kが1より大きい間、繰り返し実行されるループ処理である。
【0189】
具体的には、前述したように、符号長変更部353は、符号長テーブル42において、符号長が長いシンボルから順に、符号長が上限値よりも小さいM個のシンボルを選択する(ステップS23)。符号長変更部353は、符号長テーブル42において、選択したM個のシンボルの符号長を並列に上限値に変更する(ステップS24)。そして、クラフト不等式左辺計算部354は、変更した符号長を含むシンボルの集合Sの符号長を用いて、クラフト不等式の左辺の値Kを計算する(ステップS25)。
【0190】
以下では、ステップS23からステップS25までの手順を1回実行することを、1サイクルの処理と称する。
【0191】
1サイクルの処理を実行した回数(すなわち、サイクル数)が増加するほど、構築するハフマン木50に冗長なリーフノードを生じさせる可能性が高い。これは、以下の2つの理由による。
(1)サイクル数が増加するほど、変更されるシンボルの符号長(制約前符号長)が短くなるので、符号長を上限値に変更したことにより追加されるリーフノードの数が増加する。
(2)サイクル数が増加するほど、クラフト不等式の左辺の値Kは1以下に近付いているので、符号長を上限値に変更したことにより追加されるリーフノードの内、冗長になるリーフノードの数が増加しやすい。
【0192】
そのため、符号長上限違反修正部323は、1サイクルの処理で符号長を並列に変更するシンボルの数(並列度)Mを、特定の初期値から開始して、サイクル数が増加するほど減少させ得る。例えば、符号長上限違反修正部323は、Mの初期値として4を設定して、2サイクルの処理を実行する。そして、符号長上限違反修正部323は、Mを4から2に変更して、2サイクルの処理を実行する。さらに、符号長上限違反修正部323は、Mを2から1に変更して、以降のサイクル処理を実行する。
【0193】
このように、符号長上限違反修正部323は、サイクル数が増加するほど、1サイクルの処理で符号長が上限値に変更されるシンボルの数を減少させる。つまり、符号長上限違反修正部323は、ある1サイクルの処理において、符号長が上限値未満であるM個(例えば4個)のシンボルを選択し、M個のシンボルの符号長を並列に上限値に変更する。そして、符号長上限違反修正部323は、この1サイクルの処理より後の別の1サイクルの処理において、符号長が上限値未満であるN個(例えば2個)のシンボルを選択し、N個のシンボルの符号長を並列に上限値に変更する。Mは、例えば2以上の整数である。Nは、M以下の整数である。
【0194】
これにより、符号長上限違反修正部323は、符号長の変更に応じて発生し得る冗長なリーフノードの数を抑制できる。したがって、符号長上限違反修正部323は、冗長なリーフノードを除去するために要する処理量を低減できる。
【0195】
以上説明したように、第1および第2実施形態によれば、符号長を上限値以下に制約する場合に圧縮性能の低下を抑制できる。
【0196】
符号化テーブル生成部32は、複数のシンボルの各々の出現頻度に基づいて、複数のシンボルにそれぞれ関連付けられる複数の符号長を決定する。符号化テーブル生成部32は、複数のシンボルが、上限値を超えた1つ以上の第1符号長にそれぞれ関連付けられた1つ以上の第1シンボルを含む場合、1つ以上の第1符号長を上限値に変更し、複数のシンボルの内、上限値未満である1つ以上の第2符号長にそれぞれ関連付けられた1つ以上の第2シンボルから、関連付けられた符号長が長いものから順に、少なくとも1つの第3シンボルを選択し、少なくとも1つの第3シンボルに関連付けられた少なくとも1つの第3符号長を上限値に変更し、変更した1つ以上の第1符号長および少なくとも1つの第3符号長を少なくとも用いて、複数のシンボルと、複数のシンボルにそれぞれ関連付けられた複数の可変長符号とを示す符号化テーブル43を生成する。符号化部33は、符号化テーブル43を用いてシンボルを可変長符号に変換する。複数の可変長符号の各々の符号長は、1から上限値までのビット長である。
【0197】
このように、符号化テーブル生成部32は、複数のシンボルの内、上限値未満である1つ以上の第2符号長にそれぞれ関連付けられた1つ以上の第2シンボルから、関連付けられた符号長が長いものから順に、少なくとも1つの第3シンボルを選択し、少なくとも1つの第3シンボルに関連付けられた少なくとも1つの第3符号長を上限値に変更する。これにより、例えば、上限値を超えた符号長を有するシンボル全てに符号化空間を提供可能な1つのシンボルを選択し、選択したシンボルの符号長を上限値に変更する場合と比較して、圧縮性能の低下を抑制できる。
【0198】
第1および第2実施形態に記載された様々な機能の各々は、回路(処理回路)によって実現されてもよい。処理回路の例には、中央処理装置(CPU)のような、プログラムされたプロセッサが含まれる。このプロセッサは、メモリに格納されたコンピュータプログラム(命令群)を実行することによって、記載された機能それぞれを実行する。このプロセッサは、電気回路を含むマイクロプロセッサであってもよい。処理回路の例には、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、マイクロコントローラ、コントローラ、他の電気回路部品も含まれる。これら実施形態に記載されたCPU以外の他のコンポーネントの各々もまた処理回路によって実現されてもよい。
【0199】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0200】
1…情報処理システム、2…ホスト、3…メモリシステム、4…コントローラ、5…NAND型フラッシュメモリ、10…バス、11…ホストI/F、12…CPU、13…NAND I/F、14…DRAM I/F、15…圧縮装置、16…伸張装置、21…動的ハフマン符号化器、22…パック処理部、31…ディレイバッファ、32…符号化テーブル生成部、33…符号化部、321…頻度テーブル生成部、322…符号長決定部、323…符号長上限違反修正部、324…カノニカルハフマン処理部、351…符号長ソート部、352…符号長クリップ部、353…符号長変更部、354…クラフト不等式左辺計算部、355…終了判定部、356…冗長リーフ除去部、41…頻度テーブル、42…符号長テーブル、43…符号化テーブル。