(57)【要約】【課題】ブロック単位のICAのブロックの長さと分離行列の更新間隔とのトレードオフを解消する。【解決手段】スレッド１乃至スレッド３のそれぞれでは、「蓄積中」状態において、指定された時間の観測信号がバッファに蓄えられる。指定された時間が経過した後、状態は、学習中に遷移し、分離行列Wが収束するまで（または一定回数）学習処理ループが実行され、蓄積中の状態において蓄積された観測信号に対応した分離行列が求められる。そして、待機中の状態において、指定された時間だけ、観測信号の蓄積や学習は実行されず、待機される。待機中の状態を維持する時間は、学習にかかった時間によって決まる。そして、スレッド１乃至スレッド３のそれぞれは、所定のブロックシフト幅（Block_shift）だけずらして起動される。例えば、ブロック長の半分をブロックシフト幅としてもよい。本発明は、音源分離装置に適用できる。【選択図】図４
2008147920.tif 000002
【特許請求の範囲】
【請求項１】
独立成分分析を実行する情報処理装置において、
信号を取得する取得手段と、
前記取得手段により取得された前記信号を用いて、前記独立成分分析の学習によって分離行列を求める学習手段と、
前記取得手段により取得された前記信号に、前記学習手段により求められた前記分離行列を適用することによって、分離結果を生成する分離手段と
を備え、
前記学習手段は、
前記信号を蓄積する第１の状態と蓄積された前記信号を用いて前記独立成分分析に基づくバッチ処理を実行することにより前記分離行列を演算する第２の状態の少なくとも２つの状態を有し、前記分離行列を学習により求める複数の演算手段と、
複数の前記演算手段を制御する演算制御手段と
を備え、
前記演算制御手段は、複数の前記演算手段のそれぞれにおける前記第１の状態の開始タイミングがずれるように、複数の前記演算手段を制御する
情報処理装置。
【請求項２】
前記演算制御手段は、前記第１の状態および前記第２の状態の少なくとも一部のタイミングが、複数の前記演算手段のいずれかにおいて重複するように、複数の前記演算手段を制御する
請求項１に記載の情報処理装置。
【請求項３】
前記演算手段は、前記第１の状態および前記第２の状態のいずれの状態でもなく、処理を待機する第３の状態を更に有し、
前記演算制御手段は、前記演算手段における前記第３の状態の時間を制御することにより、複数の前記演算手段のそれぞれにおける前記第１の状態の開始タイミングがずれるように、複数の前記演算手段を制御する
請求項１に記載の情報処理装置。
【請求項４】
前記演算制御手段は、前記演算手段における前記第３の状態の時間を制御することにより、複数の前記演算手段のそれぞれにおける前記第１の状態の開始タイミングが、略均等にずれるように、複数の前記演算手段を制御する
請求項３に記載の情報処理装置。
【請求項５】
前記演算制御手段は、前記演算手段における前記第３の状態の時間を制御することにより、前記第１の状態および前記第２の状態の少なくとも一部のタイミングが、複数の前記演算手段のいずれかにおいて重複するように、複数の前記演算手段を制御する
請求項４に記載の情報処理装置。
【請求項６】
前記演算手段において、前記第１の状態は、所定の一定期間継続され、
前記演算制御手段は、前記演算手段のいずれかにおいて前記第１の状態が開始するタイミングの間隔が、前記第１の状態が継続される前記所定の一定期間よりも短くなるように、複数の前記演算手段を制御する
請求項３に記載の情報処理装置。
【請求項７】
前記演算制御手段は、複数の前記演算手段のうちのいずれかの前記演算手段が前記独立成分分析に基づくバッチ処理を実行することにより前記分離行列を算出した場合、算出された前記分離行列を求めるために用いた前記第１の状態において蓄積された前記信号の蓄積区間は、他の前記演算手段が既に算出した前記分離行列を求めるために用いた前記信号の蓄積区間よりも新しいか否かを判断し、新しくないと判断された場合、算出された前記分離行列を破棄する
請求項１に記載の情報処理装置。
【請求項８】
前記演算制御手段は、複数の前記演算手段のうちのいずれかの前記演算手段が前記独立成分分析に基づくバッチ処理を実行することにより前記分離行列を算出した場合、算出された前記分離行列を求めるために用いた前記第１の状態において蓄積された前記信号の蓄積区間よりも早い区間で蓄積した前記信号を用いて実行されている他の前記演算手段によるバッチ処理が中止されるように、他の前記演算手段を制御する
請求項１に記載の情報処理装置。
【請求項９】
前記演算制御手段は、前記演算手段が前記分離行列を求める学習に用いる分離行列の初期値として、複数の前記演算手段のいずれかにおいて最も新しく求められた前記分離行列が用いられるように、複数の前記演算手段を制御する
請求項１に記載の情報処理装置。
【請求項１０】
前記演算制御手段は、前記演算手段が前記分離行列を求める学習に用いる分離行列の初期値として、複数の前記演算手段のいずれかにおいて最も新しく求められた前記分離行列とそれ以前に求められた過去の学習による分離行列とを用いて演算されて得られた値が用いられるように、複数の前記演算手段を制御する
請求項１に記載の情報処理装置。
【請求項１１】
前記演算制御手段は、複数の前記演算手段が前記第１の状態において同一の信号保持手段に前記信号を保持し、前記第２の状態において、前記信号保持手段により保持されている前記信号を用いるように、複数の前記演算手段を制御する
請求項１に記載の情報処理装置。
【請求項１２】
前記演算手段は、前記第１の状態において前記取得手段により取得された前記信号のうちの一部を用いて、前記信号処理手段による独立成分分析に用いられる前記分離行列を学習により求める
請求項１に記載の情報処理装置。
【請求項１３】
独立成分分析を実行する情報処理装置の情報処理方法において、
信号を取得し、
取得された前記信号を蓄積する第１の状態と蓄積された前記信号を用いて前記独立成分分析に基づくバッチ処理を実行することにより前記分離行列を演算する第２の状態の少なくとも２つの状態を有し、前記分離行列を学習により求める複数の演算部において、分離処理に用いられる分離行列を学習により求める処理を制御し、
取得された前記信号に前記分離行列を適用することによって、分離結果を生成する
ステップを含み、
複数の前記演算部のそれぞれにおける前記第１の状態の開始タイミングがずれるように、複数の前記演算部による前記学習の処理が制御される
情報処理方法。
【請求項１４】
独立成分分析を実行する処理をコンピュータに実行させるためのプログラムであって、
信号の取得を制御し、
取得が制御された前記信号を蓄積する第１の状態と蓄積された前記信号を用いて前記独立成分分析に基づくバッチ処理を実行することにより前記分離行列を演算する第２の状態の少なくとも２つの状態を有し、前記分離行列を学習により求める複数の演算部において、分離処理に用いられる分離行列を学習により求める処理を制御し、
取得された前記信号に前記分離行列を適用することによって、分離結果を生成する
ステップを含み、
複数の前記演算部のそれぞれにおける前記第１の状態の開始タイミングがずれるように、複数の前記演算部による前記学習の処理が制御される
処理をコンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置および情報処理方法、並びに、プログラムに関し、特に、独立成分分析を行なう場合に用いて好適な、情報処理装置および情報処理方法、並びに、プログラムに関する。
【背景技術】
【０００２】
観測された複数の信号を統計的に独立な成分へと分解するための技術に、独立成分分析（independent component analysis: ICA）がある。
【０００３】
ICAをリアルタイムで行なうための従来の技術について、以下に説明する。なお、ここでいうリアルタイム処理とは、連続的に入力される観測信号を、少ない遅延で独立な成分へと分解（分離）し、それを連続的に出力することである。
【０００４】
ICAは、次のように定式化されている。
【０００５】
式（1）に示されるように、ある時刻tの複数の観測信号を、x1(t),...,xn(t)とし、それらを成分として持つベクトルをx(t)とする。
【０００６】
【数１】
2008147920.tif 000003
【０００７】
そして、x(t)にある行列を掛けた結果を、式（２）に示されるy(t)とする。
【０００８】
【数２】
2008147920.tif 000004
【０００９】
そして、式（２）に示されるy(t)も、式（３）に示されるように、複数の成分を有するベクトルとして表現可能である。
【００１０】
【数３】
2008147920.tif 000005
【００１１】
ICAとは、式（３）に示される、y(t)の成分であるy1(t),...,yn(t)が統計的に独立になるような行列Wを求めることであり、そのような行列は分離行列と称される。
【００１２】
なお、この説明では、ｘ（ｔ），ｙ（ｔ）は、時間領域における時刻ｔの信号であると想定しているが、代わりに、時間周波数領域の信号（スペクトログラム）のｔ番目のフレームの信号であると考えてもかまわない。
【００１３】
分離行列Wを求めるアルゴリズムとしてはさまざまな手法が知られているが、それらは、主に、オンラインアルゴリズムとバッチアルゴリズムの２つに分類される。
【００１４】
オンラインアルゴリズムは、観測信号を１セット供給するごとに分離行列を更新する方式である。以下、オンラインアルゴリズムを用いたICAを、単に、オンライン処理とも称する。
【００１５】
次の式（４）乃至式（７）を繰り返し実行することによりオンライン処理が実行される。
【００１６】
【数４】
2008147920.tif 000006
【００１７】
【数５】
2008147920.tif 000007
【００１８】
【数６】
2008147920.tif 000008
【００１９】
【数７】
2008147920.tif 000009
【００２０】
式（５）において、φは、スコア関数や活性化関数と呼ばれる関数であり、式（６）において、ηは学習係数と呼ばれる小さな正の定数である。式（４）乃至式（７）が実行されるたびに、観測信号ベクトルx(t)が1つずつ供給され、その度に分離行列Wが更新される。
【００２１】
この方式は、ループを含まず、観測信号の蓄積も不要であるため、そのままリアルタイム処理に適用することが可能である。しかしながら、この方式には、分離行列Wが収束するまでに、多数のサンプルを必要とするという欠点がある。すなわち、式（４）乃至式（７）に示されるオンライン処理を用いて音源分離システムを構築した場合、出力自体は遅延なしで生成されるが、それが十分に分離された結果となるまでには、起動からある程度の時間を要する。
【００２２】
一方、バッチアルゴリズムは、観測信号をある程度の時間（例えば、一発話分）蓄積し、そのデータに対して、分離行列Wが収束するまで（または、一定回数）、分離行列Wの更新式を繰り返し適用する方式である。
【００２３】
以下、この繰り返し適用のことを、学習（learning）と称するものとする。そして、観測信号Xに分離行列Wを作用させて分離結果ｙ＝Wｘを計算することを、分離と称するものとする。また、バッチアルゴリズムを用いたICAを、単に、バッチ処理と称するものとする。ｙ＝Wｘにおいて、ｘとｙとは、それぞれ、全ての時刻の観測信号または分離結果を表す。すなわち、全時刻をＴとすると、x＝[x(1),・・・x(T)]、かつ、ｙ=[y(1),・・・y(T)]である。
【００２４】
次の式（８）乃至式（１０）を繰り返し実行することによりオンライン処理が実行される。
【００２５】
【数８】
2008147920.tif 000010
【００２６】
【数９】
2008147920.tif 000011
【００２７】
【数１０】
2008147920.tif 000012
【００２８】
式（８）乃至式（１０）を繰り返し実行することにより、Wおよびy(t)は、ある値に収束する。なお、式（９）において、Et[  ]は、時間方向で平均、すなわち蓄積したサンプルの中で平均を取ることを意味する。
【００２９】
バッチ処理は、データの蓄積と学習のループとに時間を要するため、リアルタイム処理に適用するためには工夫が必要である。例えば、ブロック単位でバッチ処理を施す（以下、単に、ブロック処理と称するものとする）ことにより、リアルタイム処理に適用することができるようにした技術がある（例えば、非特許文献１参照）。
【００３０】
【非特許文献１】“Blind speech separation of moving speakers in real reverberant environment,”A. Koutras, E. Dermatas, and G. Kokkinakis, in Proc. of ICASSP'00,2000, pp. 1133.1136.
【００３１】
また、ブロック処理を用いてICAを行なう技術がある（例えば、特許文献１参照）。
【００３２】
【特許文献１】特開２００５−２２７５１２号公報
【００３３】
図１を参照して、ブロック処理について説明する。
【００３４】
ブロック処理においては、観測信号（ここでは、例えば、複数のマイクによって集音された音信号）を一定時間（例えば、1乃至3秒程度）のブロックに区切り、ブロックごとにバッチ処理が行なわれる。すなわち、１ブロック分の観測信号が入力されると、１ブロック分の観測信号に対して学習が実行され、１ブロック分の分離結果が出力されるようになされている。
【００３５】
こうすることで、入力を中断することなく、連続的に分離結果を出力することが可能となる。しかしながら、ブロック処理においても、入力から出力までの遅延は発生してしまう。発生する遅延は、ブロックの長さと学習に要する時間との合計である。例えば、ブロック処理におけるブロックの長さを1秒、学習に要する時間を0.5秒とすると、入力に対する出力の遅延は1.5秒となる。
【００３６】
このように、ブロック処理においては遅延時間が発生してしまうため、前のブロックで求めた分離行列を用いて分離を行なうことにより、遅延を少なくすることが提案されている（例えば、非特許文献２、または、非特許文献３参照）。
【００３７】
【非特許文献２】“Robust Real-Time Blind Source Separation for Moving Speakers in a Room,”R. Mukai, H. Sawada, S. Araki, S. Makino, in Proc. of ICASSP2003,Vol. 5, pp.469-472, Apr. 2003
【００３８】
【非特許文献３】『移動音源の低遅延実時間ブラインド分離』向井, 澤田, 荒木, 牧野. . 音講論集, pp. 779.780, Mar. 2003.
【００３９】
前のブロックで求めた分離行列を用いて分離を行なうブロック処理を、以下、改良版ブロック処理と称するものとする。
【００４０】
図２を参照して、改良版ブロック処理の概要について説明する。
【００４１】
改良版ブロック処理においても、観測信号を一定時間（例えば、１乃至３秒程度）のブロックに区切り、ブロックごとにバッチ処理が行なわれる。
【００４２】
先頭からｋ番目のブロックX[k]に属する観測信号X(t)を分離する場合、その観測信号が入力された時点では、ｋ番目のブロックX[k]に対応する分離行列W[k]は、もちろん、まだ求められていない。そこで、学習時間がブロック長よりも短ければ、X(t)が観測される時点でW[k-2]は既に求められていることを利用して、分離行列W[k]の代わりに、2つ前のブロックから学習された分離行列W[k-2]を用いて、分離結果Ｙ＝W×Xを演算するものとする。すなわち、改良版ブロック処理においては、ある時刻の観測信号X(t)を分離して分離結果Y(t)を求めるには、Y(t)＝W[k-2]×X(t)が演算される。
【００４３】
これにより、入力を中断することなく、連続的に分離結果を出力することが可能となるとともに、少ない遅延で分離を行なうことができる。なお、分離処理、すなわち、Y(t)＝W[k-2]×X(t)の演算に要する時間は、観測信号の蓄積や学習と比べて短い。ただし、厳密には、時間周波数領域のICAにおいては、ICAの前後に短時間フーリエ変換と逆変換とを必要とするため、改良版ブロック処理であっても、フーリエ変換のタップ数だけの遅延は生じる。
【発明の開示】
【発明が解決しようとする課題】
【００４４】
例えば、複数のマイクによって集音された音信号を、独立成分分析（independent component analysis: ICA）を用いて統計的に独立な成分へと分解する場合、その分離行列Wは、音源とマイクとの間の空間伝達特性を反映している。したがって、その伝達特性が変わらない場合、すなわち、音源もマイクも移動しない場合、改良版ブロック処理を行っても、すなわち、分離行列Wを求めるのに用いたブロックと分離行列Wを適用するブロックとが異なっていても、十分に分離された結果を得ることができる。
【００４５】
一方、マイクや音源が移動する場合は、分離行列の計算で用いたブロックX[k-2]と、分離行列を適用するブロックX[k]との間で空間伝達特性が変化してしまうため、分離行列W[k]の代わりに、2つ前のブロックから学習された分離行列W[k-2]を用いて得られる分離結果Y(t)＝W[k-2]×X(t)は、追従遅れが生じることにより、完全な分離結果とはならない。すなわち、マイクや音源が移動する場合は、改良版ブロック処理を用いることにより精度のよい分離結果を得ることができなかった。
【００４６】
更に、改良版ブロック処理においては、分離性能と追従遅れとの間にはトレードオフが発生する。具体的には、音源やマイクが移動しない場合は、長い時間の観測信号を用いて学習した方が（すなわち、ブロックを長くした方が）、分離の性能が高くなる。一方、音源やマイクが移動する場合は、ブロックが長いと追従遅れが増大してしまう。
【００４７】
また、２つ前のブロックから求まった分離行列W[k-2]を利用するためには、W[k]の先頭の観測信号が入力された時点でW[k-2]が既に求まっている必要がある。すなわち、学習に要する時間がブロック長よりも短くなければならない。しかしながら、学習時間は一定とは限らない。また、例えば、マルチタスクOSを搭載したパーソナルコンピュータなどの情報処理装置において、上述した改良版ブロック処理を実行可能とした（実装した）場合、改良版ブロック処理だけを考慮したときに、学習に要する時間がブロック長よりも平均的に短かったとしても、学習処理中に、他のプロセスの影響で、一時的にプロセッサが高負荷となり、学習時間がブロック長を超えてしまう可能性がある。
【００４８】
このように、学習に要する時間がブロック長よりも短くなることを保証することができない場合、上述した改良版ブロック処理では、正しい分離結果を得ることができなかった。
【００４９】
すなわち、ICAを用いた音源分離システムで、リアルタイム処理を実行するにあたって、従来の技術においては、ブロック長と追従遅れとのトレードオフを解消することや、ブロック長と分離行列の更新間隔と学習時間とを自由に設定したいという要求があった。なお、ここでいうリアルタイム処理とは、連続的に入力される観測信号を、少ない遅延で独立な成分へと分解し、それを連続的に出力することである。
【００５０】
本発明はこのような状況に鑑みてなされたものであり、独立成分分析（independent component analysis: ICA）を用いて、リアルタイムに音源分離を行なう場合に、少ない遅延で独立な成分へと分解し、それを連続的に出力することができるようにするものである。
【課題を解決するための手段】
【００５１】
本発明の一側面の情報処理装置は、独立成分分析を実行する情報処理装置であって、信号を取得する取得手段と、前記取得手段により取得された前記信号を用いて、前記独立成分分析の学習によって分離行列を求める学習手段と、前記取得手段により取得された前記信号に、前記学習手段により求められた前記分離行列を適用することによって、分離結果を生成する分離手段とを備え、前記学習手段は、前記信号を蓄積する第１の状態と蓄積された前記信号を用いて前記独立成分分析に基づくバッチ処理を実行することにより前記分離行列を演算する第２の状態の少なくとも２つの状態を有し、前記分離行列を学習により求める複数の演算手段と、複数の前記演算手段を制御する演算制御手段とを備え、前記演算制御手段は、複数の前記演算手段のそれぞれにおける前記第１の状態の開始タイミングがずれるように、複数の前記演算手段を制御する。
【００５２】
前記演算制御手段には、前記第１の状態および前記第２の状態の少なくとも一部のタイミングが、複数の前記演算手段のいずれかにおいて重複するように、複数の前記演算手段を制御させるようにすることができる。これにより、例えば、従来のブロック処理が有していた、音源分離性能と音源追従性能とのトレードオフを解消することができる。
【００５３】
前記演算手段は、前記第１の状態および前記第２の状態のいずれの状態でもなく、処理を待機する第３の状態を更に有するものとすることができ、前記演算制御手段には、前記演算手段における前記第３の状態の時間を制御することにより、複数の前記演算手段のそれぞれにおける前記第１の状態の開始タイミングがずれるように、複数の前記演算手段を制御させるようにすることができる。
【００５４】
前記演算制御手段には、前記演算手段における前記第３の状態の時間を制御することにより、複数の前記演算手段のそれぞれにおける前記第１の状態の開始タイミングが、略均等にずれるように、複数の前記演算手段を制御させるようにすることができる。
【００５５】
前記演算制御手段には、前記演算手段における前記第３の状態の時間を制御することにより、前記第１の状態および前記第２の状態の少なくとも一部のタイミングが、複数の前記演算手段のいずれかにおいて重複するように、複数の前記演算手段を制御させるようにすることができる。
【００５６】
前記演算手段において、前記第１の状態は、所定の一定期間継続されるものとすることができ、前記演算制御手段には、前記演算手段のいずれかにおいて前記第１の状態が開始するタイミングの間隔が、前記第１の状態が継続される前記所定の一定期間よりも短くなるように、複数の前記演算手段を制御させるようにすることができる。
【００５７】
前記演算制御手段には、複数の前記演算手段のうちのいずれかの前記演算手段が前記独立成分分析に基づくバッチ処理を実行することにより前記分離行列を算出した場合、算出された前記分離行列を求めるために用いた前記第１の状態において蓄積された前記信号の蓄積区間は、他の前記演算手段が既に算出した前記分離行列を求めるために用いた前記信号の蓄積区間よりも新しいか否かを判断し、新しくないと判断された場合、算出された前記分離行列を破棄させるようにすることができる。
【００５８】
前記演算制御手段には、複数の前記演算手段のうちのいずれかの前記演算手段が前記独立成分分析に基づくバッチ処理を実行することにより前記分離行列を算出した場合、算出された前記分離行列を求めるために用いた前記第１の状態において蓄積された前記信号の蓄積区間よりも早い区間で蓄積した前記信号を用いて実行されている他の前記演算手段によるバッチ処理が中止されるように、他の前記演算手段を制御させるようにすることができる。
【００５９】
前記演算制御手段には、前記演算手段が前記分離行列を求める学習に用いる分離行列の初期値として、複数の前記演算手段のいずれかにおいて最も新しく求められた前記分離行列が用いられるように、複数の前記演算手段を制御させるようにすることができる。
【００６０】
前記演算制御手段には、前記演算手段が前記分離行列を求める学習に用いる分離行列の初期値として、複数の前記演算手段のいずれかにおいて最も新しく求められた前記分離行列とそれ以前に求められた過去の学習による分離行列とを用いて演算されて得られた値が用いられるように、複数の前記演算手段を制御させるようにすることができる。
【００６１】
前記演算制御手段には、複数の前記演算手段が前記第１の状態において同一の信号保持手段に前記信号を保持し、前記第２の状態において、前記信号保持手段により保持されている前記信号を用いるように、複数の前記演算手段を制御させるようにすることができる。このことは、例えば、複数の演算手段が信号保持手段を共有すると換言することができる。
【００６２】
前記演算手段には、前記第１の状態において前記取得手段により取得された前記信号のうちの一部を用いて、前記信号処理手段による独立成分分析に用いられる前記分離行列を学習により求めさせるようにすることができる。
【００６３】
本発明の一側面の情報処理方法は、独立成分分析を実行する情報処理装置の情報処理方法であって、信号を取得し、取得された前記信号を蓄積する第１の状態と蓄積された前記信号を用いて前記独立成分分析に基づくバッチ処理を実行することにより前記分離行列を演算する第２の状態の少なくとも２つの状態を有し、前記分離行列を学習により求める複数の演算部において、分離処理に用いられる分離行列を学習により求める処理を制御し、取得された前記信号に前記分離行列を適用することによって、分離結果を生成するステップを含み、複数の前記演算部のそれぞれにおける前記第１の状態の開始タイミングがずれるように、複数の前記演算部による前記学習の処理が制御される。
【００６４】
本発明の一側面のプログラムは、独立成分分析を実行する処理をコンピュータに実行させるためのプログラムであって、信号の取得を制御し、取得が制御された前記信号を蓄積する第１の状態と蓄積された前記信号を用いて前記独立成分分析に基づくバッチ処理を実行することにより前記分離行列を演算する第２の状態の少なくとも２つの状態を有し、前記分離行列を学習により求める複数の演算部において、分離処理に用いられる分離行列を学習により求める処理を制御し、取得された前記信号に前記分離行列を適用することによって、分離結果を生成するステップを含み、複数の前記演算部のそれぞれにおける前記第１の状態の開始タイミングがずれるように、複数の前記演算部による前記学習の処理が制御される処理をコンピュータに実行させる。
【００６５】
本発明の一側面においては、信号が取得され、取得された信号を蓄積する第１の状態と蓄積された信号を用いて独立成分分析に基づくバッチ処理を実行することにより分離行列を演算する第２の状態の少なくとも２つの状態を有し、分離行列を学習により求める複数の演算部が用いられて、分離処理に用いられる分離行列が学習により求められ、取得された信号に分離行列が適用されることによって、分離結果が生成される。そして、このとき、複数の演算部のそれぞれにおける第１の状態の開始タイミングがずれるように複数の演算部による学習が制御される。
【００６６】
音源分離装置は、独立した装置であっても良いし、情報処理装置の音源分離処理を行なうブロックであっても良い。
【発明の効果】
【００６７】
本発明の一側面によれば、独立成分分析を行なうことができ、特に、学習処理を複数のスレッドで並列して行なうようにして、各スレッドの状態遷移のタイミングをずらすようにしたので、精度よく独立成分分析を行なうことができるとともに、少ない遅延で独立な成分へと分解し、それを連続的に出力することができる。
【発明を実施するための最良の形態】
【００６８】
以下に本発明の実施の形態を説明するが、本発明の構成要件と、明細書または図面に記載の実施の形態との対応関係を例示すると、次のようになる。この記載は、本発明をサポートする実施の形態が、明細書または図面に記載されていることを確認するためのものである。従って、明細書または図面中には記載されているが、本発明の構成要件に対応する実施の形態として、ここには記載されていない実施の形態があったとしても、そのことは、その実施の形態が、その構成要件に対応するものではないことを意味するものではない。逆に、実施の形態が構成要件に対応するものとしてここに記載されていたとしても、そのことは、その実施の形態が、その構成要件以外の構成要件には対応しないものであることを意味するものでもない。
【００６９】
本発明の一側面の情報処理装置は、独立成分分析を実行する情報処理装置であって、信号を取得する取得手段（例えば、音信号取得部２９）と、前記取得手段により取得された前記信号を用いて、前記独立成分分析の学習によって分離行列を求める学習手段（例えば、図８のバックグラウンド処理部７２）と、前記取得手段により取得された前記信号に、前記学習手段により求められた前記分離行列を適用することによって、分離結果を生成する分離手段（たとえば、図８の信号処理部７１）とを備え、前記学習手段は、前記信号を蓄積する第１の状態（例えば、「蓄積中」状態）と蓄積された前記信号を用いて前記独立成分分析に基づくバッチ処理を実行することにより前記分離行列を演算する第２の状態（例えば、「学習中」状態）の少なくとも２つの状態を有し、前記分離行列を学習により求める複数の演算手段（例えば、図８のスレッド１０１−１乃至１０１−Ｎ）と、複数の前記演算手段を制御する演算制御手段（例えば、図８のスレッド制御部９１）とを備え、前記演算制御手段は、複数の前記演算手段のそれぞれにおける前記第１の状態の開始タイミングがずれるように、複数の前記演算手段を制御する。
【００７０】
前記演算手段は、前記第１の状態および前記第２の状態のいずれの状態でもなく、処理を待機する第３の状態（例えば、「待機中」状態）を更に有することができ、前記演算制御手段は、前記演算手段における前記第３の状態の時間を制御することにより、複数の前記演算手段のそれぞれにおける前記第１の状態の開始タイミングがずれるように、複数の前記演算手段を制御することができる
【００７１】
前記演算制御手段は、前記演算手段が前記分離行列を求める学習に用いる分離行列の初期値として、複数の前記演算手段のいずれかにおいて最も新しく求められた前記分離行列とそれ以前に求められた過去の学習による分離行列とを用いて演算されて得られた値（例えば、W_init＝（Ｗ[k]＋Ｗ[k-1] ＋・・・＋Ｗ[k-N]）／（Ｎ＋１）またはaW＋(1-a)W_initなどであり、ここで、W[k]は、システムが起動されてからｋ番目に求められた分離行列である）が用いられるように、複数の前記演算手段を制御することができる。
【００７２】
本発明の一側面の情報処理方法は、独立成分分析を実行する情報処理装置の情報処理方法であって、信号を取得し（例えば、図１２のステップＳ２の処理）、取得された前記信号を蓄積する第１の状態（例えば、「蓄積中」状態）と蓄積された前記信号を用いて前記独立成分分析に基づくバッチ処理を実行することにより前記分離行列を演算する第２の状態（例えば、「学習中」状態）の少なくとも２つの状態を有し、前記分離行列を学習により求める複数の演算部（例えば、図８のスレッド１０１−１乃至１０１−Ｎ）において、分離処理に用いられる分離行列を学習により求める処理を制御し（例えば、図１２のステップＳ４の処理）、取得された前記信号に前記分離行列を適用することによって、分離結果を生成する（例えば、図１２のステップＳ５の処理）ステップを含み、複数の前記演算部のそれぞれにおける前記第１の状態の開始タイミングがずれるように、複数の前記演算部による前記学習の処理が制御される。
【００７３】
本発明の一側面のプログラムは、独立成分分析を実行する処理をコンピュータに実行させるためのプログラムであって、信号の取得を制御し（例えば、図１２のステップＳ２の処理）、取得が制御された前記信号を蓄積する第１の状態（例えば、「蓄積中」状態）と蓄積された前記信号を用いて前記独立成分分析に基づくバッチ処理を実行することにより前記分離行列を演算する第２の状態（例えば、「学習中」状態）の少なくとも２つの状態を有し、前記分離行列を学習により求める複数の演算部（例えば、図８のスレッド１０１−１乃至１０１−Ｎ）において、分離処理に用いられる分離行列を学習により求める処理を制御し（例えば、図１２のステップＳ４の処理）、取得された前記信号に前記分離行列を適用することによって、分離結果を生成する（例えば、図１２のステップＳ５の処理）ステップを含み、複数の前記演算部のそれぞれにおける前記第１の状態の開始タイミングがずれるように、複数の前記演算部による前記学習の処理が制御される処理をコンピュータに実行させる。
【００７４】
以下、図を参照して、本発明の実施の形態について説明する。
【００７５】
図３に、音源分離装置１１のブロック図を示す。
【００７６】
ＣＰＵ（Central Processing Unit）２１−1乃至２１−Ｐは、マルチプロセッサであり、ＲＯＭ（Read Only Memory）２２に記憶されているプログラム、または記憶部２８からＲＡＭ（Random Access Memory）２３にロードされたプログラムにしたがって、各種の処理を実行する。ＲＡＭ２３にはまた、ＣＰＵ２１が各種の処理を実行する上において必要なデータなども適宜記憶される。
【００７７】
ＣＰＵ２１、ＲＯＭ２２、およびＲＡＭ２３は、バス２４を介して相互に接続されている。このバス２４にはまた、入出力インタフェース２４も接続されている。
【００７８】
入出力インタフェース２４には、キーボード、マウスなどよりなる入力部２６、ディスプレイやスピーカなどよりなる出力部２７、ハードディスクなどより構成される記憶部２８、および、音信号を取得する音信号取得部２９が接続されている。音信号取得部２９は、例えば、複数のマイクロホンおよびＡＤ変換部を含んで構成され、複数のマイクロホンによって集音された音信号を、ＡＤ変換部の処理によりデジタル信号に変換する。
【００７９】
入出力インタフェース２４にはまた、必要に応じてドライブ３０が接続され、磁気ディスク３１、光ディスク３２、光磁気ディスク３３、もしくは、半導体メモリ３４などが適宜装着され、それらから読み出されたコンピュータプログラムが、必要に応じて記憶部２８にインストールされる。
【００８０】
ＣＰＵ２１は、音信号取得部２９により取得された、複数のマイクによって集音され、デジタル信号に変換された音信号に対して、独立成分分析（independent component analysis: ICA）を実行するものである。
【００８１】
ＣＰＵ２１は、ＩＣＡを実行するにあたって、スレッドと称する処理の単位を用いて、逐次処理、すなわち、略リアルタイムで観測信号から分離信号を出力する処理を可能とするものである。
【００８２】
ＣＰＵ２１は、複数のスレッドを並行して動作させる。それぞれのスレッドは、少なくとも、観測信号の蓄積、および、分離行列の学習の２つの状態を有し、必要に応じて、待機の状態を取ることも可能である。スレッドは、これらの状態間の遷移を繰り返す。
【００８３】
観測信号の蓄積中の状態において、スレッドは、一定時間の観測信号を蓄積する。この一定時間を、以下、１ブロック長と称するものとする。
【００８４】
分離行列の学習中の状態において、スレッドは、蓄積した観測信号から分離行列を求める学習処理を実行する。
【００８５】
待機中の状態において、スレッドは、観測信号の蓄積や学習処理を実行せずに、待機する。
【００８６】
ＣＰＵ２１においては、複数のスレッドが時刻をずらして起動される。また、ブロック長、分離行列の更新間隔、学習時間の最大値などは、それぞれ、設定可能なようになされている。
【００８７】
そして、ブロック長よりも短い間隔で異なるスレッドを起動する、換言すれば、複数のスレッドのそれぞれにおいて、上述した３つの状態の遷移タイミングを調整して所定時間だけずらすことにより、ブロック長よりも短い間隔で分離行列Ｗを更新できるようになり、ブロック長と追従遅れとのトレードオフを解消することが可能となる。
【００８８】
例えば、図４を用いて、複数のスレッドを並行して起動する場合の一例として、３つのスレッドが並行して起動されたときの状態遷移について説明する。
【００８９】
スレッド１乃至スレッド３のそれぞれでは、観測信号の「蓄積中」状態において、指定された時間、すなわち１ブロック長の観測信号がバッファに蓄えられる。指定された時間が経過した後、状態は、学習中に遷移する。
【００９０】
学習中の状態において、分離行列Wが収束するまで（または一定回数）学習処理ループが実行され、蓄積中の状態において蓄積された観測信号に対応した分離行列が求められる。分離行列Wが収束した後（または一定回数の学習処理ループが実行された後）状態は、待機中に遷移する。
【００９１】
そして、待機中の状態において、指定された時間だけ、観測信号の蓄積や学習は実行されず、待機される。待機中の状態を維持する時間は、学習にかかった時間によって決まる。すなわち、図５に示されるように、予め、「蓄積中」状態と「学習中」状態と「待機中」状態との合計の時間幅であるスレッド長（thread_len）が定められ、基本的には、「学習中」状態が終了したときからスレッド長が終了するまでの間の時間が、「待機中」状態の時間（待機時間）とされる。待機時間が過ぎた後、状態は、観測信号の「蓄積中」状態へ戻る。
【００９２】
これらの時間は、例えば、ミリ秒などの単位で管理してもよいが、短時間フーリエ変換で生成されるフレームを単位として計測するものとしても良い。以降の説明では、フレームを単位として計測する（たとえば、カウントアップをおこなう）ものとする。
【００９３】
そして、スレッド１乃至スレッド３のそれぞれは、所定のブロックシフト幅（Block_shift）だけずらして起動される。例えば、図４の場合においては、ブロック長の半分をブロックシフト幅としている。
【００９４】
スレッド１の「学習中」状態が終了した後、スレッド１により得られた学習結果、すなわち、スレッド１由来の分離行列Ｗ[1]を用いて、それぞれのスレッドは処理を実行することができる。そして、スレッド２の「学習中」状態が終了した後、スレッド１により得られた学習結果よりも新しい、スレッド２により得られた学習結果、すなわち、スレッド２由来の分離行列Ｗ[2]を用いてそれぞれのスレッドは処理を実行することができる。
【００９５】
以下同様に、所定のブロックシフト幅（Block_shift）だけずらして起動されるそれぞれのスレッド由来の最新の分離行列Ｗを用いて、それぞれのスレッドは処理を実行することが可能なようになされている。すなわち、ブロック長よりも短い間隔で分離行列Ｗを更新することができるので、ブロック長と更新間隔とのトレードオフを回避することができる。
【００９６】
また、学習時間がブロック長よりも長くなる可能性がある場合でも、その分だけ多くのスレッドを起動すれば、ブロック長や学習時間よりも短い間隔で分離行列Ｗを更新することができる。換言すれば、分離行列Ｗの更新頻度、すなわち追従遅れの度合いを、ブロック長や学習時間とは独立して設定することが可能になる。
【００９７】
また、学習時間が（スレッド長−ブロック長）よりも長くなってしまった場合、「学習中」状態の終了後、「待機中」状態に遷移せず、「蓄積中」状態に遷移するものとしても良い。
【００９８】
これらの状態遷移を管理するために、それぞれのスレッドごとに、カウンタを用いて、「蓄積中」状態の開始からカウントアップを始める。上述したように、「蓄積中」状態はブロック長（block_len）の間継続され、カウンタ値がブロック長（block_len）となったとき、状態は、「学習中」状態に遷移する。そして、「学習中」状態が終了してから、カウンタ値がスレッド長（thread_len）となるまでの間が、「待機中」状態となるのであるが、「学習中」状態が終了したとき、カウンタ値がスレッド長（thread_len）と等しいか、それよりも大きい場合、状態は、「学習中」状態の終了後、「待機中」状態に遷移せず、「蓄積中」状態に遷移するものとする。
【００９９】
すなわち、図６の状態遷移図に示されるように、システムの起動直後、各スレッドは「初期状態」にあるが、その内の１つが「蓄積中」状態となり、残りの全てのスレッドが「待機中」へ状態を遷移させる。すなわち、図４における場合では、スレッド１が、初期状態の後「蓄積中」へ遷移したスレッドであり、それ以外のスレッドが「初期状態」から「待機中」へ遷移したスレッドである。
【０１００】
「初期状態」から「待機中」へ遷移したスレッドにおける、最初の「待機中」から「蓄積中」への状態遷移について、「初期状態」から「待機中」へ状態が遷移したときのカウンタの値を、ブロックのシフト幅（block_shift）とスレッド長（thread_len）によって決まる所定の値とすることにより、「待機中」から「蓄積中」への状態の遷移の条件判断を、他と同様に実行可能なようにすることができる。
【０１０１】
すなわち、図４におけるスレッド２およびスレッド３において、例えば、「初期状態」から最初の「待機中」に状態が遷移されたとき、スレッド２の状態遷移を管理するためのカウンタの値をthread_len−block_shiftに設定し、スレッド３の状態遷移を管理するためのカウンタの値を、thread_len−block_shift×2に設定する。そして、スレッド１において蓄積されている観測信号のフレームと連動して、それぞれのカウンタの値をインクリメントする。このようにすれば、それぞれのカウンタの値がthread_lenに達したとき、状態を「待機中」から「蓄積中」へ遷移すればよいので、他の「待機中」から「蓄積中」への状態の遷移と同様の条件で、状態遷移を制御することが可能となる。
【０１０２】
「蓄積中」から「学習中」への状態の遷移、および、「待機中」または「学習中」から「蓄積中」への状態遷移については、カウンタの値に基づいて行なわれる。すなわち、それぞれのスレッドにおいて、「蓄積中」の開始時にカウンタの値は初期化（例えば、０にセット）され、観測信号が１フレーム分供給されるごとにカウンタの値が１インクリメントされ、カウンタの値がblock_lenと同じ値になったら、「学習中」へ状態が遷移される。
【０１０３】
学習は、分離処理と並列にバックグラウンドで行なわれるが、その間も観測信号のフレームと連動してカウンタの値はインクリメントされる。
【０１０４】
学習が終了した時、カウンタの値がthread_lenと比較される。カウンタの値がthread_lenより小さい場合、状態が「待機中」へ遷移される。待機中も学習中と同様に、観測信号のフレームと連動してカウンタがインクリメントされる。そして、待機中のカウンタ値がthread_lenと等しくなったとき、状態は、「蓄積中」に遷移され、観測信号の蓄積が開始されて、カウンタ値は初期化される。
【０１０５】
そして、学習が終了した時、カウンタの値がthread_lenと同じか、または、大きい場合、状態は、「蓄積中」に遷移され、観測信号の蓄積が開始されて、カウンタ値は初期化される。
【０１０６】
また、「初期状態」から「待機中」へ遷移したスレッドにおける、最初の「待機中」から「蓄積中」への状態遷移についてのみは、待機させたい時間、すなわちブロックのシフト幅（block_shift）に対応して定められる値をカウントすることにより状態遷移が実行される。
【０１０７】
また、例えば、図４におけるスレッド２やスレッド３において、「初期状態」から「待機中」に状態を遷移せず、一定時間「初期状態」を保持した後、「蓄積中」に状態を遷移するようにしても良い。
【０１０８】
例えば、図４におけるスレッド２において、「初期状態」の最初に、カウンタの値は初期化（たとえば、０にセット）され、スレッド１において蓄積されている観測信号のフレームと連動して、ブロックのシフト幅（block_shift）だけカウンタの値がインクリメントされたとき、状態が、「蓄積中」へ遷移されるようにしてもよい。同様に、スレッド３においては、「初期状態」の最初にカウンタの値は初期化され、ブロックのシフト幅（block_shift）の２倍の値にカウンタの値がインクリメントされたとき、状態が、「蓄積中」へ遷移されるようにしてもよい。
【０１０９】
そして、並列して実行されるスレッドを、最低何個用意する必要があるかは、スレッド長とブロックのシフト幅とで決まる。スレッド長をthread_len、ブロックのシフト幅をblock_shiftとすると、必要なスレッドの個数は、thread_len/block_shiftの値の小数点以下を切り上げることにより求められる。換言すれば、並行して実行されるスレッドの数を、thread_len/block_shift以上であって、その近傍の整数とすると好適である。
【０１１０】
例えば、図４における場合では、thread_len＝1.5×block_len，block_shift＝0.5×block_lenに設定してあるため、必要なスレッド数は、1.5/0.5＝3である。
【０１１１】
これに対して、例えば、図７に示されるように、thread_lenがblock_lenの2倍に設定されている場合、block_shift＝0.5×block_lenであれば、必要スレッド数は、2/0.5＝4となる。
【０１１２】
図７に示される各スレッドは、図４に示される各スレッドよりも、「待機中」状態のために用意された時間が長い。「待機中」状態のための時間は、学習時間の超過に対するマージンでもあるため、図７に示される設定のほうが、図４における場合よりも学習時間の超過に対して頑強であり、学習時間が超過した場合であっても、以降の状態遷移のタイミングに影響を与える可能性が低い。換言すれば、スレッド長を大きな値に設定する、すなわち、スレッドを多数用意することにより、学習時間の超過に対するマージンを大きくすることが可能となる。
【０１１３】
すなわち、図４における場合と、図７における場合で、ブロック長とブロックシフト幅が同一であれば、分離結果自体もほぼ同一となる。しかしながら、図４における場合と図７における場合では、スレッド長が異なるため、延長を含まない場合の学習時間の最大値は異なる。すなわち、図４においては、学習時間がブロック長の半分を超えると以降の処理の延期が必要になるのに対し、図においては、学習時間がブロック長と同じ時間を超えるまでは、それ以降の処理の延期が不要である。すなわち、ブロック長およびブロックシフト幅が同一でも、スレッド長を長くしてスレッド数を増やすことで、学習時間の超過に対する許容度を上げることができる。
【０１１４】
このように、ブロック長、ブロックシフト幅、スレッド長などを適宜設定可能なようにすることにより、学習時間の超過に対する許容度の調整も可能となる。
【０１１５】
なお、ここでいう「スレッド」は、並列動作を提供する仕組みであれば何でも良く、マルチスレッドの他、マルチプロセスを用いても構わないし、スレッドごとにプロセッサを用意してもよい。換言すれば、本発明は、例えば、図３におけるＣＰＵ２１−１乃至２１-Ｐのように、マルチプロセッサを有することなどによって並列動作が可能なシステムの上でICAを動かした場合に追従時間を短縮することができるものである。
【０１１６】
また、図３におけるＣＰＵ２１−１乃至２１-Ｐに代わって、唯１つのＣＰＵ２１を設けるようにした場合であっても、そのＣＰＵ２１が並列処理を実行可能であれば、本発明を実現可能であることは言うまでもない。
【０１１７】
また、スレッドの各状態に対応した処理のうち、真に並列処理が必要なのは「学習」処理のみであるため、「学習」処理のみをマルチスレッドで起動する一方で、それ以外の「蓄積」および「待機」の処理は、観測信号のサンプルやフレームに同期して処理するようにしてもよい。これにより、例えば、マルチプロセッサを有するシステムにおいて、最も負荷の軽いプロセッサに「学習」を担当させて適切に処理を分担させることが可能になる。
【０１１８】
次に、図８を参照して、図４乃至図６を用いて説明した、複数スレッドを用いた学習処理を実行するＣＰＵ２１が有する機能について説明する。すなわち、図８は、図３の音源分離装置１１が有する機能を示す機能ブロック図である。
【０１１９】
複数のマイクロホン６１およびAD変換部６２により構成される音信号取得部２９により取得されてデジタルデータに変換された音信号は、主に観測信号の分離を行なう信号処理部７１と、分離行列の学習処理を行なうバックグラウンド処理部７２によって処理される。
【０１２０】
信号処理部７１は、フーリエ変換部８１、分離部８２、および、フーリエ逆変換部８３の機能を含み、バックグラウンド処理部７２は、スレッド制御部９１、スレッド演算処理部９２、および、分離行列保持部９３から構成されている。信号処理部７１とバックグラウンド処理部７２とは並列で動作する。
【０１２１】
フーリエ変換部８１は、供給されたデータを、窓つきの短時間フーリエ変換によって周波数領域のデータへ変換し、分離部８２およびスレッド制御部９１に供給する。その際、フレームと呼ばれる一定個数のデータが生成される。以降の処理は、このフレームを単位として行なわれる。
【０１２２】
分離部８２は、フーリエ変換部８１から供給された観測信号のフーリエ変換結果の1フレーム分であるX(t)（tは、フレーム番号であるものとする）と、分離行列保持部９３から取得される、事前に求められた分離行列W[k]（W[k]は、システムが起動されてからｋ番目に求められた分離行列である）とを乗じて、分離結果であるY(t)を生成して、フーリエ逆変換部８３に供給する。
【０１２３】
フーリエ逆変換部８３は、分離部８２から供給された分離結果Y(t)を時間領域の信号に変換し、例えば、音声認識などの後段の処理に対して供給する。後段の処理によっては、周波数領域のデータをそのまま使用する場合もあるので、その場合には、フーリエ逆変換を実行することなく、分離部８２から供給された分離結果Y(t)を出力するものとしても良い。
【０１２４】
スレッド制御部９１は、フーリエ変換部８１から供給された観測信号のフーリエ変換結果の1フレーム分であるX(t)を、スレッド演算処理部９２に供給し、スレッド演算処理部９２において実行される複数のスレッド１０１−１乃至１０１−Ｎの処理を制御する。そして、スレッド制御部９１は、スレッド演算処理部９２から供給された、学習の結果得られた分離処理用の分離行列Wを、分離行列保持部９３に供給する。
【０１２５】
スレッド演算処理部９２において実行される複数のスレッド１０１−１乃至１０１−Ｎは、図４乃至図６を用いて説明したように、スレッド制御部９１の制御に基づいて、状態を遷移し、それぞれ異なるタイミングで、与えられた観測信号を一定量だけ蓄積した後、ICAのバッチ処理を用いて観測信号から分離行列を求める学習処理を実行する。
【０１２６】
分離行列保持部９３は、スレッド制御部９１から供給された、学習の結果得られた分離処理用の分離行列Wを保持する。
【０１２７】
信号処理部７１およびバックグラウンド処理部７２のそれぞれにおいて実行される処理は、並行して実行される。したがって、音源分離装置１１の機能全体としてみると、観測信号に対して分離行列Wを随時適用する処理により、分離結果が逐次生成される一方で、適用される分離行列Ｗが、学習処理により求められて、ある程度頻繁に（例えば、ブロック長よりも短い期間で）更新されて適用される。
【０１２８】
図９は、スレッド制御部９１が有する機能を更に詳細に示す、スレッド制御部９１の機能ブロック図である。
【０１２９】
現フレーム番号保持カウンタ１３１は、観測信号が１フレーム分供給されるごとに値が１インクリメントされ、所定の値に達すると初期値に戻るようになされている。なお、カウンタのインクリメントは、フレーム番号と同期させる代わりに、時間領域信号のサンプル番号と同期させても構わない。
【０１３０】
学習初期値保持部１３２は、それぞれのスレッドにおいて学習処理を実行する場合の分離行列Ｗの初期値を保持するものである。分離行列Ｗの初期値は、基本的には最新の分離行列と同一だが、異なる値を用いるものとしても良い。
【０１３１】
蓄積開始予定タイミング指定情報保持部１３３は、蓄積を開始するタイミングを複数のスレッド間で一定間隔にするために用いられる情報である。なお、蓄積開始予定タイミングは、相対時刻を用いて表されていてもよいし、相対時刻の代わりにフレーム番号で管理してもよいし、時間領域信号のサンプル番号で管理しても良い。これについては他の「タイミング」を管理するための情報についても同様である。
【０１３２】
観測信号の蓄積タイミング情報保持部１３４は、分離部８２で現在使用されている分離行列Ｗが、どのタイミングで取得された観測信号を基に学習されたものであるかを示す情報、すなわち、最新の分離行列に対応した観測信号の相対時刻またはフレーム番号を保持するものである。観測信号の蓄積タイミング情報保持部１３４には、対応する観測信号の蓄積開始タイミングと蓄積終了タイミングとの両方を格納しても良いが、ブロック長、すなわち、観測信号の蓄積時間が一定ならば、いずれか一方だけを保存すれば十分である。
【０１３３】
また、スレッド制御部９１は、それぞれのスレッドへリンクされているポインタ１３５を有し、これを用いて、複数のスレッドの処理を制御している。
【０１３４】
次に、図１０は、スレッド演算処理部９２において実行されるそれぞれのスレッドの演算機能について説明するための機能ブロック図である。
【０１３５】
スレッド１０１（複数のスレッド１０１−１乃至１０１−Ｎのそれぞれ）は、観測信号バッファ１６１、分離結果バッファ１６２、学習演算部１６３、および、分離行列保持部１６４の各モジュールの機能を用いて、バッチ処理のICAを実行する。
【０１３６】
観測信号バッファ１６１は、スレッド制御部９１から供給される観測信号を保持するものであり、その容量は、１ブロック長に対応する観測信号の容量と同じか、それよりも大きいものである。ただし、後述する「観測信号のフレーム間引き」を行なう場合は、間引く分だけバッファの大きさを小さくしても構わない。
【０１３７】
分離結果バッファ１６２には、学習演算部１６３により演算された、分離行列収束前の分離結果が保持される。
【０１３８】
学習演算部１６３は、観測信号バッファ１６１に蓄積されている観測信号を、分離行列保持部１６４に保持されている分離処理用の分離行列Ｗに基づいて分離して、分離結果バッファ１６２に蓄積するとともに、分離結果バッファ１６２に蓄積される分離結果を用いて、学習中の分離行列を更新する処理を実行する。
【０１３９】
また、スレッドは、状態遷移マシンであり、現在の状態は、状態格納部１６５に格納されている。そして、スレッドの状態は、カウンタ１６６のカウンタ値によって、スレッド制御部９１により制御される。
【０１４０】
観測信号の開始・終了タイミング保持部１６７には、学習に使用されている観測信号の開始タイミングと終了タイミングを示す情報のうちの少なくともいずれか一方が保持されている。タイミングを示す情報は、上述したように、フレーム番号やサンプル番号であっても良いし、相対時刻情報であっても良い。ここでも、開始タイミングと終了タイミングとの両方を格納しても良いが、ブロック長、すなわち、観測信号の蓄積時間が一定ならば、いずれか一方だけを保存すれば十分である。
【０１４１】
学習終了フラグ１６８は、学習が終了したことをスレッド制御部９１に通知するために用いられるフラグである。スレッドの起動時においては、学習終了フラグ１６８はOFF（フラグが立っていない）にセットされ、学習が終了した時点でONにセットされる。そして、スレッド制御部９１が、学習が終了したことを認識した後、スレッド制御部９１の制御により、学習終了フラグ１６８は、再び、OFFにセットされる。
【０１４２】
前処理用データ保持部１６９は、後述する前処理が施された観測信号を、元に戻す際に必要となるデータを保存しておく領域である。具体的には、例えば、前処理において、観測信号の正規化（分散を1に、平均を0にそろえる）が実行される場合、前処理用データ保持部１６９には、分散（または標準偏差やその逆数）や平均などの値が保持されるので、これを用いて正規化前の信号を復元することができる。また、例えば、前処理として無相関化（pre-whiteningとも称される）が実行される場合、前処理用データ保持部１６９には、無相関化で乗じた行列が保持される。
【０１４３】
状態格納部１６５、カウンタ１６６、観測信号の開始・終了タイミング保持部１６７に保持される値は、スレッド制御部９１の制御により書き換えられる。例えば、このスレッドにおいて学習処理ループが回っている間であっても、スレッド制御部９１は、カウンタ１６６の値を変更することができる。
【０１４４】
状態遷移の実装については、それぞれのスレッド１０１が自分自身のカウンタ１６６の値に基づいて状態を自発的に変化させるという仕様にしても良いし、スレッド制御部９１がカウンタ１６６の値や学習終了フラグ１６８の値に応じて、対応するスレッドに対して「指定された状態に遷移せよ」というコマンド（以降「状態遷移コマンド」と称するものとする）を発行し、それぞれのスレッドは、供給されたコマンドに応じて、その状態を遷移させるという仕様としてもよい。
【０１４５】
ここでは、スレッド制御部９１がカウンタの値や学習終了フラグ１６８の値に応じて状態遷移コマンドを発行し、それぞれのスレッドは、供給されたコマンドに応じて、その状態を遷移させるそのコマンドを受けて状態を変化させる場合の処理を例として説明する。
【０１４６】
図１１のシーケンス図を参照して、スレッド制御部９１による複数のスレッドの制御について説明する。図１１においては、スレッド制御部９１が、スレッド１およびスレッド２の２つのスレッドを制御する場合を例として説明するが、スレッド数は、３以上であってもよいことは言うまでもない。
【０１４７】
なお、スレッド制御部９１は、各スレッドのカウンタの値を参照したり変更（インクリメントや初期化や減算など）したりするため、厳密には、フレーム番号のインクリメントと同期して「カウンタ値」に関する情報が授受されるが、「カウンタ値」に関する情報の授受については、図１１では省略する。
【０１４８】
システムの起動直後、各スレッドは初期化されて「初期状態」とされる。そして、そのうちのいずれか一つ（ここでは、スレッド１）には、スレッド制御部９１により、「蓄積中」へ状態を遷移させる状態遷移コマンドが発行されて、「蓄積中」状態に状態が遷移され、ほかのスレッド（ここでは、スレッド２）には、スレッド制御部９１により、「待機中」へ状態を遷移させる状態遷移コマンドが発行されて、「待機中」状態に状態が遷移される。
【０１４９】
「蓄積中」状態のスレッド１には、スレッド制御部９１により観測信号が供給される。
【０１５０】
そして、スレッド制御部９１は、カウンタの値に基づいて、それぞれのスレッドの状態を遷移させる。具体的には、スレッド２が「待機中」状態に遷移されてから、ブロックシフト幅に対応する所定のカウント値がカウントされた場合、スレッド制御部９１は、スレッド２に、「蓄積中」へ状態を遷移させる状態遷移コマンドを発行する。スレッド２の状態は、「蓄積中」に遷移され、スレッド制御部９１から観測信号の供給を受ける。
【０１５１】
また、スレッド１が「蓄積中」状態に遷移されてから、ブロック長に対応する所定のカウント値がカウントされた場合、スレッド制御部９１は、スレッド１に、「学習中」へ状態を遷移させる状態遷移コマンドを発行する。スレッド１の状態は、「学習中」に遷移される。スレッド１において学習が終了し、分離行列Ｗの値が収束した場合、スレッド１の学習終了フラグ１６８がＯＮとなって、スレッド制御部９１は、学習の終了を認識することができ、スレッド１からスレッド制御部９１に学習の結果得られた分離行列Ｗが供給される。
【０１５２】
そして、学習の終了を認識し、分離行列Ｗの値の供給を受けたスレッド制御部９１は、カウンタの値を参照し、カウンタの値から計算される蓄積開始タイミングが、蓄積開始予定タイミング指定情報保持部１３３に保持されている値から計算されるタイミングを超えていない場合、スレッド１に「待機中」へ状態を遷移させる状態遷移コマンドを発行する。スレッド１の状態は、「待機中」に遷移される。そして、スレッド制御部９１は、カウンタの値がスレッド長となったとき、スレッド１に「蓄積中」へ状態を遷移させる状態遷移コマンドを発行する。スレッド１の状態は、「蓄積中」に遷移される。「蓄積中」状態のスレッド１には、スレッド制御部９１により観測信号が供給される。
【０１５３】
そして、同様に、スレッド２が「蓄積中」状態に遷移されてから、ブロック長に対応する所定のカウント値がカウントされた場合、スレッド制御部９１は、スレッド２に、「学習中」へ状態を遷移させる状態遷移コマンドを発行する。スレッド２の状態は、「学習中」に遷移される。スレッド２において学習が終了し、分離行列Ｗの値が収束した場合、スレッド２の学習終了フラグ１６８がＯＮとなって、スレッド制御部９１は、学習の終了を認識することができ、スレッド２からスレッド制御部９１に学習の結果得られた分離行列Ｗが供給される。
【０１５４】
そして、学習の終了を認識し、分離行列Ｗの値の供給を受けたスレッド制御部９１は、カウンタの値を参照し、カウンタの値から計算される蓄積開始タイミングが、蓄積開始予定タイミング指定情報保持部１３３に保持されている値から計算されるタイミングを超えていない場合、スレッド２に「待機中」へ状態を遷移させる状態遷移コマンドを発行する。スレッド２の状態は、「待機中」に遷移される。そして、スレッド制御部９１は、カウンタの値がスレッド長となったとき、スレッド２に「蓄積中」へ状態を遷移させる状態遷移コマンドを発行する。スレッド２の状態は、「蓄積中」に遷移される。「蓄積中」状態のスレッド２には、スレッド制御部９１により観測信号が供給される。
【０１５５】
このようにして、状態遷移コマンドの発行と、状態遷移が繰り返されて、複数のスレッドにおいて、異なるタイミングで学習処理が行われて、分離行列Ｗがスレッド制御部９１に供給される。そして、それらの学習処理も、最新の分離行列Ｗに基づいて実行される。
【０１５６】
次に、図１２のフローチャートを参照して、音源分離装置１１において実行される、複数音源からの音の分離処理について説明する。
【０１５７】
ステップＳ１において、図１４のフローチャートを用いて後述する初期化処理が実行される。
【０１５８】
ステップＳ２において、フーリエ変換部８１は、音信号取得部２９により複数のマイクで集音され、ＡＤ変換部６２により所定のサンプルレートでサンプリングされてデジタル信号に変換された観測信号を取得する。
【０１５９】
ステップＳ３において、フーリエ変換部８１は、供給された観測信号に対して、短時間フーリエ変換を実行する。
【０１６０】
図１３を参照して、短時間フーリエ変換について説明する。
【０１６１】
フーリエ変換部８１は、図１３の上段に示される観測信号xk（ここでは、kはマイクの番号）から、図中、α、β、γで示されるように、一定長を切り出し、それらにハニング窓やサイン窓等の窓関数を作用させる。この切り出した単位（図中のα、β、γ）がフレームである。そして、フーリエ変換部８１は、１フレーム分のデータに短時間フーリエ変換をかけることにより、周波数領域のデータであるスペクトルXk(t)を得る（ここでは、tはフレーム番号）。また、図中、α、β、γで示されるように、切り出すフレームの間には重複があってもよい。これにより、連続するフレームのスペクトルXk(t-1)、Xk(t)、Xk(t+1)を、滑らかに変化させることができる。図１３の下段に示される、スペクトルをフレーム番号に従って並べたものは、スペクトログラムと称される。
【０１６２】
入力チャンネルが複数（マイクの個数分）あるため、フーリエ変換部８１は、フーリエ変換をチャンネル数だけ行なう。以降では、全チャンネル、1フレーム分のフーリエ変換結果を、次の式（１１）に示されるベクトルX(t)で表わすものとする。
【０１６３】
【数１１】
2008147920.tif 000013
【０１６４】
なお、式（１１）において、nは、チャンネル数、すなわち、マイク数であり、Mは、周波数ビンの総数であり、短時間フーリエ変換のポイント数をLとすると、M＝L/2+1である。
【０１６５】
ステップＳ４において、図１５のフローチャートを用いて後述するスレッド制御処理が実行される。
【０１６６】
ステップＳ５において、分離部８２は、バックグラウンド処理部７２の分離行列保持部９３から取得した分離行列Ｗを用いて、ステップＳ３においてフーリエ変換された観測信号観測信号X(t)に対して分離処理を実行する。
【０１６７】
すなわち、分離行列Ｗは、次の式（１２）で表される。そして、次の式（１３）で表される分離結果Ｙ（ｔ）は、式（１４）を用いて求めることができる。
【０１６８】
【数１２】
2008147920.tif 000014
【０１６９】
【数１３】
2008147920.tif 000015
【０１７０】
【数１４】
2008147920.tif 000016
【０１７１】
なお、式（１２）で表わされる行列Wは、対角行列からなる疎行列であり、また、要素の0は、それぞれの対角行列において対角成分以外の値は常に0であることを表わしている。
【０１７２】
ステップＳ６において、フーリエ逆変換部８３は、分離結果Y(t)に対して、逆フーリエ変換を実行し、時間領域の信号に戻す。その際、必要に応じて overlap add（重複足し合わせ）が行なわれる。さらに、フレーム間で不連続性が発生するのを防ぐため、1フレーム分のデータの逆フーリエ変換結果に対して、サイン窓等の適切な窓関数を適用した上で overlap addが行なわれるようにしても良い。この処理は、weighted overlap add（WOLA）と称される。
【０１７３】
フーリエ逆変換部８３は、ステップＳ７において、逆フーリエ変換によって得られた信号、すなわち、時間領域の信号を、必要に応じてバッファリングし、ステップＳ８において、例えば、音声認識処理など、後段の所定の処理を実行するために出力する。
【０１７４】
ステップＳ９において、フーリエ変換部８１は、観測信号の取得が終了したか否かを判断する。ステップＳ９において、観測信号の取得が終了していないと判断された場合、処理は、ステップＳ２に戻り、それ以降の処理が繰り返される。ステップＳ９において、観測信号の取得が終了したと判断された場合、処理は終了される。
【０１７５】
このような処理により、音源分離装置１１において、複数音源からの音の分離が実行される。
【０１７６】
次に、図１４のフローチャートを参照して、図１２のステップＳ１において実行された、初期化処理について説明する。
【０１７７】
ステップＳ３１において、スレッド制御部９１は、自分自身を初期化する。
【０１７８】
具体的には、スレッド制御部９１において、現フレーム番号保持カウンタ１３１が初期化されてその値が０とされ、学習初期値保持部１３２に適切な初期値が代入される。例えば、初期値は単位行列でも良いし、前回のシステム終了時の分離行列Ｗが保存されている場合は、前回のシステム終了時の分離行列Ｗ、またはこの分離行列に適切な変換を作用させたものを使用しても良い。また、例えば、画像や先見知識等の情報により、音源の方向がある程度の精度で推定できるような場合には、音源方向に基づいて初期値を算出して、設定するものとしてもよい。
【０１７９】
そして、蓄積開始予定タイミング指定情報保持部１３３には、(必要スレッド数−1)×block_shiftの値が設定される。この値は、一番大きなスレッド番号を有するスレッドの蓄積が開始するタイミング（フレーム番号）である。そして、観測信号の蓄積タイミング情報保持部１３４には、最新の分離行列に対応した観測信号を示すタイミング情報（ブレーム番号または相対時刻情報）が保持されるので、ここでは、初期化されて、０が保持される。
【０１８０】
なお、分離行列保持部９３にも、初期化された場合の学習初期値保持部１３２と同様に、適切な初期値が保持される。すなわち、分離行列保持部９３に保持される初期値は、単位行列でも良いし、前回のシステム終了時の分離行列が保存されている場合は、前回のシステム終了時の分離行列Ｗ、またはこの分離行列に適切な変換を作用させたものを使用しても良い。また、例えば、画像や先見知識等の情報により、音源の方向がある程度の精度で推定できるような場合には、音源方向に基づいて初期値を算出して、設定するものとしてもよい。
【０１８１】
ステップＳ３２において、スレッド制御部９１は、スレッド演算処理部９２において実行されるスレッドを必要な数ｉだけ確保し、それらの状態を「初期化」状態とする。
【０１８２】
ここで、必要なスレッドの数ｉは、thread_len／block_shiftの小数点以下を切り上げる（すなわち、thread_len／block_shiftよりも大きく最も値の近い整数）ことにより求められる。
【０１８３】
ステップＳ３３において、スレッド制御部９１は、スレッドループを開始して、全てのスレッドの初期化が終了するまで、初期化未処理のスレッドを検出して、ステップＳ３４乃至ステップＳ３９の処理を実行する。
【０１８４】
ステップＳ３４において、スレッド制御部９１は、スレッド番号は１であるか否かを判断する。
【０１８５】
ステップＳ３４において、スレッド番号は１であると判断された場合、ステップＳ３５において、スレッド制御部９１は、スレッド番号１のスレッド（例えば、スレッド１０１−１）を制御して、そのカウンタ１６６を初期化（例えば、０にセット）する。
【０１８６】
ステップＳ３６において、スレッド制御部９１は、スレッド番号１のスレッド（例えば、スレッド１０１−１）に、「蓄積中」状態に状態を遷移させるための状態遷移コマンドを発行して、処理は、後述するステップＳ３９にすすむ。
【０１８７】
ステップＳ３４において、スレッド番号は１ではないと判断された場合、ステップＳ３７において、スレッド制御部９１は、対応するスレッド（スレッド１０１−２乃至スレッド１０１−ｉのうちのいずれか）のカウンタ１６６の値を、thread_len−block_shift×（スレッド番号-１）に設定する。
【０１８８】
ステップＳ３８において、スレッド制御部９１は、「待機中」状態に状態を遷移させるための状態遷移コマンドを発行する。
【０１８９】
ステップＳ３６、または、ステップＳ３８の処理の終了後、ステップＳ３９において、スレッド制御部９１は、スレッド内のまだ初期化されていない情報、すなわち、状態格納部１６５に格納された状態を示す情報、および、カウンタ１６６のカウンタ値以外の情報を初期化する。具体的には、例えば、スレッド制御部９１は、学習終了フラグ１６８をＯＦＦにセットし、観測信号の開始・終了タイミング保持部１６７、および、前処理用データ保持部１６９の値を初期化（例えば、０にセット）する。
【０１９０】
スレッド演算処理部９２に確保された全てのスレッド、すなわち、スレッド１０１−１乃至スレッド１０１−ｉが初期化された場合、ステップＳ４０において、スレッドループが終了され、処理は、図１２のステップＳ１に戻り、ステップＳ２に進む。
【０１９１】
このような処理により、スレッド制御部９１は、スレッド演算部に確保された複数のスレッドのすべてを初期化する。
【０１９２】
なお、ここでは、立ち上げられたスレッドの数ｉだけ、ステップＳ３３乃至ステップＳ４０の処理のループが繰り返されるものとして説明したが、処理ループを繰り返す代わりに、スレッドの個数ｉの並列処理を実行するものとしてもよい。これ以降の処理ループを繰り返す部分についても、同様に、処理ループを繰り返す代わりに、並列処理を実行するようにしても良い。
【０１９３】
次に、図１５のフローチャートを参照して、図１２のステップＳ４において、スレッド制御部９１によって実行される、スレッド制御処理について説明する。
【０１９４】
ステップＳ７１において、スレッド制御部９１は、スレッドループを開始し、制御実行するスレッドのスレッド番号を示す変数ｓをｓ＝１として、１つのスレッドの処理が終了すると変数ｓを１インクリメントして、ｓ＝ｉとなるまで、ステップＳ７２乃至ステップＳ７７のスレッドループの処理を繰り返し実行する。
【０１９５】
ステップＳ７２において、スレッド制御部９１は、変数ｓで示されるスレッド番号のスレッドの状態格納部１６５に保持されている、そのスレッドの内部状態を示す情報を取得する。
【０１９６】
ステップＳ７３において、スレッド制御部９１は、変数ｓで示されるスレッド番号のスレッドの内部状態を検出する。
【０１９７】
ステップＳ７３において、変数ｓで示されるスレッド番号のスレッドの状態は、「待機中」状態であると検出された場合、ステップＳ７４において、スレッド制御部９１は、図１６のフローチャートを用いて後述する、待機中状態における処理を実行し、処理は、後述するステップＳ７７に進む。
【０１９８】
ステップＳ７３において、変数ｓで示されるスレッド番号のスレッドの状態は、「蓄積中」状態であると検出された場合、ステップＳ７５において、スレッド制御部９１は、図１７のフローチャートを用いて後述する、蓄積中状態における処理を実行し、処理は、後述するステップＳ７７に進む。
【０１９９】
ステップＳ７３において、変数ｓで示されるスレッド番号のスレッドの状態は、「学習中」状態であると検出された場合、ステップＳ７６において、スレッド制御部９１は、図１８のフローチャートを用いて後述する、学習中状態における処理を実行する。
【０２００】
ステップＳ７４、ステップＳ７５、または、ステップＳ７６の処理の終了後、ステップＳ７７において、スレッド制御部９１は、変数ｓを１インクリメントする。そして、制御実行するスレッドのスレッド番号を示す変数ｓが、ｓ＝ｉとなったとき、スレッドループを終了する。
【０２０１】
ステップＳ７８において、スレッド制御部９１は、現フレーム番号保持カウンタ１３１に保持されているフレーム番号を１インクリメントし、処理は、図１２のステップＳ４に戻り、ステップＳ５に進む。
【０２０２】
このような処理により、スレッド制御部９１は、複数のスレッドの全てを、それらの状態に応じて制御することができる。
【０２０３】
なお、ここでは、立ち上げられたスレッドの数ｉだけ、スレッドループが繰り返されるものとして説明したが、スレッドループを繰り返す代わりに、スレッドの個数ｉの並列処理を実行するものとしてもよい。
【０２０４】
次に、図１６のフローチャートを参照して、図１５のステップＳ７４において実行される、待機中状態における処理について説明する。
【０２０５】
この待機中状態における処理は、図１５を用いて説明したスレッド制御処理における変数ｓに対応するスレッドの状態が「待機中」状態であるときに、スレッド制御部９１において実行される処理である。
【０２０６】
ステップＳ１１１において、スレッド制御部９１は、対応するスレッド１０１のカウンタ１６６を、１インクリメントする。
【０２０７】
ステップＳ１１２において、スレッド制御部９１は、対応するスレッド１０１のカウンタ１６６の値は、スレッド長（thread_len）より小さいか否かを判断する。ステップＳ１１２において、カウンタ１６６の値は、スレッド長より小さいと判断された場合、処理は、図１５のステップＳ７４に戻り、ステップＳ７７に進む。
【０２０８】
ステップＳ１１２において、カウンタ１６６の値は、スレッド長より小さくないと判断された場合、ステップＳ１１３において、スレッド制御部９１は、「蓄積中」状態に状態を遷移させるための状態遷移コマンドを、対応するスレッド１０１に発行する。
【０２０９】
すなわち、スレッド制御部９１は、図６を用いて説明した状態遷移図において、「待機中」であるスレッドを、「蓄積中」に遷移させるための状態遷移コマンドを発行する。
【０２１０】
ステップＳ１１４において、スレッド制御部９１は、対応するスレッド１０１のカウンタ１６６を初期化（例えば、０にセット）し、観測信号の開始・終了タイミング保持部１６７に、観測信号の蓄積開始タイミング情報、すなわち、現フレーム番号保持カウンタ１３１に保持されている現在のフレーム番号、または、それと同等の相対時刻情報などを設定して、処理は、図１５のステップＳ７４に戻り、ステップＳ７７に進む。
【０２１１】
このような処理により、スレッド制御部９１は、「待機中」状態であるスレッドを制御し、そのカウンタ１６６の値に基づいて、「蓄積中」に状態を遷移させることができる。
【０２１２】
次に、図１７のフローチャートを参照して、図１５のステップＳ７５において実行される、蓄積中状態における処理について説明する。
【０２１３】
この蓄積中状態における処理は、図１５を用いて説明したスレッド制御処理における変数ｓに対応するスレッドの状態が「蓄積中」状態であるときに、スレッド制御部９１において実行される処理である。
【０２１４】
ステップＳ１４１において、スレッド制御部９１は、１フレーム分の観測信号X(t)を、学習のために、対応するスレッド１０１に供給する。この処理は、図９を用いて説明した、スレッド制御部９１からそれぞれのスレッドへの観測信号の供給に対応する。
【０２１５】
ステップＳ１４２において、スレッド制御部９１は、対応するスレッド１０１のカウンタ１６６を、１インクリメントする。
【０２１６】
ステップＳ１４３において、スレッド制御部９１は、対応するスレッド１０１のカウンタ１６６の値は、ブロック長（block_len）より小さいか否か、換言すれば、対応するスレッドの観測信号バッファ１６１が満杯であるか否かを判断する。ステップＳ１４３において、カウンタ１６６の値は、ブロック長より小さい、換言すれば、対応するスレッドの観測信号バッファ１６１が満杯ではないと判断された場合、処理は、図１５のステップＳ７５に戻り、ステップＳ７７に進む。
【０２１７】
ステップＳ１４３において、カウンタ１６６の値は、ブロック長より小さくない、換言すれば、対応するスレッドの観測信号バッファ１６１が満杯であると判断された場合、ステップＳ１４４において、スレッド制御部９１は、「学習中」状態に状態を遷移させるための状態遷移コマンドを、対応するスレッド１０１に発行して、処理は、図１５のステップＳ７５に戻り、ステップＳ７７に進む。
【０２１８】
すなわち、スレッド制御部９１は、図６を用いて説明した状態遷移図において、「蓄積中」であるスレッドを、「学習中」に遷移させるための状態遷移コマンドを発行する。
【０２１９】
このような処理により、スレッド制御部９１は、「蓄積中」状態であるスレッドに観測信号を供給してその蓄積を制御し、そのカウンタ１６６の値に基づいて、「蓄積中」から「学習中」に状態を遷移させることができる。
【０２２０】
次に、図１８のフローチャートを参照して、図１５のステップＳ７６において実行される、学習中状態における処理について説明する。
【０２２１】
この学習中状態における処理は、図１５を用いて説明したスレッド制御処理における変数ｓに対応するスレッドの状態が「学習中」状態であるときに、スレッド制御部９１において実行される処理である。
【０２２２】
ステップＳ１７１において、スレッド制御部９１は、対応するスレッド１０１の学習終了フラグ１６８がONであるか否かを判断する。ステップＳ１７１において、学習フラグがONであると判断された場合、処理は、後述するステップＳ１７５に進む。
【０２２３】
ステップＳ１７１において、学習フラグがONではないと判断された場合、すなわち、対応するスレッドにおいて学習処理が実行中である場合、ステップＳ１７２において、スレッド制御部９１は、対応するスレッド１０１のカウンタ１６６を、１インクリメントする。
【０２２４】
ステップＳ１７３において、スレッド制御部９１は、対応するスレッド１０１のカウンタ１６６の値は、スレッド長（thread_len）より小さいか否かを判断する。ステップＳ１７３において、カウンタ１６６の値は、スレッド長より小さいと判断された場合、処理は、図１５のステップＳ７６に戻り、ステップＳ７７に進む。
【０２２５】
ステップＳ１７３において、カウンタ１６６の値は、スレッド長より小さくないと判断された場合、ステップＳ１７４において、スレッド制御部９１は、カウンタ１６６の値から所定の値を減算し、処理は、図１５のステップＳ７６に戻り、ステップＳ７７に進む。
【０２２６】
学習中にカウンタの値がスレッド長に達した場合とは、学習にかかる時間が長くなってしまい、「待機中」状態の時間が存在しなくなった場合である。その場合、学習はまだ継続しており、観測信号バッファ１６１は利用されているため、次の蓄積を開始することができない。そこで、スレッド制御部９１は、学習が終了するまで、次の蓄積の開始、すなわち、「蓄積中」状態へ状態を遷移させるための状態遷移コマンドの発行を延期する。そのため、スレッド制御部９１は、カウンタ１６６の値から所定の値を減算する。減算する値は、例えば、１であっても良いが、それよりも大きな値でも良く、例えば、スレッド長の１０％などといった値であっても良い。
【０２２７】
なお、「蓄積中」状態への状態の遷移の延期を行なうと、蓄積開始時刻がスレッド間で不等間隔となり、最悪の場合、複数のスレッドでほぼ同一の区間の観測信号を蓄積してしまう可能性もある。そうなると、いくつかのスレッドが無意味になるだけでなく、例えば、ＣＰＵ２１が実行するOSのマルチスレッドの実装によっては、1つのＣＰＵ２１で複数の学習が同時に動くことになって、更に学習時間が増大し、間隔が一層不均等になってしまう可能性がある。
【０２２８】
そのような事態を防ぐためには、他のスレッドの待機時間を調整して蓄積開始タイミングが再び等間隔になるように調整すればよい。他のスレッドの待機時間の調整については、図２０を用いて後述する。
【０２２９】
ステップＳ１７１において、学習フラグがONであると判断された場合、すなわち、対応するスレッドにおいて学習処理が終了した場合、ステップＳ１７５において、スレッド制御部９１は、対応するスレッド１０１の学習終了フラグ１６８をOFFにする。
【０２３０】
ステップＳ１７６において、図１９を用いて後述する、分離行列更新処理が実行され、学習によって求められた分離行列Wの値が最も新しい観測信号を基に算出されたものであった場合、分離部８２による分離処理に用いられるとともに、他のスレッドの学習に反映される。
【０２３１】
ステップＳ１７７において、図２０を用いて後述する、待機時間の設定処理が実行されて、処理は、図１５のステップＳ７６に戻り、ステップＳ７７に進む。
【０２３２】
なお、図２０を用いて後述する待機時間の設定処理において、スレッド制御部９１は、対応するスレッドに対して、「待機中」か「蓄積中」かのいずれかの状態に状態を遷移させるための状態遷移コマンドを発行する。
【０２３３】
このような処理により、スレッド制御部９１は、対応するスレッドの学習終了フラグ１６８を参照して、「学習中」状態のスレッドの学習が終了したか否かを判断し、学習が終了した場合、分離行列Ｗを更新し、待機時間を設定するとともに、「学習中」状態から、「待機中」または「蓄積中」に状態を遷移させることができる。
【０２３４】
次に、図１９のフローチャートを参照して、図１８のステップＳ１７６において実行される、分離行列更新処理について説明する。
【０２３５】
ステップＳ２０１において、スレッド制御部９１は、スレッドの、観測信号の開始・終了タイミング保持部１６７に保持されている観測信号の開始タイミングは、観測信号の蓄積タイミング情報保持部１３４に保持されている、現在の分離行列に対応した蓄積開始タイミングよりも早いか否かを判断する。
【０２３６】
すなわち、図７に示されるように、スレッド１の学習とスレッド２の学習とは、その一部で時間が重なっている。この図では、学習２０１のほうが、学習２０２より先に終了しているが、例えば、それぞれの学習にかかる時間によっては、学習２０１よりも学習２０２のほうが先に終了してしまう場合もあり得る。
【０２３７】
ここで、ステップＳ２０１の判断が実行されず、学習の終了が遅いものが最新の分離行列として扱われてしまった場合、スレッド２由来の分離行列Ｗ２が、より古いタイミングで取得された観測信号によって学習されて得られたスレッド１由来の分離行列Ｗ１に上書きされてしまう。そこで、新しいタイミングで取得された観測信号によって得られた分離行列が最新の分離行列として扱われるように、観測信号の開始・終了タイミング保持部１６７に保持されている観測信号の開始タイミングと、観測信号の蓄積タイミング情報保持部１３４に保持されている現在の分離行列に対応した蓄積開始タイミングとが比較される。
【０２３８】
ステップＳ２０１において、観測信号の開始タイミングは、現在の分離行列に対応した蓄積開始タイミングよりも早いと判断された場合、換言すれば、このスレッドの学習の結果得られた分離行列Ｗは、現在、観測信号の蓄積タイミング情報保持部１３４に保持されている分離行列Ｗよりも早いタイミングで観測された信号に基づいて学習されていると判断された場合、このスレッドの学習の結果得られた分離行列Ｗは利用されないので、処理は、図１８のステップＳ１７６に戻り、ステップＳ１７７に進む。
【０２３９】
ステップＳ２０１において、観測信号の開始タイミングは、現在の分離行列に対応した蓄積開始タイミングよりも早くないと判断された場合、すなわち、このスレッドの学習の結果得られた分離行列Ｗは、現在、観測信号の蓄積タイミング情報保持部１３４に保持されている分離行Ｗよりも遅いタイミングで観測された信号に基づいて学習されていると判断された場合、ステップＳ２０２において、スレッド制御部９１は、対応するスレッドの学習によって得られた分離行列Ｗを取得し、分離行列保持部９３に供給して、設定する。
【０２４０】
ステップＳ２０３において、スレッド制御部９１は、学習初期値保持部１３２に保持される、それぞれのスレッドにおける学習の初期値を設定する。
【０２４１】
具体的には、スレッド制御部９１は、学習初期値として、対応するスレッドの学習によって得られた分離行列Ｗを設定するものとしてもよいし、対応するスレッドの学習によって得られた分離行列Ｗを用いて演算される、分離行列Ｗとは異なる値を設定するものとしても良い。
【０２４２】
ステップＳ２０４において、スレッド制御部９１は、対応するスレッドの、観測信号の開始・終了タイミング保持部１６７に保持されているタイミング情報を、観測信号の蓄積タイミング情報保持部１３４に設定し、処理は、図１８のステップＳ１７６に戻り、ステップＳ１７７に進む。
【０２４３】
ステップＳ２０４の処理により、現在使用中、すなわち、分離行列保持部９３に保持されている分離行列Ｗが、どの時間区間の観測信号から学習されたものであるかが示される。
【０２４４】
このような処理により、新しいタイミングで取得された観測信号によって得られた分離行列が最新の分離行列として設定される。
【０２４５】
なお、ステップＳ２０３の処理においては、学習初期値保持部１３２により保持されている学習の初期値は、最新の学習結果である分離行列Ｗと等しい値であっても良いし、これとは異なる値を用いるものとしても良い。
【０２４６】
学習初期値保持部１３２により保持される学習の初期値を、最新の学習結果である分離行列Ｗと等しい値とした場合、異なるブロックから求まった分離行列の間でも、「どのチャンネルにどの音源が出力されるか」という対応関係が維持される可能性が高くなる。
【０２４７】
これに対して、スレッドの個数やブロックのシフト幅の値によっては、最新の学習結果である分離行列Ｗと等しい値を学習初期値保持部１３２にしただけでは、「どのチャンネルにどの音源が出力されるか」という対応関係が維持されない場合もある。
【０２４８】
具体的には、図７に示されるように４つのスレッドが並行して動作し、スレッド長はブロック長の２倍、ブロックのシフト幅はブロック長の１／２であり、また、学習に要する時間がブロックのシフト幅よりも長い場合、学習の初期値として最新の学習結果である分離行列Ｗを用いると、例えば、スレッド３に含まれる学習は、学習２０４−１も、学習２０４−２も、いずれにおいても、スレッド1に由来する分離行列Wを、初期値として利用することになる。そして、同様に、スレッド１に含まれる学習は、スレッド３に由来する分離行列Wを初期値として利用し、スレッド２に含まれる学習は、スレッド４に由来する分離行列Wを初期値として利用し、スレッド４に含まれる学習は、スレッド２に由来する分離行列Wを初期値として利用する。
【０２４９】
すなわち、スレッド間の初期値の受け渡しに注目すると、スレッド１およびスレッド３の系列と、スレッ２およびスレッド４の系列とが存在し、これらの系列間では、初期値の相互利用はなされない。
【０２５０】
このように、初期値の相互利用が行われない系列が複数存在すると、それらの系列間で分離行列が異なったものになる可能性があり、最悪の場合、分離行列が更新されるごとに、「どのチャンネルにどの音源が出力されるか」という対応関係が変化してしまう可能性がある。
【０２５１】
そこで、初期値の相互利用が行われない系列ができることを防ぐために、学習の初期値として、最新の学習結果である分離行列の他に、それ以前の学習で求まった分離行列の値も反映させて算出される値（最新の学習結果である分離行列を分離行列Ｗ[k]として、分離行列Ｗ[k-1]、分離行列Ｗ[k-2]などの値も反映させて算出される値）を用いるようにすることができる。
【０２５２】
例えば、学習の初期値をW_initとすると、学習初期値保持部１３２に保持される学習の初期値をW_init＝W[k]としても良いし、W_init＝（Ｗ[k]＋Ｗ[k-1] ＋・・・＋Ｗ[k-N]）／（Ｎ＋１）としてもよいし、所定の重み付け係数ａを用いて、W_initにaW＋(1-a)W_initを代入するようにしても良い。
【０２５３】
次に、図２０のフローチャートを参照して、図１８のステップＳ１７７において実行される、待機時間の設定処理について説明する。
【０２５４】
ステップＳ２３１において、スレッド制御部９１は、残りの待機時間を計算する。
【０２５５】
具体的には、スレッド制御部９１は、残り待機時間（フレーム個数）をrest、蓄積開始予定タイミング指定情報保持部１３３に保持されている、蓄積開始予定タイミング（フレーム番号、または、対応する相対時刻）をCt、現フレーム番号保持カウンタ１３１に保持されている現フレーム番号をFt、ブロックのシフト幅をblock_shiftとして、残り待機時間restを、rest＝Ct＋block_shift−Ftを基に算出する。すなわち、Ct+block_shiftが、次々回蓄積開始予定時刻を意味するため、そこからFtを引くことで、「次々回蓄積開始予定時刻までの残り時間」が求まるのである。
【０２５６】
ステップＳ２３２において、スレッド制御部９１は、残りの待機時間restの計算結果は正の値であるか否かを判断する。ステップＳ２３２において、残りの待機時間restの計算結果は正の値ではない、すなわち、負の値であると判断された場合、処理は、後述するステップＳ２３６に進む。
【０２５７】
ステップＳ２３２において、残りの待機時間restの計算結果は正の値であると判断された場合、ステップＳ２３３において、スレッド制御部９１は、「待機中」状態に状態を遷移させるための状態遷移コマンドを、対応するスレッドに発行する。
【０２５８】
ステップＳ２３４において、スレッド制御部９１は、対応するスレッドのカウンタ１６６の値を、thread_len−restに設定する。そうすることで、カウンタの値が、thread_lenに達するまでの間は、「待機中」状態が継続される。
【０２５９】
ステップＳ２３５において、スレッド制御部９１は、蓄積開始予定タイミング指定情報保持部１３３に保持されている値Ctに、block_shiftの値を加算する、すなわち、蓄積開始予定タイミング指定情報保持部１３３に次回の蓄積開始タイミングである、Ct＋block_shiftの値を設定し、処理は、図１８のステップＳ１７７に戻り、図１５のステップＳ７６に戻り、ステップＳ７７に進む。
【０２６０】
ステップＳ２３２において、残りの待機時間restの計算結果は正の値ではない、すなわち、負の値であると判断された場合、予定された蓄積開始タイミングを過ぎているのにもかかわらず蓄積が始まっていないことを意味するので、直ちに蓄積を開始する必要がある。そこで、ステップＳ２３６において、スレッド制御部９１は、「蓄積中」状態に状態を遷移させるための状態遷移コマンドを、対応するスレッドに発行する。
【０２６１】
ステップＳ２３７において、スレッド制御部９１は、カウンタの値を初期化（例えば0をセット）する。
【０２６２】
ステップＳ２３８において、スレッド制御部９１は、蓄積開始予定タイミング指定情報保持部１３３に次回の蓄積開始タイミング、すなわち、現フレーム番号であるFtを設定し、処理は、図１８のステップＳ１７７に戻り、図１５のステップＳ７６に戻り、ステップＳ７７に進む。
【０２６３】
このような処理により、それぞれのスレッドにおける「学習中」状態にかかる時間に応じて、「待機中」状態とする時間を設定することができる。
【０２６４】
具体的には、例えば、図２１の図中ａに示されるように、スレッド２の学習時間が長くなることにより、蓄積時間と学習時間の合計がスレッド長より長くなってしまい、学習終了タイミングがスレッド３の蓄積終了タイミングより遅くなった場合、スレッド２の状態は、「待機中」状態には遷移せず、「蓄積中」状態に遷移する。
【０２６５】
このような状況において、残りの待機時間restの計算結果にかかわらず、次回の蓄積開始タイミングの設定を同一とした場合、図中、下向き矢印「↓」で示される蓄積が開始するタイミングと、図中、上向き矢印「↑」で示される学習が終了する（＝分離行列が更新される）タイミングは、それ以降、それぞれのスレッド間で不均一になってしまう。
【０２６６】
蓄積が開始するタイミングと分離行列が更新されるタイミングは、いずれも、スレッド間でできるだけ等間隔であることが望ましい。
【０２６７】
そこで、ここでは、図２２に示されるように、図２２の図中ｃで示されるように、スレッド２の学習時間が長くなることにより、蓄積時間と学習時間の合計がスレッド長より長くなってしまい、学習終了タイミングがスレッド３の蓄積終了タイミングより遅くなった場合であっても、図中ｅおよびｄに示されるように、待機時間を延長することにより蓄積開始タイミングが調整される。これにより、それ以降の蓄積が開始するタイミングと分離行列が更新されるタイミングは、いずれも、スレッド間で等間隔となる。
【０２６８】
次に、図２３のフローチャートを参照して、スレッド制御部９１の制御に基づいて、スレッド演算処理部９２において実行される、スレッド１０１の処理について説明する。すなわち、図２３の処理は、上述したスレッド制御部９１の処理と並行して実行されるものである。
【０２６９】
スレッド１０１は、ステップＳ２６１において、初期設定される。そして、ステップＳ２６２において、スレッド制御部９１から入力されたイベントによって、続く処理が分岐される。
【０２７０】
イベントは、状態遷移コマンドが発行された場合、フレームデータが転送された場合、または、終了コマンドが発行された場合のいずれかのアクションが行なわれたときに発生する。
【０２７１】
ステップＳ２６２において、状態遷移コマンドが入力されたと判断された場合、ステップＳ２６３において、図２４のフローチャートを用いて後述するコマンド処理が実行され、処理は、ステップＳ２６２に戻り、それ以降の処理が繰り返される。
【０２７２】
ステップＳ２６２において、フレームデータの転送イベントの入力を受けたと判断された場合、ステップＳ２６４において、スレッド１０１は、フレームデータを取得する。
【０２７３】
ステップＳ２６５において、スレッド１０１は、取得したフレームデータを、観測信号バッファ１６１に蓄積し、処理は、ステップＳ２６２に戻り、それ以降の処理が繰り返される。
【０２７４】
観測信号バッファ１６１は、配列またはスタックの構造をしており、観測信号はカウンタと同じ番号の個所に格納されるものとする。ただし、後述の「フレーム間引き」を行なう場合は、間引いた分だけ詰めて格納されるものとする。
【０２７５】
ステップＳ２６２において、終了コマンドが入力されたと判断された場合、ステップＳ２６６において、スレッド１０１は、例えば、メモリの開放などの適切な終了前処理を実行し、処理が終了される。
【０２７６】
このような処理により、スレッド制御部９１の制御に基づいて、それぞれのスレッドにおいて処理が実行される。
【０２７７】
次に、図２４のフローチャートを参照して、図２３のステップＳ２６３において実行される、コマンド処理について説明する。
【０２７８】
ステップＳ２９１において、スレッド１０１は、供給された状態遷移コマンドに応じて、それ以降の処理を分岐する。
【０２７９】
ステップＳ２９１において、供給された状態遷移コマンドは、「待機中」状態への遷移を指令するコマンドであると判断された場合、ステップＳ２９２において、スレッド１０１は、状態格納部１６５に、状態が「待機中」であることを示す情報を格納する、すなわち、状態を「待機中」に遷移して、処理は、図２３のステップＳ２６３に戻り、ステップＳ２６２に進む。
【０２８０】
ステップＳ２９１において、供給された状態遷移コマンドは、「蓄積中」状態への遷移を指令するコマンドであると判断された場合、ステップＳ２９３において、スレッド１０１は、状態格納部１６５に、状態が「蓄積中」であることを示す情報を格納する、すなわち、状態を「蓄積中」に遷移して、処理は、図２３のステップＳ２６３に戻り、ステップＳ２６２に進む。
【０２８１】
ステップＳ２９１において、供給された状態遷移コマンドは、「学習中」状態への遷移を指令するコマンドであると判断された場合、ステップＳ２９４において、スレッド１０１は、状態格納部１６５に、状態が「学習中」であることを示す情報を格納する、すなわち、状態を「学習中」に遷移する。
【０２８２】
ステップＳ２９５において、図２５を用いて後述する分離行列の学習処理が実行される。
【０２８３】
ステップＳ２９６において、スレッド１０１は、学習が終了したことをスレッド制御部９１へ通知するために、学習終了フラグ１６８をONにし、処理は、図２３のステップＳ２６３に戻り、ステップＳ２６２に進む。
【０２８４】
このような処理により、スレッド制御部９１から供給された状態遷移コマンドに基づいて、それぞれのスレッドの状態が遷移される。
【０２８５】
次に、図２５のフローチャートを参照して、図２４のステップＳ２９５において実行される処理の一例である、分離行列の学習処理１について説明する。
【０２８６】
ステップＳ３２１において、スレッド１０１の学習演算部１６３は、観測信号バッファ１６１に蓄積された観測信号に対して、必要に応じて、前処理を実行する。
【０２８７】
具体的には、学習演算部１６３は、観測信号バッファ１６１に蓄積された観測信号に対して、正規化や無相関化（pre-whitening）などの処理を行なう。例えば、正規化を行なう場合、学習演算部１６３は、観測信号バッファ１６１内の各周波数ｂｉｎについて観測信号の標準偏差を求め、標準偏差の逆数からなる対角行列をＳとして、Ｘ'＝ＳＸを計算する。このＸは、観測信号バッファ１６１内の全フレーム分の観測信号からなる行列であり、式（１１）のX(t)をt＝1乃至Tについて横方向に並べたもの、すなわち、Ｘ＝［Ｘ（１），・・・Ｘ（Ｔ）］（Ｔは総フレーム数、すなわち、ブロック長block_len）と表現される。
【０２８８】
ステップＳ３２２において、学習演算部１６３は、分離行列の初期値として、スレッド制御部９１から、スレッド制御部９１の学習初期値保持部１３２により保持されている学習初期値W_initを取得する。上述したように、学習初期値保持部１３２に保持される学習初期値W_initは、W_init＝W[k]としても良いし、W_init＝（Ｗ[k]＋Ｗ[k-1] ＋・・・＋Ｗ[k-N]）／（Ｎ＋１）としてもよいし、所定の重み付け係数ａを用いて、W_initにaW＋(1-a)W_initを代入するようにしても良い。
【０２８９】
ステップＳ３２３において、学習演算部１６３は、分離行列Wの値が収束したか否かを判断する。分離行列Wの値が収束したか否かは、例えば、分離行列の増分であるΔWがゼロ行列に近いかどうかで判定することができる。ゼロ行列の判定法としては、例えば、次の式（１５）を用いて、分離行列のノルムを計算するとともに、分離行列の増分ΔＷについても、同様にノルムを計算し、両者の比である‖ΔW‖/‖W‖が一定の値（例えば、1/1000）よりも小さい場合、分離行列Ｗが収束したと判定するものとしてもよい。‖ΔW‖を‖W‖で割る理由は、チャンネル数や観測信号などの違いを吸収するためである。
【０２９０】
また、分離行列Ｗの値が収束したか否かの判断に代わって、単純に、学習処理ループが一定回数（例えば５０回）回ったか否かを判定するものとしても良い。
【０２９１】
【数１５】
2008147920.tif 000017
【０２９２】
ステップＳ３２３において、分離行列Ｗの値が収束したと判断された場合、処理は、後述するステップＳ３３０に進む。
【０２９３】
すなわち、分離行列Ｗが収束するまで、学習処理ループが実行される。
【０２９４】
ステップＳ３２３において、分離行列Ｗの値が収束していないと判断された場合、ステップＳ３２４において、学習演算部１６３は、次の式（１６）または次の式（１７）を計算する。式（１６）は、前処理が実行されなかった場合の演算であり、式（１７）は、前処理が実行されて、Ｘ'＝ＳＸが用いられる場合の演算である。
【０２９５】
Ｙ（ｔ）＝ＷＸ（ｔ）（ｔ＝１，２，・・・，Ｔ）・・・（１６）
【０２９６】
Ｙ（ｔ）＝ＷＸ'（ｔ）（ｔ＝１，２，・・・，Ｔ）・・・（１７）
【０２９７】
ステップＳ３２５において、学習演算部１６３は、周波数ｂｉｎループを開始する。学習演算部１６３は、周波数ｂｉｎを示す変数ωをω＝１（ωは１乃至Ｍ）とし、ステップＳ３２６の処理が実行されるごとに、周波数ｂｉｎを示す変数ωをω＝ω＋１として、変数ω＝Ｍとなるまで、繰り返して処理を実行する。
【０２９８】
ステップＳ３２６において、学習演算部１６３は、ΔＷ（ω）を計算する。ΔＷ（ω）の計算方法は、時間周波数領域のバッチ処理に適用可能であれば任意の方式が使用可能だが、例えば、特開2006-238409号公報に開示されているものと同様の方式を用いる場合には、次の式（１８）に示されるΔＷ（ω）を計算する。
【０２９９】
【数１６】
2008147920.tif 000018
【０３００】
なお、式（１８）におけるW(ω)は、上述した式(１２)に示される分離行列Wからω番目の周波数ビンに対応する要素を抽出したものであり、次の式（１９）で示される。ΔW(ω)についても同様である。Y(ω,t)も同様に、Y(t)からω番目の周波数ビンに対応する要素を抽出したものであり、式（２０）で表わされる。また、式（１８）における上付きのHはエルミート転置（ベクトルや行列を転置すると共に、各要素を共役複素数へ変換する）である。また、Et[]は観測信号バッファ内の全フレームについて平均を取ることを意味する。
【０３０１】
そして、式（１８）において、φω(Y(t))は、式（２１）で表わされるベクトルである。式（２１）の要素φkω(Yk(t))は、スコア関数や活性化関数と称され、引数のYk(t)に対応した多変量確率密度関数（PDF）の対数をω番目の引数で偏微分したものである（式（２２））。式（１８）において使用可能なPDFやスコア関数については、例えば、特開2006-238409号公報に開示されている。
【０３０２】
【数１７】
2008147920.tif 000019
【０３０３】
【数１８】
2008147920.tif 000020
【０３０４】
【数１９】
2008147920.tif 000021
【０３０５】
【数２０】
2008147920.tif 000022
【０３０６】
ステップＳ３２７において、学習演算部１６３は、ω＞Ｍである場合、すなわち、全ての周波数binにおけるΔWが求められた場合、周波数ｂｉｎループを閉じる。
【０３０７】
ステップＳ３２８において、学習演算部１６３は、分離行列Ｗに、Ｗ＋ηΔＷを代入、すなわち、Ｗ←Ｗ＋ηΔＷとし、処理は、ステップＳ３２３に戻り、それ以降の処理が繰り返される。
【０３０８】
ステップＳ３２３において、分離行列Ｗの値が収束したと判断された場合、ステップＳ３２９において、学習演算部１６３は、後処理を実行する。
【０３０９】
具体的には、学習演算部１６３は、後処理として、分離行列を、正規化前の観測信号に対応させる処理と、周波数ビンの間のバランスを調整する、リスケーリング処理を実行する。
【０３１０】
前処理として正規化が行なわれた場合、上述した処理により求められる分離行列Wは、正規化前の観測信号Xを分離して得られるものと等価ではなく、正規化後の観測信号X'を分離して得られたものである。そこで、上述した処理により求められた分離行列Wを補正して、正規化前の観測信号Xを分離して得られるものと等価なものに変換する。具体的には、正規化の際に作用させた行列Ｓを用いて、Ｗ←ＷＳという補正を行なうものとすれば良い。
【０３１１】
また、ICAのアルゴリズムによっては、分離結果Yの周波数ビン間のバランス（スケール）が、予想される原信号のものと異なっている場合がある。そのような場合には、後処理において周波数ビンのスケールを補正する、すなわち、リスケーリングする必要がある。
【０３１２】
リスケーリングは、例えば、次の式（２３）によって補正用行列Rを求め、補正用行列Ｒを、分離行列Wに乗じ、求められるＲＷを分離行列に代入する（すなわち、W←RWを行なう）ことにより実行される。なお、式（２３）におけるdiag()は、与えられた行列から対角要素を抽出し、そこから対角行列を生成することを表わす。
【０３１３】
【数２１】
2008147920.tif 000023
【０３１４】
また、リスケーリングとしては、平均二乗誤差である式（２３）を最小にする係数λk(ω)を次の式（２４）で求め、その係数を対角要素に持つ対角行列を、式（２５）および式（２６）で示されるRとしても良い。
【０３１５】
【数２２】
2008147920.tif 000024
【０３１６】
【数２３】
2008147920.tif 000025
【０３１７】
【数２４】
2008147920.tif 000026
【０３１８】
以上の2つの補正をまとめると、次の式（２７）のように表わせる。すなわち、後処理は、W←RWSという補正処理に対応する。
【０３１９】
【数２５】
2008147920.tif 000027
【０３２０】
また、後述の変形例のように、分離行列の学習処理で求まったYを「遅延はあるが高精度の分離結果」として用いる場合には、Yに対してもリスケーリングを行なう必要がある。Yのリスケーリングは、式（２７）に基づいて行なう。
【０３２１】
そして、ステップＳ３３０の処理の終了後、処理は、図２４のステップＳ２９５に戻り、ステップＳ２９６に進む。
【０３２２】
このような処理により、分離行列の学習が実行される。
【０３２３】
なお、分離行列の学習は、このフローチャートに示される処理と厳密に同一でなくても、一般的なバッチ処理を用いるものとしても良い。
【０３２４】
また、以上説明した処理には、以下に示すような変形例が考えられる。
【０３２５】
例えば、上述した処理においては、後処理において、W←RWSという補正処理を実行していたが、上述したように、学習初期値は、分離行列Ｗとは異なる値を用いるようにしても良いので、学習初期値は、上述した補正前の値を用いるものとしても良い。
【０３２６】
すなわち、ステップＳ３２３において、分離行列Ｗの値が収束したと判断された場合、収束したと判断された分離行列Ｗ、すなわち、補正前の値を、学習初期値W_initとして用いるとともに、ステップＳ３３０において、学習演算部１６３は、後処理を実行して、補正して得られた分離行列Wを分離行列保持部９３に供給して、分離部８２による分離処理に用いるものとしても良い。
【０３２７】
また、学習初期値W_initには、ステップＳ３２３において、分離行列Ｗの値が収束したと判断された場合、収束したと判断された分離行列Ｗ、すなわち、補正前の値に、上述したような重み付け平滑処理を施したものであっても良い。
【０３２８】
また、上述した処理においては、図１０を用いて説明したように、スレッド演算処理部９２において実行されるそれぞれのスレッド１０１は、スレッド制御部９１からそれぞれ観測信号の供給を受け、自分自身が管理する観測信号バッファ１６１に、供給された観測信号を蓄積して、これを用いて学習を行なうものとした。
【０３２９】
しかしながら、それぞれのスレッドにおいては、「蓄積中」タイミングに重複があるので、それぞれのスレッドの観測信号バッファ１６１には、重複して同一のタイミングの観測信号が保持されることになる。
【０３３０】
そこで、複数のスレッドのそれぞれが利用する観測信号用の共通バッファを設けることにより、同一の観測信号の重複した蓄積を省くようにしても良い。そうすることで、各スレッドが観測信号バッファを保持する場合に比べて、使用メモリ量を削減することができる。
【０３３１】
観測信号用の共通バッファは、図２６に示されるように、少なくとも１スレッド長の観測信号を保持することが可能であれば良く、それぞれのスレッドは、ブロックシフト幅に対応つけて、図２６に示されるように、共通バッファの該当する１ブロック長の区間の観測信号を用いて処理を実行する。図２６は、図７を共通バッファ化した場合に該当する。
図２６の共通バッファは、リングバッファとして左右が繋がっているものとする。
【０３３２】
なお、このように共通バッファを用いるようにした場合、前処理によって正規化されたり無相関化された観測信号X'は、他のスレッドの処理に影響を及ぼすことを避けるため、このバッファに上書きをすることはできない。したがって、このように共通バッファを用いるようにした場合、前処理によって得られた観測信号X'をバッファに上書きすることなく、前処理用の行列、すなわち、正規化や無相関化のための行列を求めて、その行列が別個に保存されるものとする。また、前処理は、学習処理中に実行するものとする。具体的には、前処理用行列をＳとすると、学習処理において、Y(t)＝WX(t)の演算に代わって、Y(t)＝WSX(t)の演算を実行すればよい。
【０３３３】
また、学習処理によって、分離行列Ｗと分離結果Ｙ（Ｙ＝ＷＸ）が得られるが、信号処理部７１においては、分離行列Ｗのみが利用され、分離結果Ｙは利用されない。
【０３３４】
これに対して、学習に用いられた分離結果も信号処理部７１に供給するものとしても良い。すなわち、分離部８２により得られる分離結果は、図１２を用いて説明した分離処理のステップＳ５において計算される、遅延の少ない分離結果Y(t)WX(t)と、学習処理から計算される、遅延はあるが高精度の分離結果との２つとなる。その場合、音声認識などの後段の処理は、これら2種類の分離結果を受け取り、必要に応じて、いずれかの適する分離結果を使用することができる。
【０３３５】
なお、例えば、図４などに示されるように、各スレッドのブロックは重複するので、1つの時間区間が複数の分離結果（学習で求まる方の分離結果）に含まれることになるが、そのような場合には、それぞれのスレッドの間の学習により得られた分離結果を、区間をずらしつつ足し合わせ（overlap add）、確定した区間を、学習処理から計算される、遅延はあるが高精度の分離結果とすることができる。
【０３３６】
なお、学習処理から計算される、遅延はあるが高精度の分離結果を生成するにあたっては、分離結果が欠損しない（すなわち、途切れない）ようにする必要がある。具体的には、例えば、上述したように、蓄積開始時間の延期を行なった場合、分離結果の欠損が発生する可能性があるため、スレッド長を十分長くして（すなわちスレッド数を十分多くして）、蓄積開始時間の延期が発生しないようにする必要がある。
【０３３７】
また、学習に要する時間は、基本的にブロックの長さ（つまり観測信号のフレーム数）に比例する。すなわち、静止音源に対しての分離精度を上げることを意図してブロックを長く設定すると、その分だけ学習時間も増大して追従遅れが大きくなる。例えば、ブロック長を１秒長くすると、学習時間も増大するため、追従遅れの増加分は、１秒よりも大きな値となる。
【０３３８】
このような学習時間の増大を防ぐためには、観測信号を間引いて用いると好適である。例えば、ブロック長を２倍にしても、偶数フレームのみ使用するなどして、観測信号を半分に間引けば、学習時間は増加しない。
【０３３９】
観測信号の間引きは、１/nの間引き（nは正の自然数）の他に、nフレームの内のmフレーム（ｍ、ｎともに正の自然数であり、ｎ＞ｍ）を採用するといった、m/nの間引きでも良い。また、ブロック内の観測信号を一様に間引く代わりに、ブロックの始めの方、すなわち、古い観測信号は大きめに間引き、ブロックの後の方、すなわち、新しいの観測信号は、古い観測信号と比較して、間引きの割合を少なくするといった、ブロック内の時間によって傾斜的に行われる間引きであっても良い。
【０３４０】
また、間引きの具体的な方法は、バッファに観測信号を格納する際に間引く（データ間引きと称する）ものであっても、バッファへは全ての観測信号を格納するが、例えば、偶数番目のフレームデータのみを用いるなど、学習では特定の番号のフレームデータのみを用いる（インデックス間引きと称する）であってもよい。
【０３４１】
なお、上述したように、学習処理から計算される、遅延はあるが高精度の分離結果を生成するにあたっては、分離結果が欠損しない（すなわち、途切れない）ようにする必要があるので、観測信号の間引きと併用する場合には、データ間引きではなくインデックス間引きを用いる必要がある。
【０３４２】
また、図１９を用いて説明した分離行列更新処理においては、観測信号の開始タイミングと、現在の分離行列に対応した蓄積開始タイミングとを比較し、先に開始した学習がそれ以降に開始した学習よりも後に終了した場合には、その分離行列を破棄するようにしていた。
【０３４３】
このように、後に開始された学習が、それ以前に開始されたいずれかの学習よりも先に終了した場合において、分離行列が採用される見込みのなくなった学習については、その学習処理を途中で打ち切ることで、計算量を削減することも可能である。
【０３４４】
例えば、図２７に示されるように、スレッド演算処理部９２において実行される各スレッド１０１に、更に、打ち切りフラグ２５１を追加し、打ち切りフラグ２５１がＯＮの場合、スレッド制御部９１の処理により、このスレッドの学習を強制的に打ち切るものとしても良い。
【０３４５】
なお、打ち切りフラグ２５１の初期値は、ＯＦＦであるものとし、スレッド制御部９１は、図１５のステップＳ７６において実行される、学習中状態における処理において、学習終了フラグ１６８がＯＮであるとき、観測信号の開始タイミングと、現在の分離行列に対応した蓄積開始タイミングとを比較し、観測信号の開始タイミングが、現在の分離行列に対応した蓄積開始タイミングよりも早い場合、打ち切りフラグ２５１をＯＮにするものとする。
【０３４６】
すなわち、スレッド制御部９１は、図１５のステップＳ７６において、図１８を用いて説明した学習中状態の処理１に代わって、図２８の学習中状態の処理２を実行する。
【０３４７】
ステップＳ３６１において、スレッド制御部９１は、対応するスレッド１０１の学習終了フラグ１６８がONであるか否かを判断する。ステップＳ３６１において、学習フラグがONであると判断された場合、処理は、後述するステップＳ３６７に進む。
【０３４８】
ステップＳ３６１において、学習フラグがONではないと判断された場合、すなわち、対応するスレッドにおいて学習処理が実行中である場合、ステップＳ３６２において、スレッド制御部９１は、観測信号の開始タイミングは、現在の分離行列に対応した蓄積タイミングよりも早いか否かを判断する。
【０３４９】
ステップＳ３６２において、観測信号の開始タイミングは、現在の分離行列に対応した蓄積タイミングよりも早いと判断された場合、ステップＳ３６３において、スレッド制御部９１は、対応するスレッド１０１の打ち切りフラグ２５１をＯＮにし、処理は、図１５のステップＳ７６に戻り、ステップＳ７７に進む。
【０３５０】
ステップＳ３６２において、観測信号の開始タイミングは、現在の分離行列に対応した蓄積タイミングよりも早くないと判断された場合、ステップＳ３６４において、スレッド制御部９１は、対応するスレッド１０１のカウンタ１６６を、１インクリメントする。
【０３５１】
ステップＳ３６５において、スレッド制御部９１は、対応するスレッド１０１のカウンタ１６６の値は、スレッド長（thread_len）より小さいか否かを判断する。ステップＳ３６５において、カウンタ１６６の値は、スレッド長より小さいと判断された場合、処理は、図１５のステップＳ７６に戻り、ステップＳ７７に進む。
【０３５２】
ステップＳ３６５において、カウンタ１６６の値は、スレッド長より小さくないと判断された場合、ステップＳ３６６において、スレッド制御部９１は、カウンタ１６６の値から所定の値を減算し、処理は、図１５のステップＳ７６に戻り、ステップＳ７７に進む。
【０３５３】
学習中にカウンタの値がスレッド長に達した場合とは、学習にかかる時間が所定よりも長くなってしまい、「待機中」状態の時間が存在しなくなった場合である。その場合、学習はまだ継続しており、観測信号バッファ１６１は利用されているため、次の蓄積を開始することができない。そこで、スレッド制御部９１は、学習が終了するまで、次の蓄積の開始、すなわち、「「蓄積中」状態」へ状態を遷移させるための状態遷移コマンドの発行を延期する。そのため、スレッド制御部９１は、カウンタ１６６の値から所定の値を減算する。減算する値は、例えば、１であっても良いが、それよりも大きな値でも良く、例えば、スレッド長の１０％などといった値であっても良い。
【０３５４】
ステップＳ３６１において、学習フラグがONであると判断された場合、すなわち、対応するスレッドにおいて学習処理が終了した場合、ステップＳ３６７において、スレッド制御部９１は、対応するスレッド１０１の学習終了フラグ１６８をOFFにする。
【０３５５】
ステップＳ３６８において、スレッド制御部９１は、対応するスレッド１０１の打ち切りフラグ２５１がＯＮであるか否かを判断する。
【０３５６】
ステップＳ３６８において、対応するスレッド１０１の打ち切りフラグ２５１がＯＮであると判断された場合、ステップＳ３６９において、スレッド制御部９１は、対応するスレッド１０１の打ち切りフラグ２５１を初期化、すなわち、ＯＦＦとする
【０３５７】
ステップＳ３６８において、対応するスレッド１０１の打ち切りフラグ２５１がＯＮではない、すなわち、ＯＦＦであると判断された場合、ステップＳ３７０において、図１９を用いて説明した分離行列更新処理が実行され、学習によって求められた分離行列Wの値が、他のスレッドの処理に反映される。
【０３５８】
ステップＳ３６９、または、ステップＳ３７０の処理の終了後、ステップＳ３７１において、図２０を用いて説明した、待機時間の設定処理が実行されて、処理は、図１５のステップＳ７６に戻り、ステップＳ７７に進む。
【０３５９】
このような処理により、スレッド制御部９１は、分離行列が採用される見込みのなくなった学習については、その学習処理を途中で打ち切ることで、計算量を削減することができる。
【０３６０】
そして、図２８を用いて説明した処理により制御されるスレッド１０１は、図２４のステップＳ２９５において、図２５を用いて説明した分離行列の学習処理１に代わって、図２９を用いて説明する分離行列の学習処理２を実行する。
【０３６１】
ステップＳ４０１およびステップＳ４０２において、図２５のステップＳ３２１およびステップＳ３２２と同様の処理が実行され、観測信号バッファ１６１に蓄積された観測信号に対して、必要に応じて、前処理が実行されて、分離行列の初期値として、スレッド制御部９１から、スレッド制御部９１の学習初期値保持部１３２により保持されている学習初期値W_initが取得される。
【０３６２】
ステップＳ４０３において、学習演算部１６３は、打ち切りフラグ２５１がＯＮであるか否かを判断する。ステップＳ４０３において、打ち切りフラグ２５１がＯＮであると判断された場合、処理は、図２４のステップＳ２９５に戻り、ステップＳ２９６に進む。すなわち、学習処理ループや後処理が実行されずに、分離行列の学習処理が終了される。
【０３６３】
ステップＳ４０３において、打ち切りフラグ２５１がＯＮではないと判断された場合、ステップＳ４０４乃至ステップＳ４１１において、ステップＳ３２３乃至ステップＳ３３０と同様の処理が実行されて、学習処理ループが実行され、ステップＳ４１０の処理の終了後、処理はステップＳ４０３に戻り、ステップＳ４０３において、打ち切りフラグ２５１がＯＮであると判断された場合、または、ステップＳ４１１の処理が終了された場合、処理は、図２４のステップＳ２９５に戻り、ステップＳ２９６に進む。
【０３６４】
このようにして、スレッド制御部９１およびスレッド１０１の双方の処理が変更されて、分離行列が採用される見込みのなくなった学習については、その学習処理を途中で打ち切ることで、計算量を削減することが可能となる。
【０３６５】
このように、本発明を適用した独立成分分析においては、蓄積・学習・待機という３つの状態を繰り返す、スレッドと称される処理の単位を導入した。複数のスレッドを、時間をずらして起動することにより、ICAを用いたリアルタイム音源分離システムにおいて、観測信号を蓄積する時間と分離行列が更新される間隔とをある程度自由に設定することが可能となる。
【０３６６】
特に、複数のスレッドの間で観測信号を重複させることが容易となり、従来のブロック単位のICAにおいて発生した、蓄積時間と更新間間隔とのトレードオフを解消することが可能となる。
【０３６７】
図３０を参照して、本発明を適用した独立成分分析におけるスレッドの状態遷移の例について説明する。
【０３６８】
図３０において、上段は、先頭から7000番目までのフレームについて各スレッドの状態をプロットしたものであり、下段はその内の4000フレームから6500フレームまでを拡大したものである。縦軸はスレッドの番号、横軸はフレーム番号であり、1フレームは10msである。また、ここでは、16kHzサンプリング、512ポイントFFT、160シフトが使用されているものとし、ブロック長、スレッド長、ブロックシフト幅は、それぞれ、300フレーム（3秒）、600フレーム（6秒）、150フレーム（1.5秒）である。また、学習ループは、‖ΔW‖/‖W‖＜1/1000が満たされた場合、または、学習処理ループの実行回数が100に達した場合のいずれかに終了されるものとする。
【０３６９】
図中、薄いハッチは学習中状態、濃いハッチは、蓄積中状態、白い部分は待機中状態を示している。図３０において、それぞれのスレッドの各ブロックにおいて学習に要した時間を見ると、所定の時間（スレッド長−ブロック長）を超過しているものも存在している。しかしながら、上述した処理を実行することにより、蓄積開始時刻は略一定間隔となる。
【０３７０】
例えば、図３０の下段において、スレッド３の学習３０１とスレッド４の学習３０２とを比較すると、スレッド３の学習３０１の方が先に開始しているにもかかわらず、学習にかかる時間が所定の時間を超過しているため、スレッド４の学習３０２の方が先に終了している。
【０３７１】
そこで、スレッド1の蓄積３０５に続く蓄積を、まだ学習中のスレッド３に代わって、既に学習が終了して待機中状態であるスレッド４に実行させる(蓄積３０４)ようにしても良い。そして、スレッド３は待機中３０３へ遷移した後、スレッド４の蓄積３０４の開始からブロックシフト幅に対応する時刻が経過した後に蓄積中状態に遷移される。その結果、スレッド３において学習時間の超過が発生した（学習３０１の処理）にも関わらず、以降の蓄積開始時刻はスレッド間で等間隔に保たれている。
【０３７２】
また、スレッド２の学習３０６も、学習時間が所定の時間を超過している。スレッド３の蓄積３０７が終了した後、他のいずれかのスレッドで蓄積を開始しなければならないが、このタイミングにおいては、スレッド１は既に蓄積中状態であり、スレッド２およびスレッド４は、まだ学習中状態である。このため、いずれのスレッドも、その時点では蓄積を開始できない。そこで、スレッド２の学習３０６が終了した後、スレッド２は待機状態には遷移せず、すぐに「蓄積中」状態に遷移される（蓄積中３０８）。これにより、蓄積開始時刻の間隔が伸びるのを最小にすることができる。また、他のスレッドの待機時間３０９も調整され、再び蓄積開始時刻が等間隔となるように制御される。
【０３７３】
このように制御することにより、学習時間が一時的に増大しても、蓄積開始時刻を略等間隔に保つことが可能となる。そして、分離行列がいずれのスレッドにおいて学習されたものであるか(図中、スレッドＸ由来と記載されている部分)を考えた場合、その平均は、ブロックシフト幅と略同等となり、できるだけ近い時間の学習結果を用いて分離処理を実行することができる。
【０３７４】
本発明は、特に、スレッド間で蓄積の時間が重複すること、スレッド間で複数の学習が実行されること、および、学習が所定の時間を超過した場合であっても並列処理が破綻しないことに特徴を有している。
【０３７５】
これにより、独立成分分析（independent component analysis: ICA）を行なうにあたって、従来のブロック単位のICAにおいて発生した、ブロックの長さと分離行列の更新間隔とのトレードオフを解消することが可能となる。
【０３７６】
上述した一連の処理は、ソフトウェアにより実行することもできる。そのソフトウェアは、そのソフトウェアを構成するプログラムが、専用のハードウェアに組み込まれているコンピュータ、または、各種のプログラムをインストールすることで、各種の機能を実行することが可能な、例えば汎用のパーソナルコンピュータなどに、記録媒体からインストールされる。
【０３７７】
この記録媒体は、図３に示すように、コンピュータとは別に、ユーザにプログラムを提供するために配布される、プログラムが記録されている磁気ディスク３１（フレキシブルディスクを含む）、光ディスク３２（CD-ROM（Compact Disk-Read Only Memory），DVD（Digital Versatile Disk）を含む）、光磁気ディスク３３（ＭＤ(Mini-Disk)（商標）を含む）、もしくは半導体メモリ３４などよりなるパッケージメディアなどにより構成される。
【０３７８】
また、本明細書において、記録媒体に記録されるプログラムを記述するステップは、記載された順序に沿って時系列的に行われる処理はもちろん、必ずしも時系列的に処理されなくとも、並列的あるいは個別に実行される処理をも含むものである。
【０３７９】
なお、本明細書において、システムとは、複数の装置により構成される装置全体を表すものである。
【０３８０】
なお、本発明の実施の形態は、上述した実施の形態に限定されるものではなく、本発明の要旨を逸脱しない範囲において種々の変更が可能である。
【図面の簡単な説明】
【０３８１】
【図１】従来のブロック処理について説明するための図である。
【図２】従来の改良版ブロック処理の概要について説明するための図である。
【図３】本発明を適用した音源分離装置の構成を示すブロック図である。
【図４】スレッドについて説明するための図である。
【図５】スレッドについて説明するための図である。
【図６】それぞれのスレッドの状態遷移について説明するための図である。
【図７】各スレッドの状態について説明するための図である。
【図８】音源分離装置の機能について説明するための図である。
【図９】スレッド制御部が有する機能について説明するための図である。
【図１０】スレッドが有する機能について説明するための図である。
【図１１】スレッド制御部による各スレッドの制御について説明するためのアローチャートである。
【図１２】分離処理について説明するためのフローチャートである。
【図１３】短時間フーリエ変換について説明するための図である。
【図１４】初期化処理について説明するためのフローチャートである。
【図１５】スレッド制御処理について説明するためのフローチャートである。
【図１６】待機中状態における処理について説明するためのフローチャートである。
【図１７】蓄積中状態における処理について説明するためのフローチャートである。
【図１８】学習中状態における処理１について説明するためのフローチャートである。
【図１９】分離行列更新処理について説明するためのフローチャートである。
【図２０】待機時間の設定処理について説明するためのフローチャートである。
【図２１】各スレッドの状態とタイミングについて説明するための図である。
【図２２】各スレッドの状態とタイミングについて説明するための図である。
【図２３】スレッドの処理について説明するためのフローチャートである。
【図２４】コマンド処理について説明するためのフローチャートである。
【図２５】分離行列の学習処理１について説明するためのフローチャートである。
【図２６】バッファの共有化について説明するための図である。
【図２７】スレッドが有する機能の他の例について説明するための図である。
【図２８】学習中状態における処理２について説明するためのフローチャートである。
【図２９】分離行列の学習処理２について説明するためのフローチャートである。
【図３０】それぞれのスレッドの処理について説明するための図である。
【符号の説明】
【０３８２】
１１  音源分離装置，  ２１  ＣＰＵ，  ２９  音信号取得部，  ６１  マイクロホン，  ６２  ＡＤ変換部，  ７１  信号処理部，  ７２  バックグラウンド処理部，  ８１  フーリエ変換部，  ８２  分離部，  ８３  フーリエ逆変換部，  ９１  スレッド処理部，  ９２  スレッド演算処理部，  ９３  分離行列保持部，  １０１  スレッド
【図１】
2008147920.tif 000028
【図２】
2008147920.tif 000029
【図３】
2008147920.tif 000030
【図４】
2008147920.tif 000031
【図５】
2008147920.tif 000032
【図６】
2008147920.tif 000033
【図７】
2008147920.tif 000034
【図８】
2008147920.tif 000035
【図９】
2008147920.tif 000036
【図１０】
2008147920.tif 000037
【図１１】
2008147920.tif 000038
【図１２】
2008147920.tif 000039
【図１３】
2008147920.tif 000040
【図１４】
2008147920.tif 000041
【図１５】
2008147920.tif 000042
【図１６】
2008147920.tif 000043
【図１７】
2008147920.tif 000044
【図１８】
2008147920.tif 000045
【図１９】
2008147920.tif 000046
【図２０】
2008147920.tif 000047
【図２１】
2008147920.tif 000048
【図２２】
2008147920.tif 000049
【図２３】
2008147920.tif 000050
【図２４】
2008147920.tif 000051
【図２５】
2008147920.tif 000052
【図２６】
2008147920.tif 000053
【図２７】
2008147920.tif 000054
【図２８】
2008147920.tif 000055
【図２９】
2008147920.tif 000056
【図３０】
2008147920.tif 000057