(データ圧縮伸張装置の構成)
以下、図面を参照して、一実施形態に係るデータ圧縮伸張装置10について説明する。データ圧縮伸張装置10は、例えば音声信号(画像信号でもよい)の入力を受け付け、当該音声信号をデジタル信号に変換して圧縮し、当該圧縮データを記憶する。また、データ圧縮伸張装置10は、記憶された圧縮データを伸張して音声信号に変換して出力する。また、データ圧縮伸張装置10は、音声や画像の圧縮に限らず、任意のデータを圧縮するために用いられてもよい。以下では、データ圧縮伸張装置10を用いて、例えば人の声などの音声(音楽等でもよい)を圧縮・伸張する場合について説明する。
図1は、データ圧縮伸張装置10の機能構成を示すブロック図である。図1に示すように、データ圧縮伸張装置10は、入力部11と、A/D変換部12と、エンコード部13と、圧縮データ記憶部14と、デコード部15と、D/A変換部16と、出力部17とを含む。
入力部11は、例えばマイクであり、例えば人の声等の音声信号の入力を受け付ける。A/D変換部12は、入力部11からのアナログ信号を受信して、デジタル信号に変換する。A/D変換部12は、アナログの音声信号を所定のサンプリング周期でサンプリングし、メモリ等の記憶部に一時的に記憶する。サンプリング周波数としては、例えば、44kHzであってもよいし、他の任意の周波数であってもよいし、可変であってもよい。
エンコード部13は、A/D変換部12からサンプリングデータを取得し、所定の処理を行う。具体的には、エンコード部13は、取得したサンプリングデータを周波数領域のデータに変換し、変換した周波数領域のデータを圧縮することにより、音声信号を圧縮した圧縮データを生成する。
圧縮データ記憶部14は、エンコード部13が生成した圧縮データを記憶する。圧縮データ記憶部14は、例えば不揮発性メモリによって構成される。
デコード部15は、圧縮データ記憶部14から圧縮データを読み取り、圧縮データを伸張する。D/A変換部16は、伸張されたデータをアナログ信号に変換し、出力部17に出力する。出力部17は、例えばスピーカであり、D/A変換部16からのアナログ信号を受け取って音声として出力する。
なお、データ圧縮伸張装置10は、ハードウェア構成として、CPU、メインメモリ、不揮発性メモリ、マイク、スピーカ等を備える。例えば、不揮発性メモリには、エンコード部13によって行われるデータ圧縮処理(後述する)やデコード部15によって行われるデータ伸張処理(後述する)を実行するためのプログラムが記憶される。そして、このプログラムがメインメモリに読み込まれ、CPUを上記各部として機能させる。また、データ圧縮伸張装置10は、上記各部のうちの一部又は全部として機能する専用回路を備えてもよい。すなわち、上記各部は、ソフトウェア、ハードウェア、またはこれらの組み合わせによって実現されることができる。
なお、データ圧縮伸張装置10の構成は単なる一例であり、後述する処理(エンコード処理、デコード処理)はどのような装置において行われてもよい。例えば、データ圧縮伸張装置10が、物理的に分離された複数の装置によって構成されてもよい。例えば、物理的に離れた場所に設置された複数の装置がネットワークで互いに接続されて、データ圧縮伸張装置(システム)が実現されてもよい。例えば、エンコード部13とデコード部15が物理的に離れており、エンコード部13でエンコードされた圧縮データがストリーミング形式でデコード部15に送信されて、デコード部15においてデコードされてもよい。
(データ圧縮処理の概要)
次に、データ圧縮伸張装置10によって行われるデータ圧縮処理の概要について説明する。図2は、本実施形態における音声圧縮処理の概要を示す図である。
図2に示すように、まず、アナログの音声信号を所定のサンプリング周期でサンプリングしたサンプリングデータが取得される。ここでは、期間Tの間にm(mは正の整数)個のサンプリングデータが取得されるものとする。この時間領域のサンプリングデータのデータ列に対して、周波数領域のデータ(周波数スペクトル)に変換するための所定の変換が行われる。所定の変換としては、例えば、後述する修正離散コサイン変換(MDCT)であってもよいし、離散コサイン変換(DCT)、フーリエ変換あるいはその派生の変換等、どのような変換方法が用いられてもよい。
所定の変換が行われることによって、例えば、n(nは正の整数)個の周波数領域のデータが取得される。すなわち、所定の処理が行われることによって、期間Tにおいて取得された時間領域のデータ列が、周波数領域のデータ列として、例えば余弦関数を基底とする一次結合(様々な周波数と振幅を有する余弦関数の和)の係数に変換される。ここで得られる周波数領域のデータ列は、低い周波数から高い周波数の順に並んだn個の数列となる。なお、ここでは、所定の変換が行われた後の1の周波数領域のデータ(ある周波数の余弦関数の係数)を上記サンプリングデータと区別して「サンプルデータ」と呼ぶことがある。
図2に示すように、n個の周波数領域のデータが、複数のブロックに分割される。具体的には、1のブロックに含まれるデータの数が可変になるようにして、n個の周波数領域のデータ列が複数のブロックに分割される。すなわち、1つのブロックには複数の周波数領域のデータ(複数のサンプルデータ)が含まれ、1つのブロックに含まれる周波数領域のデータの数は、ブロック毎に異なる。
そして、ブロック毎に圧縮が行われる。これにより、期間Tの音声信号に対応する圧縮データが生成される。なお、n個のサンプルデータが複数のブロックに分割された後に圧縮される必要はなく、圧縮とブロック分割とが同時に行われてもよい(処理の順番は問題とはならない)。
このように、本実施形態では、時間領域から周波数領域に変換されたデータ列が、可変長のブロックに分割されて圧縮される。これにより、圧縮効率を高めることができる。
図3は、入力された音声信号とデータ圧縮処理が行われることによって生成されるデータとの関係を示す図である。図3に示すように、本実施形態では、期間Tの音声信号に対する処理が行われることによって、この期間Tに対応する音声圧縮データとして1つのフレームが生成される。そして、期間Tの音声信号に対する処理が繰り返し行われることにより、入力された音声信号を圧縮した圧縮データが取得される。
(本実施形態の圧縮データのデータ構造)
次に、本実施形態のデータ圧縮処理が行われることで生成される圧縮データのデータ構造について説明する。上述のように、本実施形態では、期間Tにおいて取得された複数のサンプリングデータに基づいて、n個のデータ(サンプルデータ)が取得され、当該n個のデータに対するデータ圧縮処理が行われることにより、圧縮データが生成される。本実施形態では、n個のデータに対するデータ圧縮処理が1回行われることにより、圧縮されたn個のデータを含むフレームが生成される。
図4は、本実施形態のデータ圧縮処理が行われることによって生成されるフレームのデータ構造の一例を示す図である。図5は、フレームに含まれるブロックのデータ構造の一例を示す図である。
図4に示すように、フレームは、フレームヘッダFHと、複数のブロック(ブロックB1、ブロックB2、・・)とを含む。複数のブロックの各々は、ブロックヘッダBHとデータ部とを有する。ブロックのデータ部には、複数の圧縮されたデータ(圧縮されたサンプルデータ)が記憶される。ブロックヘッダBHの情報は、そのブロックのデータ部に含まれる圧縮されたデータを伸張するために用いられる。
図5に示すように、ブロックは、ブロックヘッダBHと、例えばa個のデータ(データD1、データD2、・・、データDa)とを含む。ブロックヘッダBHには、このブロックに含まれるデータの数(ここでは数値「a」)が記憶される。すなわち、上記ブロックヘッダBHには、このブロックに含まれるデータの数を記憶するための所定領域が設けられる。また、ブロックヘッダBHには、このブロックに含まれる各データのビット数を示す情報(ビット情報)が記憶される。ブロックに含まれる全データのビット数は、ブロックヘッダBHのビット情報が示すビット数である(ブロック内の各データには、ビット情報が示すビット数が割り当てられる)。ブロックヘッダBHのビット情報、および所定領域に記憶される値は、ブロックごとに異なるため、ブロックの長さもまたブロックごとに異なる。データ圧縮伸張装置10は、ブロックヘッダBHに記憶された情報を読み取ることによって、圧縮された各データ(D1〜Da)を抽出することができ、抽出した各データを伸張することができる。
図4に示すように、フレームヘッダFHには、当該フレームに含まれる複数のブロックに共通の情報であるブロック情報が記憶される。具体的には、このブロック情報によって、当該フレームに含まれる全ブロックのブロックヘッダBHの上記所定領域の長さ(所定領域に割り当てられるビット長)が指定される。
上述のように、各ブロックに含まれるデータの数は可変であり、ブロックヘッダBHの所定領域の長さによって、そのブロックに含まれるデータの最大数が定められる。詳細は後述するが、圧縮対象の複数のサンプルデータは、この最大数を限度にして圧縮後のフレーム全体のサイズが小さくなるように各ブロックに分割される。従って、フレームヘッダFHのブロック情報によってフレームの各ブロックに含まれるデータの数が異なることになり、ブロック内のデータの最大数はフレーム(圧縮データ)のサイズに影響を与える。
本実施形態では、フレームごとにフレームヘッダFHのブロック情報が設定される。すなわち、フレームごとにブロックに含まれるデータの最大数が異なる。詳細は後述するが、フレームヘッダFHのブロック情報は複数の値(例えば0〜3)に設定されることができ、この値に応じてブロックヘッダBHの所定領域の長さ(例えば7ビット〜10ビット)が定められる。本実施形態では、設定され得る複数の値(0〜3)の中から、フレームのサイズが最も小さくなる1つの値が選択されて、ブロック情報として設定される。
以上のように、本実施形態では、フレームには、フレームヘッダFHと複数のブロックとが含まれ、フレームヘッダFHには、各ブロックに共通の情報(ブロックヘッダBHの所定領域の長さ)が含まれる。このため、ブロックごとに当該情報を記憶するよりもデータサイズを削減することができる。
また、本実施形態では、フレーム内の各ブロックは可変長のブロックであり、ブロックヘッダBHの所定領域に当該ブロックに含まれるデータの数が記憶される。フレームヘッダFHのブロック情報によって、ブロックヘッダBHの所定領域の長さを指定することができる。
フレームヘッダFHのブロック情報によってブロックヘッダBHの所定領域の長さが可変であるため、1つのブロックに含められるデータの最大数をフレームごとに可変とすることができる。このため、データ圧縮により適したブロックを生成することができ、圧縮率を向上させることができる。すなわち、例えば、ブロックに含められるデータの最大数が多い場合に、より高い圧縮率を実現することができれば、当該最大数を多く設定してフレーム全体のサイズをより小さくすることができる。逆に、ブロックに含められるデータの最大数によって圧縮率が異ならない場合は、ブロックヘッダBHの上記所定領域の長さを短くして、フレーム全体のサイズをより小さくすることができる。
また、本実施形態では、入力された音声信号の期間Tにおけるサンプリングデータに基づいて、フレームが生成され、期間Tごとにフレームが生成されて、入力された音声信号を圧縮した圧縮データが生成される。フレームごとに伸張処理を行うことで、その期間の音声を復元することができる。
なお、上記では、一例として音声データを圧縮することとしたが、他の実施形態では、音声データに限らず、例えば画像データを圧縮してもよい。また、文字列のデータ、プログラムデータ等、任意のデータを圧縮してもよい。
(処理の詳細)
次に、データ圧縮伸張装置10において実行される処理の詳細を説明する。以下では、エンコード部13によって行われるエンコード処理、およびデコード部15によって行われるデコード処理について説明する。まず、エンコード部13によって行われるエンコード処理について、図6〜図9を参照して説明する。
なお、以下に示すエンコード処理およびデコード処理は、データ圧縮伸張装置10が備えるCPUが、メモリにロードされた音声圧縮伸張プログラムを実行することによって行われる。すなわち、エンコード部13およびデコード部15は、CPUが当該プログラムを実行することによって実現される。音声圧縮伸張プログラムは、例えば、記憶媒体(例えば、不揮発性メモリ、磁気ディスク、光ディスク等)に予め記憶されてもよいし、他の装置から無線又は有線で提供されてもよい。記憶媒体は、データ圧縮伸張装置10に着脱自在に接続されてもよいし、データ圧縮伸張装置10に内蔵されてもよい。
図6は、エンコード部13によって実行されるエンコード処理の流れを示すメインフローチャートである。
まず、ステップS101において、エンコード部13は、シークポイントから2nサンプルのデータを取得する。具体的には、エンコード部13は、シークポイントを基準として定められる一定期間Tにおいてサンプリングされた2n個のサンプリングデータを取得する。サンプリングデータは、A/D変換部12によってサンプリングされたデータである。
図10は、入力部11において入力された音声信号の波形を示す図である。図11は、期間Tにおける音声信号の波形を示す図である。図10及び図11において、横軸は時間を示し、縦軸は音声信号の振幅を示す。図10及び図11に示すように、エンコード部13は、ステップS101において、シークポイントを基準として定められる期間Tにおいてサンプリングされた2n個のサンプリングデータを取得する。A/D変換部12は、所定のサンプリング周期(例えば、44kHz)で音声信号をサンプリングし、メモリ等の記憶部(図示せず)に一時的にサンプリングデータを記憶する。各サンプリングデータは、ある時間における振幅を示すデータであり、時間領域のデータである。図11に示すように、ここで記憶されるサンプリングデータは、その値が例えば16ビットで表現される実数値を示すデータである。
エンコード部13は、2n個のサンプリングデータを取得した後、次にステップS102の処理を実行する。
ステップS102において、エンコード部13は、音量をv%にする。ここでは、取得された時間領域のデータについて、各データの値の範囲を圧縮する。図12は、取得された時間領域のデータを圧縮する様子を示す図である。
具体的には、図12に示すように、エンコード部13は、各サンプリングデータをv%(例えば、40%)にする。これにより、16ビットで表現されていたサンプリングデータを15ビットで表現する。すなわち、各サンプリングデータに割り当てるメモリ上の領域を15ビットに圧縮する。
ステップS102に続いて、エンコード部13は、取得した2n個のデータに対して例えばハニング窓(窓関数)を掛ける(ステップS103)。エンコード部13は、次にステップS104の処理を実行する。
ステップS104において、エンコード部13は、MDCT(修正離散コサイン変換)を実行する。MDCTの実行により、2n個のサンプリングデータからn個の周波数領域のデータが得られる。以降の処理では、n個のデータについての処理が行われる。図13は、MDCTの実行によって得られる周波数領域のデータの一例を示す図である。図13において、横軸は周波数を示す。図13に示すように、MDCTを実行することによって、2n個の時間領域のデータからn個の周波数領域のデータ(サンプルデータ)が得られる。このステップS104の処理の結果得られるn個のデータ列は、低い周波数から高い周波数に順に並んだ実数列である。
次に、ステップS105において、エンコード部13は、MDCTを実行して得られたn個のサンプルデータ列について、符号のデータ列と、絶対値のデータ列とを分離する。図14は、符号のデータ列と絶対値のデータ列との分離について説明するための図である。図14に示すように、MDCTの実行によって得られたサンプルデータには、負の数値が含まれている。ここでは、以降の計算を行いやすくするために、MDCTの実行によって得られたサンプルデータ列を、絶対値データ列と符号データ列とに分離をする。以降のステップS106〜ステップS109では、ステップS105において分離されたn個の絶対値データ列について処理が行われる。
次に、ステップS106において、エンコード部13は、ステップS105で得られた絶対値データ列の各データをそれぞれ対数化する。対数化して得られたデータ列は、メモリに一時的に記憶される。エンコード部13は、次にステップS107の処理を実行する。
ステップS107において、エンコード部13は、ビット数削減処理(5ビット化)を行う。ここでは、ステップS106の処理で得られた各データについて、例えば16ビットで表現されていたデータを、5ビットで表現する。
図15は、ステップS107におけるビット数削減処理(5ビット化)について説明するための図である。図15に示すように、対数化された各データは、例えば16ビットで表現されるデータである。ここで、ビット数削減処理(5ビット化)においては、ステップS106で対数化された各データについて、0よりも小さい値を0とし、31よりも大きな値を31として、各データを5ビットで表現するとともに、0〜31の整数値で表現する。ステップS106で対数化された各データのうち、値が0〜31の範囲である場合には、そのままの値が維持される(例えば小数点以下は切り捨てられる)。
例えば、対数化されたデータの値が負である場合、そのデータの絶対値は相対的に小さく(ある周波数成分の振幅は小さく)、そのようなデータについては無視(値を「0」にする)しても音声として伸張したときに音の聞こえ方に大きな影響はない。また、対数化されたデータの値が32以上の場合、振幅が非常に大きいため人間には31でも32以上でもその差を識別し難い。このため、このような人間には識別し難い、値が「32」以上のデータについては、「31」としても大きな影響はない。従って、ステップS107においては、各データを0〜31の範囲の値として、各データを5ビットで表現する。すなわち、各周波数領域のデータのために5ビットを再割り当てする。このようにして、各データのビット数が削減される。
次に、ステップS108において、エンコード部13は、帯域毎のビット数削減処理を実行する。ここでは、ステップS107の処理で得られたデータ列について、帯域毎にさらにビット数を削減する。この帯域毎のビット数削減処理の詳細については、図7を参照して後に詳述する。
ステップS108の処理の後、エンコード部13は、ブロック最適化処理を実行する(ステップS109)。ここでは、エンコード部13は、ステップS108で得られたデータ列を最適化して複数のブロックに分けるとともに、各ブロックを圧縮する。このブロック最適化処理の詳細については、図8を参照して後に詳述する。
次に、ステップS110において、エンコード部13は、ステップS105で分離した符号データ列と、ステップS109で得られた絶対値データ列とを結合する。
次に、ステップS111において、エンコード部13は、シークポイントが終了位置に達したか否かを判定する。判定結果が肯定である場合、エンコード部13は、図6に示すエンコード処理を終了する。一方、判定結果が否定である場合、エンコード部13は、シークポイントをn個のサンプリングデータの分だけ進め(ステップS112)、再びステップS101の処理を実行する。
このようにして、ステップS101〜ステップS111の処理が繰り返されることにより、音声データが圧縮されて圧縮データ記憶部14に記憶される。
次に、上述したステップS108の帯域毎のビット数削減処理、及び、ステップS109のブロック最適化処理について、説明する。これらの処理の詳細を説明する前に、本実施形態におけるブロックとフレームの定義について説明する。
(フレーム、ブロックのフォーマット)
図16は、本実施形態におけるフレームの定義を示す図である。図17は、本実施形態におけるブロックの定義を示す図である。
本実施形態では、図6に示すエンコード処理が、図16に示すフレーム単位で行われる。図16に示すように、フレームは、フレームヘッダFHと、複数のブロックとを含む。フレームヘッダFHは、フレームサイズを格納する領域FH1と、ブロックヘッダBHの「サンプル数」のビット数を指定するための領域FH2とを含む。「フレームサイズ」は、フレーム全体のサイズを示し、当該フレームサイズを示す領域FH1には、16ビットが割り当てられる。「ブロックヘッダBHの「サンプル数」のビット数」は、ブロックヘッダBHにおける「サンプル数」(図17参照)を示す領域BH1に割り当てられるビット数である。領域FH2には、2ビットが割り当てられる。
例えば、領域FH2に値0が格納される場合、ブロックヘッダBHにおける領域BH1には、7ビットが割り当てられる。また、領域FH2に値1が格納される場合、ブロックヘッダBHにおける領域BH1には、8ビットが割り当てられる。領域FH2に値2が格納される場合、ブロックヘッダBHにおける領域BH1には、9ビットが割り当てられ、領域FH2に値3が格納される場合、ブロックヘッダBHにおける領域BH1には、10ビットが割り当てられる。
図16に示すように、フレームには複数のブロックが含まれる。各ブロックは、図17に示すように、ブロックヘッダBHと、データ部とに分けられる。ブロックヘッダBHは、データ部に含まれる各サンプルデータを伸張する際に必要な情報である。具体的には、ブロックヘッダBHは、さらに、「サンプル数」を格納する領域BH1と、「サンプルデータのビット数」を示す領域BH2とに分けられる。なお、ブロックヘッダBHは、データ部に付加される必要はなく、ブロックのデータ部とブロックヘッダBHとが分離してもよい。
領域BH1のサイズは、可変であり、上述のように、フレームヘッダにおける領域FH2に格納される値によって定められる。例えば、フレームヘッダの領域FH2に「0」が格納される場合、ブロックヘッダの領域BH1のサイズは、7ビットとなる。この領域BH1に格納される値は、このブロックのデータ部に含まれるサンプルデータの数(サンプル数)を示す。例えば、領域BH1が7ビットである場合、最大で127個のサンプルデータをこのブロックのデータ部に含むことが可能である。例えば、領域BH1が7ビットであって、このブロックに4つのデータが含まれている場合、領域BH1に格納される値は「0000100」(2進数)となる。以下では、図17に示すブロックのブロックヘッダBHのサイズをH[bit]で表すことがある。
このように、本実施形態では、フレームにフレームヘッダFHと複数のブロックとが含まれる。フレームヘッダFHには、ブロックヘッダBHのサイズを示す情報が含まれる。すなわち、フレームヘッダFHにおいて値が指定されることで、このフレームに含まれるすべてのブロックヘッダBHのサイズ(領域BH1のサイズ)が指定される。これにより、各ブロックのヘッダサイズを指定することができる。
また、ブロックヘッダの「サンプルデータのビット数」は、データ部に含まれる各サンプルデータに割り当てられるビット数である。「サンプルデータのビット数」を示す領域BH2には、例えば3ビット(固定長)が割り当てられる。例えば、「サンプルデータのビット数」として、「101」(2進数表現;10進数では「5」)が設定される場合、データ部に含まれるサンプルデータのサイズは、全て「5」ビットであることを意味する。
上述のようにブロックヘッダBHは可変であり、ブロックヘッダBHの領域BH1のサイズによって、ブロックに含まれるデータの数の上限が定められる。例えば、領域BH1に8ビットが割り当てられる場合には、最大で256個のデータをブロックに含めることが可能であり、領域BH1に9ビットが割り当てられる場合には、最大で512個のデータをブロックに含めることができる。
本実施形態では、フレーム毎に領域FH2に設定される値が異なる。例えば、あるフレームでは、フレームヘッダFHの領域FH2に値「0」が格納されてデータが圧縮されて記憶される(このときのフレームの各ブロックの最大データ数は128個(7ビット)である)。また、他のフレームでは、フレームヘッダFHの領域FH2に値「1」が格納されてデータが圧縮されて記憶される(このときのフレームの各ブロックの最大データ数は256個(8ビット)である)。
なお、ブロックヘッダBHの「サンプルデータのビット数」に値「0」が格納される場合、このブロックのデータ部にはデータが存在しないことを意味する。また、「サンプル数」に値「0」が格納される場合、このフレームの最後のサンプルデータまでを意味する。すなわち、値が0のサンプルデータがフレームの最後まで続く場合、その値および数は省略される。
(帯域毎のビット数削減処理の詳細)
次に、ステップS108の帯域毎のビット数削減処理の詳細について説明する。図7は、ステップS108の帯域毎のビット数削減処理の詳細を示すフローチャートである。
図7に示すように、ステップS201において、エンコード部13は、データ列を8等分に分割する。具体的には、エンコード部13は、上記ステップS107の処理で5ビット化されたデータ列を、各グループに含まれるデータの数が等しくなるようにして、周波数の帯域毎に8つのグループに分割する。ここで、上述したブロックとは異なり、各グループに含まれるサンプルデータの数は同じである。従って、ステップS201で分割されるデータの集合を「グループ」と表記して、上述の「ブロック」と区別する。
次に、ステップS202において、エンコード部13は、カウンタKに1をセットする。続いて、ステップS203において、エンコード部13は、第1手法を用いるか否かを判定する。ステップS203においては、エンコード部13は、K番目のグループのデータを低ビット化する手法(ビット数を削減する手法)として、第1手法を用いるか否かを判定する。具体的には、エンコード部13は、Kの値に基づいて、第1手法を用いるか否かを判定する。なお、この「第1手法」については、後に詳述する。
ステップS203の判定結果が肯定の場合、エンコード部13は、ステップS204において、K番目のグループを第1手法で低ビット化する。一方、ステップS203の判定結果が否定の場合、エンコード部13は、ステップS205において、K番目のグループを第2手法で低ビット化する。なお、この「第2手法」については、後に詳述する。ステップS204又はステップS205の処理は、8等分したグループのうちのK番目のグループに含まれる各データのビット数を削減する処理である。
ステップS204又はステップS205の処理の後、エンコード部13は、ステップS206において、Kに1を加算する。そして、エンコード部13は、次のステップS207において、Kが8より大きいか否かを判定する。判定結果が肯定の場合は、エンコード部13は、図7に示す帯域毎のビット数削減処理を終了する。一方、判定結果が否定の場合は、エンコード部13は、再びステップS203の処理を実行する。ステップS203〜ステップS207の処理が繰り返し行われることによって、8等分された各グループが、第1手法又は第2手法を用いて低ビット化される。以上で、図7のフローチャートの説明を終了する。
次に、図7のフローチャートで示した帯域毎のビット数削減処理の概要について、図18を参照して説明する。
図18は、帯域毎のビット数削減処理の概要を示す図である。図18に示すように、ここで処理されるデータ列は、周波数領域のデータ列であって、低い周波数成分から高い周波数成分まで周波数の順に並んでいる。ステップS201では、n個のデータ列(データD1、データD2、・・、データDN)が、8つのグループに等分割される。そして、各グループについて、第1手法又は第2手法により、ビット数の削減処理が行われる(ステップS204、ステップS205)。このビット数削減処理によって、例えば、1番目のグループ及び2番目のグループの各データは、5ビットで表されていたものが、4ビットで表現される。また、3番目のグループの各データは、5ビットで表されていたものが、3ビットで表現され、8番目のグループの各データは2ビットで表現される。
例えば、n=512である場合、各グループには64個のサンプルデータが含まれる。この場合、1番目及び2番目のグループに含まれる1個目〜128個目までのサンプルデータは、比較的低い周波数の成分であるため、それぞれ1ビット削減される。一方、8番目のグループに含まれる449番目〜512番目のサンプルデータは、比較的高い周波数の成分であるため、それぞれ3ビット削減される。
図19は、第1手法による低ビット化を示す図であり、第1手法を用いてビット数を5ビットから4ビットに削減する処理を示す図である。
図19に示すように、第1手法では、5ビットで表された10進数の値0及び1を「0」とし、値2及び3を「1」とし、値4及び5を「2」として再定義する。すなわち、第1手法では、5ビットで表された10進数の値を2で除した場合において、その商を低ビット化後の値として定義する。これにより、0〜31(5ビット)の範囲の数は、0〜15(4ビット)の範囲の数となる。そして、各データに割り当てる領域が、5ビットから4ビットに変更される。このように、第1手法では、値の全範囲にわたって均等に圧縮される。
図20は、第2手法による低ビット化を示す図であり、第2手法を用いてビット数を5ビットから4ビットに削減する処理を示す図である。
図20に示すように、第2手法では、5ビットで表された10進数の値0〜16を「0」とし、値17〜31をそれぞれ「1〜15」として再定義する。すなわち、第2手法では、比較的小さな値0〜16を「0」として捨てて、比較的大きな値17〜31を残す。これにより、0〜31(5ビット)の範囲の数は、0〜15(4ビット)の範囲の数となる。このように、第2手法では、小さい値0〜16を捨てて、大きな値のみを残す。各データの値が小さいことは、その周波数成分の振幅(音量に関係する)が小さいことを示す。小さな音は人間には聞こえにくいため、このような小さな音を「0」にしても音の聞こえ方には影響しない場合がある。このため、第2手法では、小さな値を捨てて、大きな値のみを残す。
なお、周波数や音声の種類によっては小さな音でもカットすると音質が低下する場合がある。従って、周波数や音声の種類によっては、第2手法よりも第1手法が用いられる。例えば、比較的高い周波数成分では、小さな音をカットしても音質が低下し難い場合がある。また、周波数や音声の種類によっては、第1手法によって均等に低ビット化するよりも第2手法を用いる方が音質が低下し難い場合がある。第1手法によって均等に低ビット化すると、細かい振幅の違いを表現することができず、音質が低下する場合がある。一方で、第2手法では、ある値以下はカットされるが、それ以外の値はそのまま維持されるため、細かい振幅の違いを表現することができる。
このように、第1手法又は第2手法を用いて、周波数の帯域毎にビット数が削減される。具体的には、高い周波数帯域であるほど、ビット数の削減幅が大きくなる。例えば、低い周波数帯域である1番目のグループ及び2番目のグループでは、5ビットから4ビットにビット数が1だけ削減される。高い周波数帯域である7番目のグループ及び8番目のグループでは、5ビットから2ビットにビット数が3だけ削減される。
2ビット以上削減する場合は、第1手法又は第2手法によるビット数の削減処理が2回以上行われる。例えば、5ビットから3ビットに2ビットだけ削減される場合、5ビットから4ビットに削減された後、さらに、4ビットから3ビットに削減される。この場合において、5ビットから4ビットへの削減には、上記第1手法が用いられ、4ビットから3ビットへの削減には、同様に上記第1手法が用いられてもよいし、上記第2手法が用いられてもよい。
各グループに対してどの手法を用いてビット数の削減処理を行うかは、予め定められる。また、どの手法をどの順番で適用するかも予め定められる。例えば、1番目〜6番目のグループは、第1手法のみが用いられ、7番目のグループは第2手法のみが用いられてもよい。8番目のグループは、3回のビット数削減処理において、1回目及び2回目は第1手法が用いられ、3回目は第2手法が用いられてもよい。
なお、圧縮された音声データを伸張する場合は、圧縮した時の手法に合わせて上述した第1手法又は第2手法を用いたビット数削減処理と逆の処理を行う。すなわち、第1手法で圧縮されたデータは、第1手法の逆の処理(例えば、4ビットのデータについて値を2倍することで5ビットにする)を行って伸張する。
以上のようにして、サンプルデータ列を、8つのグループに等分割して、グループ単位でビット数が削減される。高い周波数帯域では削減幅が大きく(5ビットから2ビット)、低い周波数帯域では削減幅が小さい(5ビットから4ビット)。人間にはある一定の範囲の周波数の音しか聞こえず、また、聞こえる範囲の周波数であっても高い周波数帯域と、低い周波数帯域とでは敏感になる場合とそうでない場合とがある。一般的には、高い周波数(例えば10kHz)の音は聞こえにくく、このため、高い周波数の音の精度を下げて圧縮しても音質は劣化し難い。また、低い周波数(例えば1kHz)の音に対しては人間は敏感であるため、高い精度で復元できるようにすることが好ましい。従って、本実施形態では、高い周波数帯域ではビット数の削減幅を大きくしてデータ量を大幅に削減し、低い周波数帯域ではビット数の削減幅を小さくして、高い精度で復元できるようにする。
このように、帯域毎のビット数削減処理では、帯域毎に削減幅を変えて、各サンプルデータのビット数を削減する。上記第1手法および第2手法を用いたビット数削減処理は、非可逆変換であり、これらの手法を用いた処理を行った場合、処理の前のデータを正確には復元することはできない。しかしながら、音質に影響がない程度であれば、正確にデータを復元することができなくても問題はない。
なお、ビット数を削減する処理としては、第1手法および第2手法以外に、他の手法が用いられてもよい。他の手法は、非可逆変換であってもよいし、可逆変換であってもよい。
(ブロック最適化処理の詳細)
次に、ステップS109のブロック最適化処理の詳細について説明する。ステップS109のブロック最適化処理は、サンプルデータ列を、複数のブロック(図16参照)に分割する処理であり、各ブロックを最適化しつつ圧縮する処理である。
すなわち、ステップS109のブロック最適化処理では、上記ステップS108の帯域毎のビット数削減処理で8分割された各グループの区切り位置を無視して、サンプルデータ列が複数のブロックに分割される。そして、ブロック単位で圧縮が行われる。具体的には、ブロック最適化処理では、ステップS108の処理が行われた後のデータ列について、各データのビット数に基づいて、ブロックが生成される。
図21は、データ列の値とその値を表現するために必要なビット数とを示す図である。図21に示すように、ステップS108の処理が行われた後、データ列として、データD1、データD2、データD3、・・、データDNがメモリに一時的に記憶されている。このとき、例えば、データD1〜データD10は、ステップS108においては1番目のグループとして処理が行われ、その結果4ビットに圧縮されている。すなわち、データD1〜データD10の値を格納するための領域として、それぞれ4ビットの領域がメモリ上で確保されている。
一方、図21に示すように、例えばデータD1の値は、「6」(10進数表現)であり、この値を表現するために必要なビット数(必要ビット数)は、「3」である(3ビットで表現可能な値は0〜7)。3ビットの領域が確保されていれば、データD1は表現可能である。すなわち、データを表現するために必要なビット数が確保されていれば、それ以外のビットは不要である。
このようなことから、ブロック最適化処理では、上記必要ビット数に着目して、必要ビット数が同じデータを1つのグループにまとめる。また、必要ビット数が同じでなくても所定の条件を満たす場合には1つのグループにまとめる。以下、図8に示すフローチャートを参照して、ブロック最適化処理の詳細について説明する。
図8は、ステップS109のブロック最適化処理の詳細を示すフローチャートである。
図8に示すように、エンコード部13は、まず、変数iに1をセットする(ステップS301)。変数iは、処理するデータの位置を示し、以降の処理はデータ列のi番目のサンプルデータについて処理が行われる。
次に、エンコード部13は、i+1番目のデータの必要ビット数と現在のブロックの設定ビット数(現在のブロック内の各データのビット数;現在のブロックのブロックヘッダにより定められる「サンプルデータのビット数」)とが等しいか否かを判定する(ステップS302)。なお、1番目のデータは、1番目のブロックに含められる。判定結果が肯定の場合、エンコード部13は、次にステップS303の処理を実行する。一方、判定結果が否定の場合、エンコード部13は、次にステップS304の処理を実行する。
ステップS303において、エンコード部13は、i+1番目のデータを現在のブロックに含める。
図22は、i+1番目のデータの必要ビット数が現在のブロックの設定ビット数と同じ場合に、i+1番目のデータが現在のブロックに含められる様子を示す図である。図22に示すように、データD1〜データD3の必要ビット数(データを表現するために必要なビット数)が「3」である場合、図8に示すブロック最適化処理が行われると、データD1〜データD3が同じブロックに含められる(ステップS303)。この状態において、さらに、4番目のデータであるデータD4について図8に示す処理が行われると、現在のブロックの設定ビット数と、データD4の必要ビット数とが等しいか否かが判定される(ステップS302)。図22に示す例では、これらがともに「3」で等しいため、データD4は、現在のブロックに含められる(ステップS303)。このようにして、必要ビット数が等しいデータが現在のブロックに次々と含められる。
ステップS303の処理の後、エンコード部13は、ステップS307の処理を実行する。
一方、ステップS304において、エンコード部13は、分割判定処理を実行する。ここでは、i+1番目のデータの必要ビット数が現在のブロックの設定ビット数と異なるため、エンコード部13は、i+1番目のデータを現在のブロックと分割するか、又は現在のブロックに含めるかについての判定処理を行う。以下、図9に示すフローチャートを参照して、分割判定処理の詳細について説明する。
図9は、ステップS304の分割判定処理の詳細を示すフローチャートである。
図9に示すように、ステップS401において、エンコード部13は、i+1番目のデータの必要ビット数が現在のブロックの設定ビット数より大きいか否かを判定する。判定結果が肯定の場合(i+1番目のデータの必要ビット数>現在のブロックの設定ビット数)、エンコード部13は、次にステップS402の処理を実行する。一方、判定結果が否定の場合(i+1番目のデータの必要ビット数<現在のブロックの設定ビット数)、エンコード部13は、次にステップS406の処理を実行する。
ステップS402において、エンコード部13は、H<=α×Nが成立するか否かを判定する。ここで、「H」は、上述した図17に示すブロックヘッダBHのサイズ[bit]である。また、「α」は、現在のブロックの設定ビット数とi+1番目のデータの必要ビット数との差分(絶対値)である。また、「N」は、現在のブロックに含まれるデータの数である。
ステップS402の判定結果が肯定の場合(H<=α×Nが成立する場合)、エンコード部13は、ステップS403において、i+1番目のデータを現在のブロックと分割すると決定する。なお、この分割するか否かを決定するための分割条件(H<=αN)の算出根拠については、後述する。
一方、ステップS402の判定結果が否定の場合(H<=α×Nが成立しない場合)、エンコード部13は、ステップS404において、i+1番目のデータを現在のブロックと分割しないと決定する。すなわち、エンコード部13は、i+1番目のデータを現在のブロックに含めると決定する。そして、エンコード部13は、続くステップS405において、現在のブロックの設定ビット数をαだけ拡張する。
図23は、ステップS405における現在のブロックの設定ビット数を拡張する処理を説明するための図である。図23では、現在のブロックにデータD1〜データD3が含まれており、データD4に対する処理が行われる様子が示されている。図23に示すように、現在のブロックの設定ビット数(ブロックに含まれる各データのビット数)が「3」である場合において、データD4の必要ビット数が「4」である場合、H<=α×Nが成立しないため、データD4を分割しないと決定される(ステップS404)。このとき、現在のブロックの設定ビット数が、新たに加えられるデータD4の必要ビット数に拡張される。
具体的には、データD4の必要ビット数が「4」であるため、現在のブロックの設定ビット数も「4」に拡張される。ここでは、新たに加えられるデータD4を表現するためには「4」ビットが必要であるため、新たに加えられるデータD4の必要ビット数に合わせて、現在のブロックの設定ビット数も拡張される。すなわち、既に現在のブロックに属されている他のデータのビット数が、新たに加えられるデータD4の必要ビット数に合わせて拡張される。現在のブロックの設定ビット数が新たに加えられるデータの必要ビット数に合わせて拡張されることにより、既に現在のブロックに属している各データの値は維持され、かつ、新たに加えられるデータの値も表現することができる。
このように、ステップS402における分割条件(H<=αN)を満たすか否かによって、i+1番目のデータを現在のブロックと分割するか(i+1番目のデータを現在のブロックに含めるか)否かが決定される。
ここで、ステップS402における分割条件の算出根拠について、図24を参照して説明する。図24は、i+1番目のデータの必要ビット数が現在のブロックの設定ビット数よりも大きい場合における、分割条件の算出根拠を説明するための図である。
図24において、データD1〜データD3に対する処理が行われて、現在のブロックが形成されているものとする。次のブロックは、仮にデータD4を現在のブロックに含めずに分割した場合の仮のブロックであるものとする。図24に示すように、(A)現在のブロックを次のブロックと分割する場合、2つのブロックの合計サイズは、以下の式(1)によって算出することができる。
2つのブロックの合計サイズ(A)=(H+BN)+{H+M(B+α)} (1)
ここで、「B」は、現在のブロックの設定ビット数を示す。また、「M」は次のブロックに含まれるデータの数を示す。また、上述のように「N」は、現在のブロックに含まれるデータの数であり、「α」は、現在のブロックの設定ビット数と次のブロックの設定ビット数との差である。現在のブロックのデータサイズは、B×Nにヘッダを加えて、H+BNとなる。また、次のブロックの設定ビット数は、現在のブロックの設定ビット数Bよりもαだけ大きく、データの数がM個である。このため、次のブロックのデータサイズは、H+M(B+α)となる。従って、2つのブロックの合計サイズは、式(1)で表すことができる。
一方、(B)現在のブロックと次のブロックとを統合する場合、統合後のブロックのサイズは、以下の式(2)によって算出することができる。
1つのブロックに統合した場合のサイズ(B)=H+(N+M)(B+α) (2)
ここで、2つのブロックの合計サイズ(A)が、1つのブロックに統合した場合のサイズ(B)以下である場合、2つのブロックに分割した方が、全体としてのデータサイズが小さくなる。従って、分割するべき条件は、次の式(3)によって表される。
(H+BN)+{H+M(B+α)}<=H+(N+M)(B+α) (3)
この式(3)を展開することにより、以下の分割条件を示す式(4)が得られる。
H<=αN (4)
ブロックヘッダBHのサイズHは、フレームヘッダによって定められるため、固定である(ここでは、例えばH=11とする)。このため、式(4)に示すように、i+1番目のデータの必要ビット数が現在のブロックの設定ビット数よりも大きい場合の分割条件は、現在のブロックに含まれるデータの数Nと、現在のブロックの設定ビット数及びi+1番目のデータの必要ビット数の差分αと、に依存する。すなわち、i+1番目のデータの必要ビット数が現在のブロックの設定ビット数よりも大きい場合の分割条件は、次のブロックに含まれるデータの数Mには依存しない。
以上のように、i+1番目のデータの必要ビット数が現在のブロックの設定ビット数よりも大きい場合は、エンコード部13は、式(4)に示す分割条件の成否によって、分割すべきか否かを判定する。
図9に戻り、ステップS401の判定結果が否定の場合(i+1番目のデータの必要ビット数<現在のブロックの設定ビット数)、エンコード部13は、ステップS406の処理を実行する。
具体的には、ステップS406において、エンコード部13は、H<=α×Mが成立するか否かを判定する。ここで、「M」は、次のブロックに含まれるデータの数である。また、「H」は、上述した図17に示すブロックヘッダのサイズ(ビット数)である。また、「α」は、現在のブロックの設定ビット数とi+1番目のデータの必要ビット数との差分(絶対値)である。
ステップS406の判定結果が肯定の場合(H<=αMが成立する場合)、エンコード部13は、ステップS403において、i+1番目のデータを現在のブロックと分割すると決定する。
一方、ステップS406の判定結果が否定の場合(H<=αMが成立しない場合)、エンコード部13は、ステップS407において、i+1番目のデータを現在のブロックと分割しないと決定する(すなわち、i+1番目のデータを現在のブロックに含めると決定する)。
このように、ステップS406における分割条件(H<=αM)を満たすか否かによって、i+1番目のデータを現在のブロックと分割するか否かが決定される。
以下、ステップS406における分割条件(H<=αM)の算出根拠について説明する。
図25は、i+1番目のデータの必要ビット数が現在のブロックの設定ビット数よりも小さい場合における、分割条件の算出根拠を説明するための図である。
図25において、図24と同様に、データD1〜データD3に対する処理が行われて、現在のブロックが形成されているものとし、次のブロックは仮のブロックであるものとする。図25に示すように、(C)現在のブロックを次のブロックと分割する場合、2つのブロックの合計サイズは、以下の式(5)によって算出することができる。
2つのブロックの合計サイズ(C)=(H+BN)+{H+M(B−α)} (5)
ここで、「B」、「N」、「M」は上述の通りである。次のブロックの設定ビット数は、現在のブロックの設定ビット数Bよりもαだけ小さいため、次のブロックのデータサイズは、H+M(B−α)となっている。従って、2つのブロックの合計サイズは、式(5)で表すことができる。
一方、(D)現在のブロックと次のブロックとを統合する場合、統合後のブロックのサイズは、以下の式(6)によって算出することができる。
1つのブロックに統合した場合のサイズ(D)=H+(N+M)B (6)
図25に示すように、4番目のデータD4の必要ビット数が現在のブロックの設定ビット数よりも小さい場合、現在のブロックの設定ビット数を拡張しなくても、現在のブロックに含まれるデータ、及び、新たにブロックに追加されるデータD4〜データD7を表現するはできる。逆に、現在のブロックの設定ビット数を新たに追加されるデータD4の必要ビット数に削減すると、現在のブロックに含まれるデータD1〜データD3を表現できなくなる。このため、統合後のブロックの設定ビット数は、維持される。逆に、追加されるデータD4〜データD7は、B−α[bit]で表現可能であるが、統合後のブロックにおいては、B[bit]の領域が確保される。このように、現在のブロックの設定ビット数よりも新たに追加されるデータD4の必要ビット数が小さい場合、式(6)に示すように、統合後のブロックのサイズは、ヘッダHを加えて、H+(N+M)Bとなる。
ここで、分割した場合の2つのブロックの合計サイズ(C)が、分割しない場合のブロックのサイズ(D)以下である場合、2つのブロックに分割した方が、全体としてのデータサイズが小さくなる。従って、分割するべき条件は、次の式(7)によって表される。
(H+BN)+{H+M(B−α)}<=H+(N+M)B (7)
この式(7)を展開することにより、以下の分割条件を示す式(8)が得られる。
H<=αM (8)
ブロックヘッダBHのサイズHは、フレームヘッダによって定められるため、固定である。このため、式(8)に示すように、i+1番目のデータの必要ビット数が現在のブロックの設定ビット数よりも小さい場合の分割条件は、次のブロックのデータ数Mと、現在のブロックの設定ビット数及びi+1番目のデータの必要ビット数の差分αと、に依存する。
ここで、次のブロックのデータ数Mは、ステップS406の分割条件の判定が行われる時点では確定していない。このため、次のブロックのデータ数Mを確定するため、i+1番目のデータからブロック最適化処理を開始して、次のブロックのデータ数Mを算出する。
図26は、次のブロックのデータ数Mが確定される様子を示す図であり、現在のブロックと次のブロックとを分割する様子を示す図である。図26において、データD1〜データD3によって1番目のブロックが生成されており、データD4に対する処理がこれから行われる様子が示されている。データD1〜データD3によって1番目のブロックが生成された後、データD4に対する処理として、データD4の必要ビット数と1番目のブロックの設定ビット数とが比較される。
図26に示すように、データD4の必要ビット数は1番目のブロックの設定ビット数よりも小さい。この場合において、データD4を1番目のブロックに含めるか否かを判定するためには、次のブロックのデータ数Mが必要である。このため、データD4を1番目のブロックに含めるか否かを決定するための処理を中断して、次のブロックのデータ数Mを確定するために、データD4から新たな仮のブロック(2番目のブロック)の生成をスタートする。
データD4〜データD9までは、必要ビット数は「2」でそれぞれ等しいため、データD4〜データD9は2番目のブロックに含められる(上記ステップS303)。次に、データD10を2番目のブロックに含めるか、あるいは、このデータD10を2番目のブロックに含めずに、3番目のブロックに含めるかが判定される。データD10の必要ビット数は「4」であり、2番目のブロックの設定ビット数は「2」であるため、上記ステップS401において「YES」と判定されて、H<=αNが成立するか否かが判定される(ステップS402)。図26に示す例では、α=2、N(2番目のブロックのデータ数)=6であり、H<=αNが成立しているため、2番目のブロックとデータD10とは分割される。この時点で、2番目のブロックのデータ数は「6」に確定する。なお、この時点においても、1番目のブロックと分割されるか、統合されるかは確定していないため、2番目のブロックは「仮のブロック」である。
このようにして、2番目のブロックのデータ数Mが確定したため、データD4に対する処理が再開される。具体的には、H<=αMが成立しているか否かが判定される。1番目のブロックの設定ビット数は「4」であり、2番目のブロックの設定ビット数は「2」であるため、α=2であり、2番目のブロックのデータ数M=6である。従って、H<=αMが成立している(分割条件が成立している)。このため、エンコード部13は、1番目のブロックとデータD4とを分割すると決定する(S403)。すなわち、エンコード部13は、1番目のブロックと2番目のブロックとを分割すると決定する。なお、仮に、H<=αMが成立していなければ(分割条件が成立していなければ)、エンコード部13は、1番目のブロックと2番目のブロックとを分割せずにこれらを1つのブロックに統合して、1番目のブロックとして定義する。
このように、現在のブロックの設定ビット数よりも次のデータ(i+1番目のデータ)の必要ビット数が小さい場合、まず、次のブロックのデータ数が確定されてから、i+1番目のデータを現在のブロックに含めるか否かが判定される。
なお、図26において、データD10の必要ビット数が2番目のブロック(仮のブロック)の設定ビット数よりも小さい場合、エンコード部13は、さらに、データD10から新たなブロックの作成をスタートして、3番目のブロック(仮のブロック)のデータ数を確定する処理を行う。このように、次のブロックを暫定的に生成していき、ブロックに含まれるデータの数を順次確定していく。
ステップS403の処理、ステップS405の処理、又は、ステップS407の処理の後、エンコード部13は、図9に示す分割判定処理を終了して、処理を図8に戻す。
図8に戻り、エンコード部13は、ステップS304の分割判定処理の結果、ブロックを分割すると判定した場合(ステップS305:YES)は、ステップS306の処理を実行する。一方で、ブロックを分割しないと判定した場合(ステップS305:NO)、エンコード部13は、次に、上記ステップS303の処理を実行する。
ステップS306において、エンコード部13は、i+1番目のデータを次のブロックに含める。これにより、現在のブロックが確定され、新たに次のブロックが生成されて、以降では、次のブロックにデータを含めるか否かの処理が行われる。
ステップS306の処理の後、ステップS307において、エンコード部13は、変数iに1を加算する。そして、次のステップS308において、エンコード部13は、iがnより大きいか否かを判定し、判定結果が否定の場合は、再びステップS302の処理を実行する。iがnより大きい場合は、エンコード部13は、図8に示すブロック最適化処理を終了する。
以上のように、ステップS302〜ステップS308の処理が繰り返し行われることによって、n個のサンプルデータに対して処理が行われる。これにより、周波数領域のデータ列が複数のブロックに分割され、それぞれのブロックの最適化が行われる。
具体的には、ブロックを分割した場合のヘッダを含めた全体のデータサイズと、分割しない場合のヘッダを含めた全体のデータサイズとが考慮されて、全体のデータサイズが小さくなる場合の条件に基づいて、分割するか分割しないかが決定される。そして、分割されたブロックごとにデータが圧縮される。より具体的には、ブロックは、同じビット数で表現可能なデータの集合であり、圧縮後では、圧縮前に比べてデータのビット数が削減される。
このようにして、サンプルデータ列が、データの必要ビット数に基づいて複数の可変ブロックに分割されて、余分なビットが削減される。以上の説明から明らかであるが、図8のブロック最適化処理は、図7に示す帯域毎のビット数削減処理とは異なり、各サンプルデータの値を正確に復元可能な可逆変換である。
なお、図8に示すブロック最適化処理は、フレームヘッダFHの領域FH2の値毎に実行される。すなわち、領域FH2に0〜3の値が設定され、各値でのブロック最適化処理が行われる。そして、サイズが最も小さいフレームが選択されて、記憶される。
図27は、フレームヘッダFHの領域FH2の設定値によるデータサイズの違いを示す図である。図27に示すように、領域FH2に値0が設定されると各ブロックに含まれるデータの最大数が128個に定められ、領域FH2に値2が設定されると各ブロックに含まれるデータの最大数が512個に定められる。このとき、図27に示すように、ブロックに含まれるデータの最大数が異なることによって、データを圧縮した場合のフレームの全体サイズが異なる場合がある。
従って、本実施形態においては、フレームヘッダFHの領域FH2に各値(0〜3)を設定してデータを圧縮し、それぞれの圧縮後のデータサイズが最も小さいフレームが選択される。
(デコード処理)
次に、上述のようにして圧縮された圧縮データをデコードする処理について説明する。デコード処理は、上記エンコード処理と逆の処理である。すなわち、エンコード処理によって圧縮されて記憶されたデータがフレーム毎に読み込まれて、上述した処理と逆の処理が行われる。図28は、デコード部15によって行われるデコード処理の流れを示すフローチャートである。
図28に示すように、デコード部15は、まず、圧縮データ記憶部14から1フレームを抽出する(ステップS501)。続いて、デコード部15は、抽出したフレームに含まれる各ブロックのデータを取り出し、1つのデータ列として展開する(ステップS502)。
具体的には、デコード部15は、フレームヘッダFHの領域FH1と、領域FH2とに格納された値を読み取り、フレームのサイズを特定するとともに、ブロックヘッダの「サンプル数」のビット数を特定する。特定されたサンプル数のビット数によって、各ブロックヘッダのサイズが特定される。デコード部15は、先頭のブロックのブロックヘッダBHを読み取って、当該先頭のブロックに含まれるサンプルデータの数を特定するとともに、各サンプルデータのビット数を特定する。そして、デコード部15は、先頭のブロックに含まれる各サンプルデータを抽出する。また、デコード部15は、先頭のブロックのサンプルデータの数と各サンプルデータのビット数によって、次のブロックの区切り位置を特定することができる。これらの処理を先頭のブロックから最後のブロックまで繰り返すことにより、デコード部15は、フレームに含まれるすべてのサンプルデータ(n個の周波数領域のデータ)を抽出して、データ列として展開することができる。
次に、ステップS503において、デコード部15は、ステップS502の処理で得られたデータ列を、符号データ列と絶対値データ列とに分離する。そして、デコード部15は、分離したデータ列を16ビット化する(ステップS504)。ここでは、エンコード処理と逆の処理を行うことにより、各データが、16ビットで表現される。
次に、ステップS505において、デコード部15は、得られた各データを指数化する。すなわち、図6のステップS106における対数化と逆の処理が行われる。続いて、ステップS507において、デコード部15は、分離した符号データ列と絶対値データ列とを結合する。
次に、ステップS508において、デコード部15は、IMDCT(Inverse MDCT;逆修正離散コサイン変換)を実行する。これによって、周波数領域のデータから時間領域のデータに変換される。続いて、デコード部15は、得られた時間領域のデータにハニング窓を掛ける(ステップS509)。そして、デコード部15は、音量を100/v%にする(ステップS510)。このように、1フレームのデコード処理が行われる。
続いて、デコード部15は、圧縮データ記憶部14にデータが無くなったか否かを判定し(ステップS511)、データが無くなっていれば、図28のデコード処理を終了する。データが無くなっていなければ、デコード部15は、再びステップS501の処理を実行する。
以上のようにして、ステップS501〜S511の処理が繰り返し行われることで、圧縮された圧縮データが伸張されて音声として出力される。
なお、上記図6〜図9、及び図28に示したフローチャートにおける各ステップの処理は、単なる一例に過ぎず、同様の結果が得られるのであれば、各ステップの処理順序を入れ替えてもよい。また、各ステップにおいて用いられた値は単なる例示に過ぎず、どのような値が用いられてもよい。また、本実施形態では、上記フローチャートの各ステップの処理をデータ圧縮伸張装置10のCPUが実行するものとして説明したが、上記フローチャートにおける一部又は全部のステップの処理を、CPU以外のプロセッサや専用回路が実行するようにしてもよい。
以上のように、本実施形態では、周波数領域のデータ列が複数の可変ブロックに分割され、ブロック毎に圧縮が行われる。これにより、データ圧縮により好ましいブロックを生成して、データを圧縮することができる。具体的には、ブロックを分割することによって増加するブロックヘッダのサイズを考慮してブロックを分割するか否かを判定し、分割した場合にデータサイズが小さくなる場合は、ブロックを分割する。このため、圧縮したときのデータの全体サイズをより小さくすることができる。
また、本実施形態では、各データの必要ビット数に基づいてブロックを生成し、ブロック内の各データの不要なビットを削減することにより、データの圧縮が行われる。これにより、簡易な計算により複数のデータをブロックにまとめて、データを圧縮することができる。また、本実施形態のブロック最適化処理では必要なビットを残して不要なビットのみを削減するため、可逆的にデータを圧縮することができる。
また、本実施形態では、上記帯域毎のビット数削減処理において、周波数帯域に応じてビット数の削減幅を異ならせた。これにより、必要に応じて特定の周波数帯域のデータについては高い精度でデータを復元できるとともに、それ以外の周波数帯域のデータについては高い圧縮率で圧縮することができる。このようにして、データの劣化を防止しつつ、全体としての圧縮率を向上することができる。
また、本実施形態では、上記帯域毎のビット数削減処理において、複数の手法(第1手法及び第2手法)のうちの何れかの手法によりビット数を削減した。これにより、例えば復号した時により影響が小さい手法を用いてデータを圧縮することができる。
また、本実施形態では、ブロックを分割するか否かについての評価(上記分割条件の判定)が行われて、その結果に基づいてブロックが分割される。このため、例えば、よりサイズが小さくなる方法でブロックを分割することができる。
また、本実施形態では、音声信号が時間領域のデータから周波数領域のデータに変換された後にデータの圧縮が行われるのみならず、周波数領域のデータに変換される前の時間領域のデータについても圧縮が行われる(上記ステップS102)。このため、より圧縮率を高めることができる。
以上のように、本実施形態では例えば音声を圧縮することができる。例えば、人の声の音声信号に対して本実施形態の圧縮方法を用いた場合は、特に有効である。音楽などの音声信号を周波数領域のデータに変換した場合に比べて、人の声の音声信号を周波数領域のデータに変換した場合の方が、偏った周波数帯(高周波数帯域ではない部分)にのみ大きな振幅が現れる傾向にある。また、人の声の場合、高周波数帯域では、比較的振幅が小さくなる傾向にある。このため、結果として同じブロックに属しやすくなり、圧縮効率が上がる。すなわち、人の声の場合、高周波数領域では、少ないビット数で表すことができるデータが出現しやすく、圧縮率の高いブロック(データ数が多く、かつ、ビット数が小さいブロック)が生成されやすい。
なお、上記データ圧縮方法は、任意の情報処理装置において実行されることができる。
例えば、任意の情報処理装置としては、パーソナルコンピュータ、サーバ、スマートフォン、携帯電話、PDA、ゲーム装置、タブレット型コンピュータ等が挙げられる。また、これら複数の装置が相互に接続されることによって構成されるシステムが、上記エンコード処理及びデコード処理を行ってもよい。
(変形例)
上記実施形態で示したデータ圧縮方法に種々の変形が加えられてもよい。
例えば、上記実施形態では、ブロックヘッダBHの領域BH1にブロックに含まれるデータの数(サンプル数)を記憶し、領域BH2に各データのビット数を記憶した。これらの情報に基づいて、データ圧縮伸張装置10は、ブロックの長さを確定する(ブロックの終端位置を特定する)とともに、ブロックに含まれる各データを抽出した。他の実施形態では、例えば、領域BH1にブロックのサイズを示す情報が記憶されてもよい。ブロックのサイズと各データのビット数とに基づいて、データ圧縮伸張装置10は、ブロックの終端位置を特定することができ、また、ブロック内の各データを抽出することができる。また、ブロックヘッダBHにブロックのサイズとブロック内のデータの数とが記憶されてもよい。ブロックのサイズは、ブロックヘッダBHを加えたブロックの全体サイズであってもよいし、ブロックヘッダBHを含まないブロック内の各データの合計サイズであってもよい。また、ブロックヘッダBHにブロックのサイズと、ブロック内のデータの数と、ブロック内の各データのビット数とが記憶されてもよい。すなわち、ブロックの終端位置を特定しつつブロック内の各データを抽出するために必要な情報が、ブロックヘッダBHに記憶されてもよい。
また、上記実施形態では、フレームに含まれる全ブロックのブロックヘッダBHの長さ(領域BH1の長さ)がフレームヘッダFHによって設定された。他の実施形態では、フレームヘッダFHによって、フレームに含まれる複数のブロックヘッダBHに共通の他の情報が指定されてもよい。
また、上記実施形態では、フレームに含まれる全ブロックのブロックヘッダBHに関する情報が、フレームヘッダFHに記憶された。他の実施形態では、フレームに含まれる全ブロックのうちの一部である複数のブロックのブロックヘッダBHに関する情報が、フレームヘッダFHに記憶されてもよい。
また、上記実施形態では、必要ビット数に基づいて各ブロックを圧縮したが、他の実施形態では、各ブロックは任意の圧縮方式(例えばハフマン符号化等)で圧縮されてもよい。
また、いわゆるクラウドコンピューティングのような分散型の広域ネットワークシステムにおいて、上述したデータ圧縮・伸張が行われてもよい。また、分散型のローカルネットワークシステム(近距離に配置された複数の情報処理装置により構成されるシステム。例えば、据置型情報処理装置と携帯型情報処理装置とにより構成されるシステム)において、上述したデータ圧縮・伸張処理が行われてもよい。