以下、本発明の実施形態について図面を参照して詳細に説明する。まず、本発明に係る音響信号の再生装置で再生の対象とする符号化データおよびその作成について説明する。本再生装置の対象とする符号化データは、以下に示す音響信号の符号化装置により、元の音響信号を圧縮符号化することにより得られる。
(1.1符号化装置の構成)
図1は、音響信号の符号化装置の構成図である。図1において、10はブロック分割手段、20は下位固定ビット削除手段、30はチャンネル間演算手段、40はサンプル列再配置手段、50は信号平坦部処理手段、60は相関フレーム検出手段、70は予測誤差変換手段、80は極性処理手段、90は可変長符号化手段、100は符号出力手段である。
図1において、ブロック分割手段10はサンプリングにより得られたサンプル列であるデジタル音響信号を、所定のサンプル数に分割してワークメモリに読み込む機能を有している。下位固定ビット削除手段20は、複数の音響信号を合成する際に、ビット数を合わせるために加えられたとみなされる下位の所定数のビットを削除する機能を有している。チャンネル間演算手段30は、複数のチャンネルからなるサンプル列の各チャンネル間の相関演算を行う機能を有する。サンプル列再配置手段40は、ブロックを構成するサンプル列を録音を基に得られたサンプル列である主サンプル列と主サンプル列を補間することにより得られた副サンプル列とに分離する機能を有している。信号平坦部処理手段50は、各チャンネルごとのサンプル列に対して、信号の値が一定である平坦部を検出し、効率的に符号化する機能を有する。
相関フレーム検出手段60は、各サンプル列に対して、所定の区間をフレームとして設定した後、フレーム間で対応する全てのサンプル値が同一になっている相関フレームを検出し、時間的に後方(未来)に位置する相関フレームを削除する機能を有する。予測誤差変換手段70は、線形予測誤差の手法を用いて、各サンプルの値を予測誤差値に変換する機能を有する。極性処理手段80は、正負の値を補数表現により表した各サンプルのビット列を、正負の極性を表す1ビットと他のビット列に分ける処理を行う機能を有する。可変長符号化手段90は、各サンプルの値を可変ビット長で符号化する機能を有している。符号出力手段100は、各ブロック単位で符号化されたデータおよび上記各手段により得られるデータを、分割されたブロック形態を維持しながら単一の符号化ファイルに出力する機能を有している。図1に示した装置は、実際には、コンピュータおよびコンピュータにインストールされた専用のソフトウェアプログラムにより実現される。
(1.2符号化装置の処理動作)
次に、図1に示した音響信号の符号化装置の処理動作について説明する。まず、ブロック分割手段10が、音響信号を構成するサンプル列の先頭から所定のサンプル数単位でブロック化し、1ブロックごとにワークメモリに読み込む。1ブロックとするサンプル数は、あらかじめ設定しておくことができる。1ブロックとするサンプル数は、音楽の1章節より若干長い程度、すなわち5秒〜10秒程度が好ましい。時間的には同じ長さであっても、サンプリング周波数によりサンプル数が異なるため、設定者が5秒〜10秒程度となるサンプル数をあらかじめ本システムに設定しておく。例えば、符号化対象とする音響信号のサンプリング周波数が48kHzであった場合、1ブロックを10秒とするには、480000サンプルを1ブロックとして設定してやれば良い。ブロック分割手段10は、設定されたサンプル数を1ブロックとして順次ワークメモリに読み込んでいくことになる。
次に、下位固定ビット削除手段20が、1ブロックとして読み込まれたサンプル列の各サンプルの下位の所定数のビットを分離する。これは、量子化ビット数が16ビットのデータを高精細の音響信号と合わせるために24ビットに変換している場合に、冗長な下位ビット成分を削除するために行う。この処理を行わないと、符号化された情報量は3/2倍に増大することになる。また、基になった素材の音響信号が高精細の24ビットで量子化されている場合においても、A/D変換器の性能や編集処理により、冗長な下位ビット成分が特定のブロックのみに発生する場合があり、下位固定ビット削除手段20によりブロック単位で冗長な下位固定ビットの検出と削除を行う処理が有効になることがある。下位ビットが固定でなく有意なデータである場合、下位固定ビットを削除するのではなく分離し、分離された下位ビットデータ配列を出力符号データの一部として別途記録することも可能であり、この場合、後段の予測誤差変換手段70以降の処理負荷が軽減される。この下位固定ビット削除手段20については、動作させるかどうかをあらかじめ設定しておくことができる。
続いて、チャンネル間演算手段30がチャンネル間の相関演算処理を行う。具体的には、まず、同一時刻におけるチャンネルch1のサンプルとチャンネルch2のサンプルの差分演算を行い、差分値をチャンネルch2の新たなサンプル値として記録する。すなわち、元のチャンネルch1のサンプル値をxL、元のチャンネルch2のサンプル値をxRとすると、xch2=xL−xRで算出されたxch2がチャンネルch2のサンプルの新たな値となる。ただし、1ブロックに渡ってxch2の絶対値の総和を算出し、それが、元のチャンネルch2のサンプル値の絶対値の総和よりも大きくなった場合は、チャンネルch2のサンプル値の変更は行わない。これは、本発明がデータの圧縮を目的としているため、データ量が大きくなってしまうと意味がないからである。チャンネルch2の更新が行われたら、チャンネルch1のサンプルの新たな値を算出する。具体的には、算出されたチャンネルch2の新たなサンプル値であるxch2を用いて、xch1=xR+xch2/2で算出する。算出されたxch1がチャンネルch1の新たなサンプル値として記録される。新たなサンプル値xch1は、数学的には、(xL+xR)/2となるが、このようにするとコンピュータによる演算で誤差が生じてしまうため、一旦xch2を算出した後、xch1の算出を行う。
このようにして得られた各チャンネルのサンプル列からは、復号時には、以下のようにすることにより復元することができる。まず、xR=xch1−xch2/2として元のチャンネルch2のサンプル値を復元する。続いて、復元したチャンネルch2のサンプル値xRを用いて、xL=xR+xch2により元のチャンネルch1のサンプル値を復元する。
チャンネル間演算手段30による処理が終わったら、サンプル列再配置手段40がサンプル列の再配置処理を行う。サンプル列再配置手段40による処理は、音響信号として複数の音響信号をミックスしたワークデータを扱う場合に有効である。具体的には、サンプリング周波数48kHz、量子化ビット数16ビットの通常の音響信号や、サンプリング周波数96kHz、量子化ビット数24ビットの高精細の音響信号が混在したものである。このようにサンプリング周波数の異なる音響信号を混在させることにより得られる音響信号は、高精細の音響信号にサンプリング周波数を統一させて扱うことになる。この場合、サンプリング周波数48kHzの音響信号は、サンプリング周波数96kHzの音響信号にサンプル数を合わせるべく隣接するサンプルの平均値などで間を補間していく。
このような音響信号を模式的に示すと図2(a)のようになる。図2(a)において括弧内の数字は、1から昇順に付されたサンプル番号であり、xは、そのサンプルの値を示している。このようなサンプル列に対して、サンプル列再配置手段40は、4通りの処理を行う。1つ目は、奇数番目のサンプルについて、その両隣の偶数番目のサンプルの平均値との差分を演算する。2つ目は、偶数番目のサンプルについて、その両隣の奇数番目のサンプルの平均値との差分を演算する。3つ目は、奇数番目のサンプルについて、直前の偶数番目のサンプルとの差分を演算する。4つ目は、偶数番目のサンプルについて、直前の奇数番目のサンプルとの差分を演算する。各演算後のサンプル列を模式的に示すと、それぞれ図2(b)〜(e)に示すようになる。なお、図2(b)(d)の例では、演算を行わない偶数番目のサンプルを、図2(c)(e)の例では、奇数番目のサンプルを、それぞれ時間的に過去に移動させた状態で示している。
この差分演算の結果、差分値が小さいものが最多となるものを副サンプル列とし、その場合に演算を行わないものを主サンプル列とする。図2の例では、図2(b)〜図2(e)の配列の後半分の各値を比較することになる。例えば、奇数番目のサンプルが両隣接サンプルを利用した補間によって得られたものである場合、図2(b)に示した配列の後半の値が0になる。また、偶数番目のサンプルが両隣接サンプルを利用した補間によって得られたものである場合、図2(c)に示した配列の後半の値が0に近くなる。また、奇数番目のサンプルが直前のサンプルと同一の値で補間されたものである場合、図2(d)に示した配列の後半の値が0になる。また、偶数番目のサンプルが直前のサンプルと同一の値で補間されたものである場合、図2(e)に示した配列の後半の値が0になる。例えば、図2(b)に示す配列の後半に0近辺の値が多い場合、偶数番目のサンプルの集合を主サンプル列、奇数番目のサンプルの集合を副サンプル列として分離する。
また、サンプル列再配置手段40の処理においては、図2(b)〜(e)に示したように主サンプルを時間的に過去に移動し、副サンプルを時間的に未来に移動させるようにしても良いが、主サンプルと副サンプルを分離して扱うようにしても良い。例えば、奇数番目が副サンプルの場合には、図2(f)に示すように主サンプルと副サンプルを分離する。本実施形態では、本来のサンプルを利用して補間することにより得られたサンプルを含んだサンプル列に対して線形予測を行うことにより、逆にデータ量が増えてしまうことを防ぐために、主サンプル列と副サンプル列を区別している。そのため、主サンプル列と副サンプル列に対して、別々に線形予測を行うことができれば、図2(b)〜(e)に示したような1つのサンプル列であっても、図2(f)に示したような2つのサンプル列であっても良い。
次に、信号平坦部処理手段50が、サンプル列に対して、信号平坦部の処理を行う。信号平坦部とは、同一の信号レベルが連続する部分のことをいう。特に信号レベルが「0」の無音部、および信号レベルの絶対値が最大の飽和部に現れることが多い。無音部は実際に無音であるか、音が非常に小さく記録されなかった場合に生じるが、飽和部は、信号の録音およびA/D変換の過程において生じる。無音部、飽和部またはそれ以外の同一信号レベルが連続する場合のいずれであっても、信号平坦部は、同一の信号レベルが所定の時間(所定のサンプル数)連続して記録される。このため、この部分は圧縮し易いデータになっている。具体的には、信号平坦部の先頭時刻位置と、同一信号レベルが続くサンプルの個数と、信号レベル(サンプル値)の3つの値を信号平坦部データとして各チャンネルのサンプル列と分離して記録する。各チャンネルのサンプル列からは、信号平坦部が削除される。これを模式的に示すと図3(a)(b)に示すようになる。図3(a)は、信号平坦部処理前のサンプル列である。図3(a)において、網掛けで示した部分は信号平坦部を示す。信号平坦部処理手段50の処理により、信号平坦部は元のサンプル列からは分離され、図3(b)に示すようになる。ただし、復号時に元通りに復元するために、分離された信号平坦部は、図3(c)に示すような形式で記録しておく。
信号平坦部データは、上述のように、信号平坦部ごとに、その先頭時刻(サンプル番号)、サンプル数、サンプル値の3属性で記録する。ここで、先頭時刻とは、信号の開始位置からの時刻であり、図3(c)の例では、先頭からのサンプル番号で記録している。上述のように、サンプル番号をサンプリング周波数で除算すれば、時刻に変換されることになる。サンプル数は、そのサンプル値がどの程度連続して続くかを示す情報である。なお、サンプル数の代わりに信号平坦部の終了時刻を記録するようにしても良い。サンプル値は、デジタル化された信号レベルを示している。ここでは、16ビットで量子化しているので、最大値は「32767」、最小値は「−32768」となる。すなわち、「0」は無音部、「32767」および「−32768」は飽和部を示している。ただし、信号平坦部を無条件には処理しない。ここでは、データの圧縮を目的としているため、サンプル列の削減分よりも信号平坦部データが大きくなると意味がないからである。したがって、信号平坦部となるサンプルが所定数以上連続する場合に限り信号平坦部データを作成して各チャンネルのサンプル列から分離するのである。
続いて、各チャンネルのサンプル列に対して、相関フレーム検出手段60が、所定の区間長をもつフレームを設定して、設定されたフレーム間の比較を行う。本実施形態では、フレーム長をサンプル列の開始時刻から終了時刻までの全区間に渡って固定長としている。具体的には、1フレームを512サンプルとしている。相関フレーム検出手段60は、各チャンネルのサンプル列の先頭から512サンプルずつを1フレームとして設定し、フレーム間で全サンプルが一致する相関フレームを求めていくことになる。具体的な手順を図4のフローチャートに従って説明する。
まず、相関フレーム検出手段60は、所定のサンプル数単位でフレーム化を行う(ステップS1)。本実施形態では、どのブロックにおいてもフレーム長を固定長512サンプルとしている。相関フレーム検出手段60は、図5(a)に示すように、各ブロックにおいて、サンプル列の先頭から512サンプルずつを1フレームとして設定していくことになる。
次に、各フレームに対して構成するサンプル値が全て一致するフレームを探索する。具体的には、図5(b)に示すように、まず、設定されたフレームのうち、ブロック内の時間的に最後尾のフレームを、相関フレームを探すための対象フレームとする。次に、所定の探索範囲内において、対象フレームの先頭サンプルの値と同一の値をもつサンプルを、時間的に遡りながら探索していく(ステップS2)。例えば、図6(a)に示すように、対象フレームがmT〜mT+511の512個のサンプルで構成されているとする。この場合、まず、対象フレームの先頭サンプルmTのサンプル値x(mT)と同一となるサンプルを探索していく。さらに、サンプルmT−1、サンプルmT−2と順に探索していく。なお、図6において、mは先頭からm番目のフレームであることを示し、Tはフレーム長(本実施形態では512サンプル)を示している。
一致するサンプルtが見つかったら(ステップS3)、次に、そのサンプルtの次のサンプルt+1と対象フレームの2番目のサンプルmT+1が一致するかどうかを比較する。このようにしてサンプルの値が一致する限り後続するサンプル同士の比較を行っていく(ステップS4)。ステップS4においては、x(t+p)とx(mT+p)の値が一致する限り、処理を繰り返していく。例えば、図6(b)に示す例では、x(t)〜x(t+8)がx(mT)〜x(mT+8)と一致しているので、さらにp=9として、ステップS4の処理が続けられることになる。p=0〜p=511までの全てのx(t+p)とx(mT+p)が一致した場合(ステップS5)、そのサンプル列を対象フレームに対する相関フレームとし、相関フレームの先頭のサンプル番号と対象フレームの先頭のサンプル番号とを対応付けてフレーム相関データとして記録し、対象フレームを元のサンプル列から削除する(ステップS6)。対象フレームの全サンプルと一致しなければ、さらに対象フレームの先頭サンプルと値が一致するサンプルが存在するかどうかを時間的に遡りながら探索していく。所定のサンプル数分遡っても一致する相関フレームが存在しない場合は、その対象フレームに関する相関フレームの探索を中止し、対象フレームの直前のフレームを新たな対象フレームとして相関フレームの探索を行う。1つの対象フレームに対しての処理が終わったら、ステップS2に戻って、1つ直前のフレームを新たな対象フレームとして処理を続けていく(ステップS7)。このようにして、ブロック内の先頭サンプル近辺に位置するフレームを除く全フレームを対象フレームとして相関フレームの検出処理を行う。
ブロック内のサンプル列全体でみると、図5(c)に示すように対象フレームに対応する相関フレームが検出されたとすると、図5(d)に示すように対象フレームが削除されることになる。このとき、復号時に完全に復元できるように図5(e)に示すようなフレーム相関データが記録される。図5(e)に示すように、フレーム相関データには対象フレームの先頭のサンプル番号と相関フレームの先頭のサンプル番号が対応づけて記録される。
続いて、サンプル列(サンプル列再配置手段40による処理を行った場合は主サンプル列、副サンプル列)の各サンプルの値を、予測誤差変換手段70が予測誤差値に変換する。あるサンプルにおける予測誤差値の算出は、時間的に過去に位置する直前の1つもしくは複数のサンプルの値を利用して行われる。本実施形態では、利用する直前のサンプル数を動的に変化させる手法を用いている。以下に、このような適応型線形予測符号化について説明する。予測誤差変換手段70により行われる適応型線形予測符号化の処理概要を図7のフローチャートに示す。まず、あらかじめ準備された複数の予測計算式を用いて、各予測計算式に対応した線形予測誤差を算出する(ステップS11)。具体的には、サンプル番号tの予測誤差を算出する予測計算式として、以下の〔数式1〕〜〔数式11〕を用意している。
〔数式1〕
e0(t)=x(t)−e0(t−1)/2
〔数式2〕
e1(t)=x(t)−a11・x(t−1)−e1(t−1)/2
〔数式3〕
e2(t)=x(t)−a21・x(t−1)−a22・x(t−2)−e2(t−1)/2
〔数式4〕
e3(t)=x(t)−a31・x(t−1)−a32・x(t−2)−a33・x(t−3)−e3(t−1)/2
〔数式5〕
e4(t)=x(t)−a41・x(t−1)−a42・x(t−2)−a43・x(t−3)−a44・x(t−4)−e4(t−1)/2
〔数式6〕
e5(t)=x(t)−a51・x(t−1)−a52・x(t−2)−a53・x(t−3)−a54・x(t−4)−a55・x(t−5)−e5(t−1)/2
〔数式7〕
e6(t)=x(t)−b11・x(t−1)−e6(t−1)/2
〔数式8〕
e7(t)=x(t)−b21・x(t−1)−b22・x(t−2)−e7(t−1)/2
〔数式9〕
e8(t)=x(t)−b31・x(t−1)−b32・x(t−2)−b33・x(t−3)−e8(t−1)/2
〔数式10〕
e9(t)=x(t)−b41・x(t−1)−b42・x(t−2)−b43・x(t−3)−b44・x(t−4)−e9(t−1)/2
〔数式11〕
e10(t)=x(t)−b51・x(t−1)−b52・x(t−2)−b53・x(t−3)−b54・x(t−4)−b55・x(t−5)−e10(t−1)/2
上記〔数式1〕〜〔数式11〕において、e0(t)〜e10(t)は各予測計算式による時刻tのサンプルにおける予測誤差であり、x(t)〜x(t−5)は時刻t〜t−5におけるサンプル値である。
上記〔数式3〕における「a21・x(t−1)+a22・x(t−2)」、上記〔数式4〕における「a31・x(t−1)+a32・x(t−2)+a33・x(t−3)」、上記〔数式5〕における「a41・x(t−1)+a42・x(t−2)+a43・x(t−3)+a44・x(t−4)」、上記〔数式6〕における「a51・x(t−1)+a52・x(t−2)+a53・x(t−3)+a54・x(t−4)+a55・x(t−5)」、上記〔数式8〕における「b21・x(t−1)+b22・x(t−2)」、上記〔数式9〕における「b31・x(t−1)+b32・x(t−2)+b33・x(t−3)」、上記〔数式10〕における「b41・x(t−1)+b42・x(t−2)+b43・x(t−3)+b44・x(t−4)」、上記〔数式11〕における「b51・x(t−1)+b52・x(t−2)+b53・x(t−3)+b54・x(t−4)+b55・x(t−5)」は過去の2〜5個のサンプルに基づく線形予測成分である。この線形予測成分、および、直前のサンプルにおいて算出された予測誤差「e1(t−1)/2」〜「e10(t−1)/2」(誤差フィードバック成分)を用いて時刻tにおける予測誤差e0(t)〜e10(t)を算出する。
上記の係数a11〜a55には初期値として、a11=1、a21=2、a22=−1、a31=3、a32=−3、a33=1、a41=4、a42=−6、a43=4、a44=−1、a51=5、a52=−10、a53=10、a54=−5、a55=1という値が各々設定されており、上記の係数b11〜b55には初期値として、b11=1、b21=2、b22=−1、b31=3、b32=−3、b33=1、b41=4、b42=−6、b43=4、b44=−1、b51=5、b52=−10、b53=10、b54=−5、b55=1という値が各々設定されている。本実施形態では、これらの係数を設定されたモードに応じて動的に変化させる。図8に本システムで設定可能な線形係数の設定モードを示す。図8において、「初期固定値」とはブロック内の全サンプルについて上記初期値をそのまま用いることを示している。「初期最適値算出」とは、ブロック内のサンプル列全体を通して最適な値を算出し、算出した値をブロック内の全サンプルについて用いることを示している。「ユーザ設定初期固定値」とは、ユーザが独自に設定した値をブロック内の全サンプルについて用いることを示している。「逐次最適値算出」とは、上記初期値を利用して所定のサンプル数単位で係数を更新していくことを示している。本実施形態では、モード2を利用してaij系列の係数を「初期固定値」とし、bij系列の係数を「逐次最適値算出」とする。ここで、「逐次最適値算出」について説明する。「逐次最適値算出」は、具体的には、Levinson-Durvinのアルゴリズムを利用した以下の〔数式12〕を用いて係数b11〜b55を決定する。
〔数式12〕
φ(k)=1/(N−K)・Σj=1,N-Kx(j)・x(j+k)
ki=−{φ(i)+Σj=1,i-1bj(i-1)・φ(i-j)}/E(i-1)
bi(i)=ki
bj(i)=bj(i-1)+ki・bi-j(i-1) ただし、1≦j≦i−1
E(i)=(1−ki 2)E(i−1)
上記〔数式12〕において、φ(k)は、N個のサンプルx(j)(j=1,…,N)において、最大値K(上記例では5)の範囲でkサンプルシフトさせたサンプル列との自己相関値である。なお、NはKに対して十分大きな数値をとっている(例えばK=5の場合、N=32768)。〔数式12〕は、i=1からi=Kまで再帰的に繰り返し、最終的に得られたbj(K)が過去K個のサンプルに対応する係数になるとともに、各フェーズにおいて得られた中間結果であるbj(i)が係数bijとなる。ステップS1においては、上記〔数式12〕により決定した係数を用いて、〔数式7〕〜〔数式11〕の各計算式で計算を行うことになる。〔数式12〕による計算は、実際には後述するステップS17において行われるものである。また、係数を決定するには、過去の数サンプル分の値を必要とするので、初めのN−1サンプルについては、上記の初期係数で〔数式7〕〜〔数式11〕の計算を行うことになる。
図7のフローチャートに戻って、上記各予測計算式別の予測誤差値の絶対値の累積である累積誤差が最小となる線形予測誤差をそのサンプルの予測誤差として選出する(ステップS12)。ここでは、累積誤差という考え方を用いている。具体的には、各予測計算式〔数式1〕〜〔数式11〕により算出された予測誤差の過去のサンプルについての累積値をA0〜A10として設定する。そして、この累積誤差A0〜A10のうち、最小となるものに対応する予測誤差を選出する。例えば、A0〜A10のうち、A2が最小であったとする。この場合、〔数式3〕で算出された予測誤差e2(t)を符号化対象とする予測誤差e(t)として選出することになる。選出された予測誤差e(t)はサンプルの元の値x(t)と置き換えられて以降処理が行われることになる。
続いて、累積誤差A0〜A10に各予測誤差e0(t)〜e10(t)の絶対値を加算する(ステップS13)。具体的には、以下の〔数式13〕に示すように、累積誤差値となる変数A0〜A10を更新していく。同時に、各サンプルの処理を行う度に、カウンタC1、C2を1つづつ加算していく処理を行う。
〔数式13〕
A0←A0+|e0(t)| A1←A1+|e1(t)|
A2←A2+|e2(t)| A3←A3+|e3(t)|
A4←A4+|e4(t)| A5←A5+|e5(t)|
A6←A6+|e6(t)| A7←A7+|e7(t)|
A8←A8+|e8(t)| A9←A9+|e9(t)|
A10←A10+|e10(t)|
続いて、カウンタC1が所定回数を超えたかどうかの判定を行う(ステップS14)。本実施形態では、この所定回数を100回として設定している。すなわち、カウンタC1が100を超えたかどうかの判定を行う。
この結果、カウンタが100を超えていたら、累積誤差を半分にする(ステップS15)。具体的には、以下の〔数式14〕に示すように、累積誤差となる変数A0〜A10を2で除算する。同時に、カウンタC1を0にリセットする。すなわち、ここでのA0〜A10は純粋な意味での累積誤差ではなく、累積誤差の移動平均となっている。本実施形態では、直前の最大100サンプルまでは累積されるが、それ以前のものは半分になるように処理する。これにより、時間的に離れたサンプルの影響が小さくなるようにしている。
〔数式14〕
A0←(A0)/2 A1←(A1)/2
A2←(A2)/2 A3←(A3)/2
A4←(A4)/2 A5←(A5)/2
A6←(A6)/2 A7←(A7)/2
A8←(A8)/2 A9←(A9)/2
A10←(A10)/2
続いて、カウンタC2が所定回数を超えたかどうかの判定を行う(ステップS16)。本実施形態では、この所定回数を32768回として設定している。すなわち、カウンタC2が32768を超えたかどうかの判定を行う。
この結果、カウンタC2が32768を超えていたら、係数b11〜b55の再計算を行う(ステップS17)。具体的には、上記〔数式12〕を用いて、係数b11〜b55を計算し直すことになる。同時に、カウンタC2を0にリセットする。
上記ステップS11〜ステップS17の処理をブロック内のサンプル列の全サンプルに渡って実行することにより、全サンプルの値が元の振幅値x(t)から対象誤差e(t)に置き換えられることになる。本実施形態では、特に、複数の予測式の係数を動的に変化させることにより、より精度の高い予測誤差を算出することが可能になる。
続いて、極性処理手段80が、ブロック内の各サンプルの正負極性処理を行う。上記予測誤差変換手段70により各サンプルの値は、振幅値から予測誤差に置き換えられたが、各サンプルのビット形式は、当初のままである。通常、コンピュータ等の計算機で演算される場合は、各データは32ビット単位で処理され、2の補数表現を用いて表現されている。これを、正負の符号付き絶対値表現に変換し、なおかつ、その絶対値部分を上位に1ビット移動させ、正負の符号ビットをLSB(最下位ビット)に移動させる。極性処理手段80によるビット構成の変換の様子を模式的に示すと図9のようになる。図9(a)は処理前のビット構成であり、図9(b)は処理後のビット構成である。このように正負の符号ビットをLSBに移動させるのは、後の可変長符号化手段90の処理で、各サンプルのビット長を検出し易くするためである。
次に、可変長符号化手段90が、各サンプルを可変長に変換する処理を行っていく。本実施形態における可変長符号化は、一般にゴロム符号化と呼ばれる方式を採用している。具体的には、1サンプルを構成するビット成分を上位ビット成分と下位ビット成分に分け、下位ビット成分は変更を加えずそのままとし、上位ビット成分は、上位ビットだけを十進数変換した数値分のビット「0」を並べ、最後にセパレータビット「1」を加えた配列とする。例えば、8ビットのビット成分「00101000」を考えてみる。このとき、下位ビット成分を4ビットとすると、下位ビット成分は「1000」となる。上位ビットは「0010」であるため、これを十進数変換した「2」個分の「0」を配列して最後に「1」を加えた「001」に変換される。この結果、8ビットのビット列「00101000」は、7ビットのビット列「0011000」に変換されることになる。本実施形態では、変換の前後でビット成分を不変とする下位ビット成分のビット長を各サンプルで可変とするようにしている。
以下、可変長符号化手段90が行う処理を具体的に説明していく。図10は可変長符号化の概要を示すフローチャートである。まず、過去のサンプルのビット長の移動平均である平均ビット長Bfを算出する(ステップS21)。平均ビット長Bfは、過去のビット長の累積値である累積ビット長RBを、過去のサンプル数を基にしたカウンタC3で除算することにより求められる。すなわち、Bf=RB/C3で算出される。累積ビット長RBは、初期状態では0であるので、t=1のサンプルを処理する場合には、t=1のサンプルのビット長Bd(t)を初期値として設定しておく。また、初期のカウンタC3=1と設定する。
続いて、時刻tにおけるサンプルのビット長Bd(t)を算出する(ステップS22)。t=2以降のサンプルについては、平均ビット長Bfの算出後、サンプルのビット長Bd(t)を算出する。このビット長Bd(t)は、上記極性処理手段80によりビット構成の変換を行ったことにより算出し易くなっている。図9(b)に示したようなビット構成に変換したことにより、各サンプルのビット構成において先頭にビット「1」が出現したところからがビット長となる。次に、変更部のビット長Bvを算出する(ステップS23)。これは、上記サンプルのビット長Bd(t)から平均ビット長Bfを減じることにより算出される。続いて、データの符号出力を行う(ステップS24)。具体的には、上位Bvビットを十進数変換した数値分だけ「0」を出力した後、セパレータビット「1」を出力し、下位Bfビットを不変部として出力する。符号出力は、ハードディスク、CD−R等の外部記憶装置への記録として行われることになる。次に、累積ビット長RBにビット長Bd(t)を加算する(ステップS25)。同時に、各サンプルの処理を行う度に、カウンタC3を1つずつ加算していく処理を行う。続いて、カウンタC3が所定の数を超えたかどうかを判定する(ステップS26)。所定の数としては、ここでも100程度を設定している。そのため、カウンタ4が100を超えたかどうかを判断することになる。この結果、カウンタが100を超えていたら、累積ビット長RBを半分にする(ステップS27)。具体的には、累積ビット長となる変数RBを2で除算する。同時に、カウンタC3を1/2にする。上記のようにして、各サンプルについて可変ビット長での符号化が行われて行く。
続いて、符号出力手段100が、可変長符号化手段90から出力された各ブロックの可変長符号化データを、分割されたブロック形態を維持しながら、上記各手段により得られた各データと共に、1つの符号化ファイルに順次収録していく。
(1.3符号化データの構造)
以上のようにして得られた符号化データは、コンピュータに接続されたハードディスク等の記憶装置等に随時記憶され、その後、必要な記憶媒体に対応するフォーマットで記憶される。ここで、最終的に得られた符号化データの全体構成の概略を図11に示す。図11(a)は全体の概略構成、図11(b)はブロック単位の符号化データの概略構成、図11(c)は各ブロックにおけるチャンネル単位の符号化データの概略構成となっている。図11(a)に示すように、全体の符号化データとしては、高速モード識別データ、ブロック数、ブロック長、各ブロック単位の符号化データが記録されている。高速モード識別データとは、高速モードか通常モードかを示す1ビットのデータであり、高速モードである場合は、ブロック分割を行わずに、単一サンプルごとにワークメモリを用いずに符号化処理を行う。本発明による処理は、通常モードである場合に行われる。ブロック数は、符号化データの全ブロック数を示す2バイトのデータである。ブロック長は、1ブロック内のサンプル数を示す4バイトのデータである。符号化データ1〜nは各ブロックの符号化データである。
図11(b)に示すように、各ブロックの符号化データとしては、符号化条件パラメータ、各チャンネルデータが記録されている。符号化条件パラメータは、各ブロックごとの符号化条件パラメータを記録した最大73ビットのデータである。符号化条件パラメータとしては、下位固定ビット削除手段20による下位固定ビットの削除・分離を行ったか、行った場合は削除・分離のどちらを行ったか、サンプル列再配置手段40によるサンプル列の再配置を行ったかどうか、信号平坦部処理手段50による処理を行ったか、相関フレーム検出手段60による処理を行ったか、予測誤差変換手段70における線形係数の更新間隔はどの程度か等がある。各チャンネルデータは、各チャンネルごとの符号化データであり、本実施形態のように、ステレオ音響信号を符号化した場合は、図11(b)に示すように、2チャンネル分記録される。
図11(c)に示すように、各チャンネルの符号化データとしては、下位固定ビットデータ、サンプル再配置状態、信号平坦部データ、フレーム相関データ、予測誤差可変長符号化データが記録されている。下位固定ビットデータは、下位固定ビット削除手段20により削除せずに分離した場合に記録されるものである。サンプル再配置状態は、図2(b)〜図2(e)に示した4つの状態のうちいずれの状態であるかを示す2ビットのデータである。信号平坦部データは、信号平坦部処理手段50により得られた図3(c)に示すようなデータである。フレーム相関データは、相関フレーム検出手段60により得られた図5(e)に示すようなデータである。予測誤差可変長符号化データは、可変長符号化手段90により得られた可変長の符号化データである。以上のような符号化処理により、符号化条件パラメータを所定の区間ごとに変更可能であると共に、大容量のデータであっても符号化することが可能となる。
(2.本再生装置利用のための音響信号の加工)
上記のようにして得られた符号化データを、本発明に係る音響信号の再生装置で再生することになる。本発明に係る音響信号の再生装置では、上記符号化装置により符号化された音響信号を複数合成して再生する。この合成をスムーズに行うためには、合成対象とする符号化データの各再生時間が同一となるように加工する必要がある。これは、1つの符号化データを基準として、他の符号化データのサンプル数を、基準とした符号化データに合うように補間するようにして増加させることにより行う。また、本実施形態では、再生する利用者が、自由に音楽の構成を変化させることが可能なように、各符号化データをメロディ、コード、リズム等のパートに分けて作成している。各符号化データは、それぞれ図11に示した構造となる。
(3.音響信号の再生)
以下、本発明に係る音響信号の再生装置について説明する。
(3.1再生装置の構成)
図12は、本発明に係る音響信号の再生装置の一実施形態を示す構成図である。図12において、1は圧縮ブロック読込手段、2はブロック復号手段、3は合成比率設定手段、4は波形合成処理手段、5は合成ブロック蓄積手段、6はサウンドデバイスドライバ、7はサウンドデバイス、8はタイマーである。
圧縮ブロック読込手段1は、圧縮された符号化データファイルから、圧縮ブロック単位でデータの読み込みを行う機能を有している。ブロック復号手段2は、読み込んだ圧縮ブロックを復号して、圧縮符号化前の状態である非圧縮ブロックに復元する機能を有している。合成比率設定手段3は、複数の非圧縮ブロックをどの程度の比率で合成するかを設定する機能を有している。波形合成処理手段4は、ブロック復号手段2で復号された複数の非圧縮ブロック、いわゆるデジタルの波形データを合成比率設定手段3で設定された合成比率で合成する機能を有している。合成ブロック蓄積手段5は、合成された合成ブロックを蓄積するバッファメモリを複数有しており、これらのバッファメモリに蓄積された合成ブロックを、FIFO(ファーストイン・ファーストアウト)方式、すなわち、先に入ってきた情報が、先に出ていく方式で処理する機能を有している。すなわち、合成ブロック蓄積手段5は、波形合成処理手段4から投入された合成ブロックを投入された順序で蓄積し、その順序でサウンドデバイスドライバ6に渡す機能を有することとなる。サウンドデバイスドライバ6は、サウンドデバイス7を駆動させて合成ブロックを音響再生する機能を有しており、サウンドデバイス7は、デジタルデータである合成ブロックをD/A変換して音声として再生する機能を有している。すなわち、サウンドデバイスドライバ6およびサウンドデバイス7は合成ブロック再生手段として機能することになる。タイマー8は、サウンドデバイスによる音響信号の再生と、外部機器の音響信号の再生とのタイミングをとるために利用するタイマーであり、コンピュータにおいて時刻管理を行うタイマーと共用されている。
(3.2再生装置の処理動作)
続いて、図12に示した再生装置の処理動作について説明する。まず、再生装置の利用者は、合成比率設定手段3により複数の符号化データの合成比率を設定する。具体的には、再生装置に接続された表示装置に、図13に示すような設定画面を表示させ、この設定画面上で利用者に設定させることになる。図13においては、5トラックが選択できるようになっており、トラック名の左側にはチェック欄が設けられると共に、トラック名の右側には音量指定欄、再生ファイル名入力欄が設けられている。図13の例では、5トラック全てにチェックが付いた状態を示しており、これにより5トラック分の符号化データを読み込み、合成することになる。また、図13の例では、音量指定が5トラック全て最大値「100」となっており、5つの符号化データが同比率で合成されることになる。再生ファイル名入力欄には、復号・合成して再生する音響信号が圧縮された符号化データファイルを入力する。利用者は、図13に示すような設定画面において、使用するトラック、トラック別の音量、再生ファイル名(符号化データファイル名)を設定する。設定されたトラック別の音量は、各トラックとして設定された符号化データの合成比率として合成比率設定手段3から波形合成処理手段4に与えられることになる。また、設定された再生ファイル名に対応する符号化データが圧縮ブロック読込手段1により読み込まれることになる。
符号化データである圧縮サウンドデータは図11に示したような構造となっており、ブロック単位で記録されているため、まず、圧縮ブロック読込手段1が符号化データをブロック単位で読み込む。
続いて、ブロック復号手段2が読み込んだ符号化データをブロック単位で復号する。復号処理は、基本的には上記符号化装置で行った処理の逆の処理を行うことにより実現される。ここで、復号処理の特徴的な部分について以下に説明する。まず、ブロック復号手段2は、読み込んだビット列のどの部分が変更部であるか、およびどの部分が不変部であるかを判断して、固定ビット長のサンプルを復元する。
ここで、固定ビット長サンプル復元処理の概要を図14のフローチャートに示す。まず、入力された符号データのビット列から変更部に相当するビット列を抽出し、固定長に復号する(ステップS31)。入力されたビット列は、先頭から0が続き、1が出現する。これは、上記符号化のときに、そのような規則で可変長符号化したためである。そのため、ブロック復号手段2は「1」が出現したときのビット列を、符号化時と逆の規則で復号する。例えば「0011000…」というビット列が来た場合に、最初に「1」が出現した「001」までを変更部と判断し、「0」が2個続いているので、「2」の二進数表現「0010」(4ビットの場合)に復号する。
次に、過去のサンプルのビット長の移動平均である平均ビット長Bfを算出する(ステップS32)。これは、上記可変長符号化のステップS21の処理と全く同じ処理である。続いて、不変部のビット列を抽出する(ステップS33)。これは、算出された平均ビット長Bf分のビット列を抽出することにより行う。例えば、上記のような「0011000…」というビット列で、「001」までが変更部であったとし、Bf=4であったとすると、続く「1000」が不変部として抽出される。
続いて、ステップS31で復号された変更部のビット列とステップS33で抽出された不変部のビット列を連結して固定長のサンプルを出力する(ステップS34)。固定長に復元されたサンプルは、別途極性復元処理が行われる。次に、累積ビット長RBにビット長Bd(t)を加算する(ステップS35)。同時に、各サンプルの処理を行う度に、カウンタCを1つづつ加算していく処理を行う。続いて、カウンタCが所定の数を超えたかどうかを判定する(ステップS36)。所定の数としては、ここでも100程度を設定している。そのため、カウンタが100を超えたかどうかを判断することになる。この結果、カウンタが100を超えていたら、累積ビット長RBを半分にする(ステップS37)。具体的には、累積ビット長となる変数RBを2で除算する。同時に、カウンタCを1/2にする。ステップS35〜ステップS37の処理は、上記符号化装置の可変長符号化手段90によるステップS25〜ステップS27の処理と全く同じである。
上記処理により固定長のサンプルが出力されたら、次に、ブロック復号手段2が、各誤差サンプルの正負極性を復元する。これは、上記符号化装置の極性処理手段80が行った処理の逆を行うことになる。具体的には、正負の符号ビットをMSB(最下位ビット)に移動させ、絶対値部分を下位に1ビット移動させた後、正負の符号付き絶対値で表現されているサンプル値を2の補数を用いた表現に変換する。ビット構成の変換の様子を模式的に示すと図9(b)に示したビット構成から図9(a)に示したビット構成に変換することになる。この処理によりコンピュータによる算術演算を行い易いビット構成となる。
また、ブロック復号手段2は、予測誤差値が記録されている誤差サンプルの値を過去のサンプル値に依存しない独立した値に復元する。この独立したサンプルへの復元処理の概要を図15のフローチャートに示す。まず、あらかじめ準備された複数の予測計算式のうち、どの予測計算式を適用するかを決定する(ステップS41)。予測計算式は、符号化時に利用された上記〔数式1〕〜〔数式10〕のいずれかを用いることになる。〔数式1〕〜〔数式11〕のいずれを選択するかについては、各予測式に対応した累積誤差値に基づいて行う。累積誤差A1〜A10は、符号化時に用いたものと同じであり、初期状態では全て0となる。
上記〔数式1〕〜〔数式11〕において、e0(t)〜e10(t)は各予測計算式による時刻tのサンプルにおける予測誤差であり、x(t)〜x(t−5)は時刻t〜t−5におけるサンプル値である。
上述のように、上記〔数式3〕における「a21・x(t−1)+a22・x(t−2)」、上記〔数式4〕における「a31・x(t−1)+a32・x(t−2)+a33・x(t−3)」、上記〔数式5〕における「a41・x(t−1)+a42・x(t−2)+a43・x(t−3)+a44・x(t−4)」、上記〔数式6〕における「a51・x(t−1)+a52・x(t−2)+a53・x(t−3)+a54・x(t−4)+a55・x(t−5)」、上記〔数式8〕における「b21・x(t−1)+b22・x(t−2)」、上記〔数式9〕における「b31・x(t−1)+b32・x(t−2)+b33・x(t−3)」、上記〔数式10〕における「b41・x(t−1)+b42・x(t−2)+b43・x(t−3)+b44・x(t−4)」、上記〔数式11〕における「b51・x(t−1)+b52・x(t−2)+b53・x(t−3)+b54・x(t−4)+b55・x(t−5)」は過去の2〜5個のサンプルに基づく線形予測成分である。この線形予測成分、および、直前のサンプルにおいて算出された予測誤差「e1(t−1)/2」〜「e10(t−1)/2」(誤差フィードバック成分)を用いて時刻tにおけるサンプルe(t)の値を、上記ステップS41で決定したいずれかの予測式にe1(t)〜e10(t)のいずれかとして代入し、x(t)を算出する(ステップS42)。
続いて、累積誤差A1〜A10に各予測誤差e1(t)〜e10(t)の絶対値を加算する(ステップS43)。具体的には、符号化装置においても用いた上記〔数式13〕に示したように、累積誤差値となる変数A1〜A10を更新していく。同時に、各サンプルの処理を行う度に、カウンタを1つづつ加算していく処理を行う。
続いて、カウンタが所定回数を超えたかどうかの判定を行う(ステップS44)。本実施形態では、この所定回数を100回として設定している。すなわち、カウンタが100を超えたかどうかの判定を行う。
この結果、カウンタが100を超えていたら、累積誤差を半分にする(ステップS45)。具体的には、符号化装置においても用いた上記〔数式14〕に示したように、累積誤差となる変数A1〜A10を2で除算する。同時に、カウンタを0にリセットする。すなわち、ここでのA1〜A10は純粋な意味での累積誤差ではなく、累積誤差の移動平均となっている。本実施形態では、直前の最大100サンプルまでは累積されるが、それ以前のものは半分になるように処理する。これにより、時間的に離れたサンプルの影響が小さくなるようにしている。
上記ステップS41〜ステップS45の処理を読み込んだ全誤差サンプルに対して実行することにより、全サンプルの値が元の予測誤差e(t)から振幅値x(t)に復元されることになる。
上記のように、符号化装置において行われた符号化処理に対応した復号処理を行って行くことにより、原デジタル音響信号のサンプルが各ブロック単位で復元され、非圧縮ブロックが得られる。ただし、本発明に係る再生装置では、上記復号処理を、読み込まれた各符号化データに対して並行に行うことになる。この結果、同時に複数の非圧縮ブロックが得られることになる。
続いて、得られた複数の非圧縮ブロックを、波形合成処理手段4が合成して合成ブロックを生成する。具体的には、各非圧縮ブロックを構成する各サンプルに合成比率を乗じたものを加算することにより行われる。この結果、合成ブロックが得られることになる。
波形合成処理手段4により合成されて得られた合成ブロックは、合成ブロック蓄積手段5に蓄積されていく。本実施形態では、合成ブロック蓄積手段に4ブロックまで蓄積可能となっているため、4ブロック蓄積されるまでは、サウンドデバイスドライバ6による処理は開始されない。図16に示すように、合成ブロック蓄積手段5に合成ブロックが4ブロック蓄積されると、サウンドデバイスドライバ6が、合成ブロック蓄積手段5に蓄積された合成ブロックのうち先頭のブロックを音響再生する。具体的には、サウンドデバイス7が合成ブロックのデータをD/A変換してスピーカに出力することになる。音響再生された合成ブロックは、合成ブロック蓄積手段5から削除される。
合成ブロックが削除されて、合成ブロック蓄積手段5内に余裕ができると、波形合成処理手段4により合成された合成ブロックが合成ブロック蓄積手段5に投入される。これにより、合成ブロック蓄積手段5内は再び最大容量まで蓄積されることになる。波形合成処理手段4により合成された合成ブロックは、現実には、CPUが合成ブロック投入手段として機能することにより、合成ブロック蓄積手段5内に投入される。この合成ブロック投入手段は、合成ブロックを合成ブロック蓄積手段5に単純に投入するだけでなく、合成ブロック蓄積手段5に空きが無い場合は、圧縮ブロック読込手段1、ブロック復号手段2、波形合成処理手段4に対して処理を中断するメッセージを送り、合成ブロック蓄積手段5への合成ブロックの投入を制御している。
一方、サウンドデバイスドライバ6は、合成ブロック蓄積手段5に蓄積された合成ブロックのうち先頭のブロックを順次音響再生していく。この際、サウンドデバイスドライバ6は、1つの合成ブロックの音響再生を終了する度に、合成ブロック投入手段、圧縮ブロック読込手段1、ブロック復号手段2に対して各処理の実行を許可するメッセージを送る。
ここで、上記再生装置における処理の概要を整理して図17のフローチャートに示す。まず、合成ブロック投入手段が、合成ブロック蓄積手段5内に空いているバッファメモリが存在するかどうかを探索する(ステップS51)。空いているバッファメモリが存在しない場合は、圧縮ブロック読込手段1およびブロック復号手段2、波形合成処理手段4に対して処理を中断するメッセージを送り、サウンドデバイスドライバ6からの再生終了メッセージの受信待ちとする(ステップS52)。サウンドデバイスドライバ6からの再生終了メッセージがあった場合には、再生が終了した合成ブロックを格納していたバッファメモリから削除する(ステップS53)。サウンドデバイスドライバ6からの再生終了メッセージは、同時に合成ブロック投入手段、圧縮ブロック読込手段1、ブロック復号手段2、波形合成処理手段4にも送信されるため、圧縮ブロック読込手段1、ブロック復号手段2、波形合成処理手段4が処理を再開し、非圧縮ブロックの復号および非圧縮ブロックの合成が行われる(ステップS54)。続いて、空いているバッファメモリに合成ブロックが格納される(ステップS55)。一方、サウンドデバイスでは、常に、合成ブロック蓄積手段5内のバッファメモリを探索しており(ステップS56)、合成ブロックが存在する場合には、合成ブロックを再生する(ステップS57)。1つの合成ブロックの再生を待ち(ステップS58)、再生が終了したら、再生終了メッセージを合成ブロック投入手段、圧縮ブロック読込手段1、ブロック復号手段2、波形合成処理手段4に送信する(ステップS59)。
以上のようにして、各手段が互いに制御し合って動作することにより、シームレスに音響信号を再生することが可能となる。また、本発明では、タイマーを利用して外部の演奏装置と同期させて演奏することも可能である。具体的には、タイマーのクロック信号を、本装置の外部の演奏装置からの同期信号として供給することにより、サウンドデバイス7による音響再生と外部の演奏装置の音響再生のタイミングを合わせることになる。タイミングをハードウェア的に合わせる方法としては、サウンドデバイス7のD/A変換を駆動するタイマー8のクロック信号を自律オシレータで発生させる代わりに、前記同期信号を供給する方法が挙げられる。また、ソフトウェア的にタイミングを合わせる方法としては、サウンドデバイスドライバ6が再生する合成ブロックの推奨される再生開始時刻と、タイマーのクロック信号から得られる実時間のタイムコードと比較を行い、合成ブロックにおいて推奨される再生開始時刻が実時間に比べ遅れている場合、遅れた時間だけ合成ブロックのデータを削減し、当該合成ブロックにおいて推奨される再生開始時刻が実時間に比べ進んでいる場合、合成ブロックの再生開始時刻が実時間のタイムコードと一致するように再生開始を待たせるように制御する方法が挙げられる。本方法では、遅れや進み時間が顕著に大きい場合には、演奏のシームレス性が阻害されるが、一般には各非圧縮ブロックごとに調整する時刻はブロック長に比べ微小なため、殆ど再生品質に支障はでない。
以上、本発明の好適な実施形態について説明したが、本発明は上記実施形態に限定されず種々の変形が可能である。例えば、上記実施形態では、図1〜図11に示した処理により得られた符号化データを読み込んで復号再生する場合について説明したが、読み込むデータが所定の大きさのブロックに分割されており、合成された合成ブロックが蓄積手段内のバッファに納まるサイズであれば、どのような形式であっても良い。ただし、ブロック復号手段における具体的処理が、符号化データを作成する際に符号化に対応したものである必要がある。