(57)【要約】【課題】突発音等が含まれる混合信号に対する高精度な音源分離を可能とする装置、方法を提供する。【解決手段】複数音源からの出力を混合した混合信号からなる観測信号に対して、独立成分分析（ＩＣＡ）を適用した学習処理により分離行列を求めて分離信号を生成するとともに、観測信号として検出された音源に対する死角を持つ全死角空間フィルタを適用して検出音を除去した全死角空間フィルタ適用信号を生成する。さらに、分離信号に含まれる全死角空間フィルタ適用信号に対応する信号成分を除去するフィルタリング処理を実行し、周波数フィルタリング処理結果から音源分離結果を生成する。【選択図】図１２
2011107602.tif 000002
【特許請求の範囲】
【請求項１】
複数のセンサが取得した複数音源の出力の混合信号に対する短時間フーリエ変換（ＳＴＦＴ）によって時間周波数領域の観測信号を生成し、該観測信号に対する線形フィルタリング処理により各音源対応の音源分離結果を生成する分離処理部を有し、
前記分離処理部は、
前記観測信号に対する線形フィルタリング処理を実行して各音源対応の分離信号を生成する線形フィルタリング処理部と、
前記複数のセンサによって取得された観測信号に含まれる全ての音源方向に死角を形成した全死角空間フィルタを適用して死角方向の音を除去した全死角空間フィルタ適用信号を生成する全死角空間フィルタ適用部と、
前記分離信号と前記全死角空間フィルタ適用信号を入力し、前記分離信号に含まれる前記全死角空間フィルタ適用信号に対応する信号成分を除去するフィルタリング処理を実行する周波数フィルタリング部を有し、前記周波数フィルタリング部の処理結果を音源分離結果として生成する信号処理装置。
【請求項２】
前記信号処理装置は、
複数音源からの出力を混合した混合信号からなる観測信号に対して、独立成分分析（ＩＣＡ：Ｉｎｄｅｐｅｎｄｅｎｔ  Ｃｏｍｐｏｎｅｎｔ  Ａｎａｌｙｓｉｓ）を適用した学習処理により、前記混合信号を分離する分離行列を求め、さらに前記観測信号から取得された全ての音源方向に死角を形成した全死角空間フィルタを生成する学習処理部を有し、
前記線形フィルタリング処理部は、
前記観測信号に対して、前記学習処理部の生成した分離行列を適用して前記混合信号を分離して各音源対応の分離信号を生成し、
前記全死角空間フィルタ適用部は、
前記観測信号に対して、前記学習処理部の生成した全死角空間フィルタを適用して死角方向の音を除去した全死角空間フィルタ適用信号を生成する請求項１に記載の信号処理装置。
【請求項３】
前記周波数フィルタリング部は、
前記分離信号から前記全死角空間フィルタ適用信号を減算する処理により、前記分離信号に含まれる前記全死角空間フィルタ適用信号に対応する信号成分を除去するフィルタリング処理を実行する請求項１または２に記載の信号処理装置。
【請求項４】
前記周波数フィルタリング部は、
前記全死角空間フィルタ適用信号を雑音成分としたスペクトル減算による周波数フィルタリング処理により、前記分離信号に含まれる前記全死角空間フィルタ適用信号に対応する信号成分を除去するフィルタリング処理を実行する請求項１または２に記載の信号処理装置。
【請求項５】
前記学習処理部は、
前記観測信号を区分したブロック単位での学習処理を実行してブロック単位の学習結果に基づく分離行列および全死角空間フィルタを生成する処理を実行し、
前記分離処理部は、
前記学習処理部の生成した最新の分離行列および全死角空間フィルタを適用した処理を実行する請求項２に記載の信号処理装置。
【請求項６】
前記周波数フィルタリング部は、
前記分離信号からの前記全死角空間フィルタ適用信号対応成分の除去レベルを分離信号チャネルに応じて変更する処理を行う請求項１または２に記載の信号処理装置。
【請求項７】
前記周波数フィルタリング部は、
前記分離信号からの前記全死角空間フィルタ適用信号対応成分の除去レベルを分離信号チャネルのパワー比に応じて変更する処理を行う請求項６に記載の信号処理装置。
【請求項８】
前記分離処理部は、
観測信号からの切り出しデータ単位であるフレーム中、現在の観測信号を含むフレームを適用したスケール調整としてのリスケーリング処理を実行した分離行列と、全死角空間フィルタを生成して、リスケーリング処理後の分離行列と全死角空間フィルタを適用した処理を行う請求項２に記載の信号処理装置。
【請求項９】
信号処理装置において音源分離処理を実行する信号処理方法であり、
分離処理部において、複数のセンサが取得した複数音源の出力の混合信号に対する短時間フーリエ変換（ＳＴＦＴ）によって時間周波数領域の観測信号を生成し、該観測信号に対する線形フィルタリング処理により各音源対応の音源分離結果を生成する分離処理ステップを有し、
前記分離処理ステップは、
前記観測信号に対する線形フィルタリング処理を実行して各音源対応の分離信号を生成する線形フィルタリング処理ステップと、
前記複数のセンサによって取得された観測信号に含まれる全ての音源方向に死角を形成した全死角空間フィルタを適用して死角方向の音を除去した全死角空間フィルタ適用信号を生成する全死角空間フィルタ適用ステップと、
前記分離信号と前記全死角空間フィルタ適用信号を入力し、前記分離信号に含まれる前記全死角空間フィルタ適用信号に対応する信号成分を除去するフィルタリング処理を実行する周波数フィルタリングステップを有し、前記周波数フィルタリングステップの処理結果を音源分離結果として生成する信号処理方法。
【請求項１０】
信号処理装置において音源分離処理を実行させるプログラムであり、
分離処理部において、複数のセンサが取得した複数音源の出力の混合信号に対する短時間フーリエ変換（ＳＴＦＴ）によって時間周波数領域の観測信号を生成し、該観測信号に対する線形フィルタリング処理により各音源対応の音源分離結果を生成する分離処理ステップを実行させ、
前記分離処理ステップにおいては、さらに、
前記観測信号に対する線形フィルタリング処理を実行して各音源対応の分離信号を生成する線形フィルタリング処理ステップと、
前記複数のセンサによって取得された観測信号に含まれる全ての音源方向に死角を形成した全死角空間フィルタを適用して死角方向の音を除去した全死角空間フィルタ適用信号を生成する全死角空間フィルタ適用ステップと、
前記分離信号と前記全死角空間フィルタ適用信号を入力し、前記分離信号に含まれる前記全死角空間フィルタ適用信号に対応する信号成分を除去するフィルタリング処理を実行する周波数フィルタリングステップを実行させて、前記周波数フィルタリングステップの処理結果を音源分離結果として生成させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、信号処理装置、および信号処理方法、並びにプログラムに関する。さらに、詳細には複数の信号が混合された信号を独立成分分析（ＩＣＡ：Ｉｎｄｅｐｅｎｄｅｎｔ  Ｃｏｍｐｏｎｅｎｔ  Ａｎａｌｙｓｉｓ）を用いて分離する処理に関し、特にリアルタイム処理、すなわち連続的に入力される観測信号を少ない遅延で独立な成分へと分解し、それを連続的に出力する信号処理装置、および信号処理方法、並びにプログラムに関する。
【背景技術】
【０００２】
まず、本発明の背景技術として、独立成分分析（ＩＣＡ：Ｉｎｄｅｐｅｎｄｅｎｔ  Ｃｏｍｐｏｎｅｎｔ  Ａｎａｌｙｓｉｓ）について説明し、さらに、独立成分分析（ＩＣＡ）のリアルタイム化の方法について説明する。
【０００３】
［Ａ１．ＩＣＡの説明］
ＩＣＡとは、多変量分析の一種であり、信号の統計的な性質を利用して多次元信号を分離する手法のことである。ＩＣＡ自体の詳細については、例えば非特許文献１［『入門・独立成分分析』（村田昇著、東京電機大学出版局）］などを参照されたい。
【０００４】
以下では、音信号のＩＣＡ、特に時間周波数領域のＩＣＡについて説明する。
図１に示すように、Ｎ個の音源から異なる音が鳴っていて、それらをｎ個のマイクで観測するという状況を考える。音源が発した音（原信号）がマイクに届くまでには、時間遅れや反射などがある。従って、マイクロホンｋで観測される信号（観測信号）は式［１．１］のように、原信号と伝達関数（transfer function）との畳み込み演算（convolution）を全音源について総和した式して表わすことができる。この混合を以下では「畳み込み混合」（convolutive mixtures）と呼ぶ。
なお、マイクｎの観測信号をｘｎ（ｔ）とする。マイク１、マイク２の観測信号はそれぞれｘ１（ｔ），ｘ２（ｔ）となる。
全てのマイクについての観測信号を一つの式で表わすと、以下に示す式［１．２］のように表わせる。
【０００５】
【数１】
2011107602.tif 000003
【０００６】
ただし、ｘ（ｔ），ｓ（ｔ）はそれぞれｘｋ（ｔ），ｓｋ（ｔ）を要素とする列ベクトルであり、Ａ［ｌ］はａ［ｌ］ｋｊを要素とするｎ×Ｎの行列である。以降では、ｎ＝Ｎとする。
【０００７】
時間領域の畳み込み混合は、時間周波数領域では瞬時混合で表わされることが知られており、その特徴を利用したのが時間周波数領域のＩＣＡである。
【０００８】
時間周波数領域ＩＣＡ自体については、非特許文献２［『詳解  独立成分分析』の「１９．２．４．フーリエ変換法」］や、特許文献１（特開２００６−２３８４０９号公報  『音声信号分離装置・雑音除去装置および方法』）などを参照されたい。
【０００９】
以下では、主に本発明と関係ある点を説明する。
上記の式［１．２］の両辺を短時間フーリエ変換すると、以下に示す式［２．１］が得られる。
【００１０】
【数２】
2011107602.tif 000004
【００１１】
上記式［２．１］において、
ωは周波数ビンの番号、
ｔはフレームの番号、
である。
【００１２】
ωを固定すると、この式は瞬時混合（時間遅れのない混合）と見なせる。そこで、観測信号を分離するには、分離結果［Ｙ］の算出式［２．５］を用意した上で、分離結果：Ｙ（ω，ｔ）の各成分が最も独立になるように分離行列Ｗ（ω）を決める。
【００１３】
従来の時間周波数領域ＩＣＡでは、パーミュテーション問題と呼ばれる、「どの成分がどのチャンネルに分離されるか」が周波数ビンごとに異なるという問題が発生していたが、本願と同一発明者による前の特許出願である特許文献１（特開２００６−２３８４０９号公報）『音声信号分離装置・雑音除去装置および方法』］に示した構成によって、このパーミュテーション問題は、ほぼ解決することができた。本発明でもこの方法を用いるため、特許文献１（特開２００６−２３８４０９号公報）に開示したパーミュテーション問題の解決手法ついて簡単に説明する。
【００１４】
特許文献１（特開２００６−２３８４０９号公報）では、分離行列Ｗ（ω）を求めるために、以下に示す式［３．１］から式［３．３］までを分離行列Ｗ（ω）が収束するまで（または一定回数）繰り返し実行する。
【００１５】
【数３】
2011107602.tif 000005
2011107602.tif 000006
【００１６】
この繰り返し実行を以降では「学習」と呼ぶ。ただし、式［３．１］〜式［３．３］は、全ての周波数ビンに対して行ない、さらに式［３．１］は、蓄積された観測信号の全てのフレームに対しても行なう。また、式［３．２］において、＜・＞ｔは全フレームについての平均を表わす。Ｙ（ω，ｔ）の右上についている上付きのＨはエルミート転置（ベクトルや行列の転置を取ると共に、要素を共役複素数に変換する）である。
【００１７】
分離結果Ｙ（ｔ）は式［３．４］で表わされる、分離結果の全チャンネル・全周波数ビンの要素を並べたベクトルである。φω（Ｙ（ｔ））は、式［３．５］で表わされるベクトルである。各要素φω（Ｙｋ（ｔ））はスコア関数と呼ばれ、Ｙｋ（ｔ）の多次元（多変量）確率密度関数（ＰＤＦ）の対数微分である（式［３．６］）。多次元ＰＤＦとして、例えば式［３．７］で表わされる関数を用いることができ、その場合、スコア関数φω（Ｙｋ（ｔ））は式［３．９］のように表わせる。ただし、‖Ｙｋ（ｔ）‖２はベクトルＹｋ（ｔ）のＬ−２ノルム（全要素の２乗和を求め、さらに平方根をとったもの）である。Ｌ−２ノルムを一般化したＬ−ｍノルムは式［３．８］で定義される。式［３．７］および式［３．９］のγは、Ｙｋ（ω，ｔ）のスケールを調整するための項であり、例えばｓｑｒｔ（Ｍ）（周波数ビン数の平方根）といった適切な正の定数を代入しておく。式［３．３］のηは学習率や学習係数と呼ばれる正の小さな値（例えば０．１程度）である。これは、式［３．２］で計算されたΔＷ（ω）を分離行列Ｗ（ω）に少しずつ反映させるために用いられる。
【００１８】
なお、式［３．１］は一つの周波数ビンにおける分離（図２（Ａ）参照）を表わしているが、全周波数ビンの分離を一つの式で表わす（図２（Ｂ）参照）ことも可能である。
【００１９】
そのためには、上述した式［３．４］で表わされる全周波数ビンの分離結果Ｙ（ｔ）および、式［３．１１］で表わされる観測信号Ｘ（ｔ）、さらに式［３．１０］で表わされる全周波数ビン分の分離行列を用いればよく、それらのベクトルと行列を用いることで、分離は式［３．１２］のように表わすことができる。本発明は、必要に応じて式［３．１］と式［３．１１］とを使い分ける。
【００２０】
なお、図２に示したＸ１〜ＸｎおよびＹ１〜Ｙｎの図はスペクトログラムと呼ばれ、短時間フーリエ変換（ＳＴＦＴ）の結果を周波数ビン方向とフレーム方向とに並べたものである。縦方向が周波数ビン、横方向がフレームである。式［３．４］や式［３．１１］では低い周波数を上に書いてあるが、スペクトログラムでは低い周波数を下に描いてある。
【００２１】
ここまでの説明では、音源数Ｎはマイクロホン数ｎと等しいとしていたが、Ｎ＜ｎであっても分離は可能である。その場合、ｎ個の出力チャンネルの内のＮ個には音源に対応した信号がそれぞれ出力されるが、残りのｎ−Ｎチャンネルには、どの音源にも対応しない、無音に近い信号が出力される。
【００２２】
［Ａ２．ＩＣＡのリアルタイム化］
「Ａ１．ＩＣＡの説明」で説明した式［３．１］から式［３．３］までを分離行列Ｗ（ω）が収束するまで（または一定回数）繰り返し実行する学習処理は、例えばバッチ処理によって行われる。すなわち、観測信号全体を蓄積した後で、式［３．１］〜式［３．３］を繰り返す方式である（式［３．１］〜式［３．３］の繰り返し実行は、前述したように、学習と呼ばれる。
【００２３】
このバッチ処理は、ある工夫を行なうことで、リアルタイム（低遅延）の音源分離に適用することができる。リアルタイム処理方式を実現した音源分離処理例として、本願と同一出願人の先の特許出願である特許文献２（特開２００８−１４７９２０号公報「リアルタイム音源分離装置および方法」）に開示した構成について説明する。
【００２４】
特許文献２（特開２００８−１４７９２０号公報）で開示した処理方式は、図３に示すように、観測信号のスペクトログラムを重複のある複数のブロック１〜Ｎに分割し、ブロックごとに学習を行なって分離行列を求めている。ブロックに重複を持たせる理由は、分離行列の精度と更新頻度とを両立させるためである。
【００２５】
なお、特許文献２（特開２００８−１４７９２０号公報）より以前に開示されていたリアルタイムＩＣＡ（ブロック単位のＩＣＡ）ではブロック間に重複がなかった。従って、分離行列の更新間隔を短くするにはブロック長（＝観測信号を蓄積する時間）を短くする必要があったが、ブロック長を短くすると分離精度は低下するという問題があった。
【００２６】
このように、観測信号の各ブロックに対してバッチ処理を適用する方法を、以降では「ブロック単位（ｂｌｏｃｋｗｉｓｅ）バッチ処理」と呼ぶ。
【００２７】
各ブロックから求まった分離行列は、それより以降の観測信号へ適用する（同一ブロックへは適用しない）ことで分離結果を生成する。ここでは、その方式を「ずらし適用」と呼ぶ。
【００２８】
図４は、「ずらし適用」の説明である。現時点において、ｔ番目のフレームの観測信号Ｘ（ｔ）４２が入力されたとする。この時点では、観測信号Ｘ（ｔ）を含むブロック（例えば現在時刻を含む観測信号ブロック４６）に対応した分離行列はまだ求まっていない。そこで、ブロック４６の代わりに、それより前のブロックである学習データブロック４１から学習された分離行列を観測信号Ｘ（ｔ）に乗じることで、Ｘ（ｔ）に対応した分離結果、すなわち現在時刻の分離結果Ｙ（ｔ）４４を生成する。なお、学習データブロック４１から学習された分離行列は、フレームｔの時点で既に求まっているものとする。
【００２９】
前述の通り、分離行列は混合過程の逆の過程を表わしていると考えられる。
そのため、学習データのブロック設定区間４１の観測信号と現在時刻の観測信号４２とで混合過程が同一であれば（例えば、音源とマイクとの位置関係が変化していなければ）、異なる区間で学習された分離行列を適用しても信号を分離することができ、そうすることで遅延の少ない分離を実現することができる。
【００３０】
特許文献２（特開２００８−１４７９２０号公報）において開示した構成では、重複のあるブロックから分離行列を求めるためスレッドと呼ばれる処理の単位を、時刻をずらして複数並列に起動する方式を提案している。図５を参照してこの並列処理方式について説明する。
【００３１】
図５には、処理単位としてのスレッド各々の時間経過に従った処理推移を示している。図５には６つのスレッド１〜６を示している。各スレッドはＡ）蓄積、Ｂ）学習、Ｃ）待機、という３つの状態を繰り返す。すなわち、スレッド長は、Ａ）蓄積、Ｂ）学習、Ｃ）待機の３つの処理のトータル時間長に対応する。図５の左から右に時間が推移する。
【００３２】
「Ａ）蓄積」は図５の濃い灰色の区間であり、スレッドがこの状態にあるときは、観測信号を蓄積する。蓄積を開始する時刻をスレッドごとにずらすことで、図５の重複つきブロックが表現できる。図５では蓄積時間の１／４だけずらしているので、１つのスレッドの蓄積時間を例えば４秒とすると、各スレッド間のずらし時間は１秒となる。
【００３３】
観測信号を一定時間（例えば４秒）蓄積すると、各スレッドは「Ｂ）学習」に状態を遷移させる。「Ｂ）学習」は図５の薄い灰色の区間であり、この状態にあるときは、蓄積された観測信号に対して先に説明した式［３．１］〜式［３．３］を繰り返し実行する。
【００３４】
学習（式［３．１］〜式［３．３］の繰り返し）によって分離行列Ｗが十分に収束したら（または単に一定回数繰り返したら）、学習を終了し、スレッドは「Ｃ）待機」状態に遷移する（図５の白い区間）。「待機」は、蓄積開始時刻および学習開始時刻をスレッド間で一定の間隔に保つためであり、その結果、学習終了時刻（＝分離行列が更新される時刻）もほぼ一定の間隔に保たれる。
【００３５】
学習で求まった分離行列Ｗは、次のスレッドの学習が終了するまでの間、分離に使用される。すなわち、図４の分離行列４３として使用される。これを説明するのが図５の最下段に示す分離行列の時間推移に示す適用分離行列規定区間５１〜５３に使用される分離行列である。
【００３６】
システムが起動してから、最初の分離行列が学習されるまでの適用分離行列規定区間５１では、図４の分離行列４３として初期値（例えば単位行列）が使用される。図５に示すスレッド１の学習が終了してからスレッド２の学習が終了するまでの区間５２では、スレッド１の観測信号蓄積区間５４に由来する分離行列が図４の分離行列４３として使用される。図５の区間５２に示す数字「１」は、この期間に使用される分離行列Ｗがスレッド１の処理によって求められたことを表わす。適用分離行列規定区間５２よりも右側の数字も同様に、分離行列が何番目のスレッドに由来するかを表わす。
【００３７】
なお、学習を開始する時点において、他のスレッドで求まった分離行列が存在する場合は、それを学習の初期値として使う。これを「分離行列の引継ぎ」と呼ぶことにする。図５に示す例では、スレッド３の最初の学習が始まるタイミングである学習開始タイミング５５では、スレッド１に由来する分離行列５２が既に求まっているので、それを学習の初期値として使う。
【００３８】
このような処理を行うことで、スレッド間でパーミュテーション（ｐｅｒｍｕｔａｔｉｏｎ）の発生を防止または低減することができる。スレッド間のパーミュテーションとは、例えば、１番目のスレッドで求まった分離行列では１番目のチャンネルに音声、２番目のチャンネルに音楽が出力されるのに対し、３番目のスレッドで求まった分離行列ではそれが逆転しているなどの問題である。
【００３９】
図５を参照して説明したように、他のスレッドで求まった分離行列が存在する場合は、それを学習の初期値として使う「分離行列の引継ぎ」を行うことで、スレッド間のパーミュテーションを低減することが可能となる。また、スレッド１の学習では分離行列が十分には収束していなくても、それを次のスレッドが引き継ぐことで、収束の度合いを向上させることができる。
【００４０】
このように時間をずらしながら複数のスレッドを起動することで、分離行列は、スレッド間のずれ、すなわちブロックシフト量５６とほぼ同じ間隔で更新されていくのである。
【００４１】
［Ｂ．従来技術の問題点］
次に、上述の「Ａ２．ＩＣＡのリアルタイム化」の問題点について検証する。上述の「Ａ２．ＩＣＡのリアルタイム化」において説明した「ブロック単位バッチ処理」と「ずらし適用」との組み合わせでは、音源分離が正確に行われない場合が発生する。それは以下の２つの要因に分けて考えることができる。
Ｂ１．追従遅れ
Ｂ２．消し残り
以下、この２つの要因によって音源分離が正確に行われない理由について各々説明する。
【００４２】
［Ｂ１．追従遅れ］
「ずらし適用」を用いると、分離行列の学習に用いた区間（例えば図４に示す学習データブロック４１）と現在時刻の観測信号４２との間で音源が変化した場合（音源が移動したり、急に鳴り始めたりした場合）に、一時的に不整合が生じる。
【００４３】
その後、変化した音源を観測した学習処理によって新たな分離行列が求まるため、やがて不整合は消える。しかし、その新たな分離行列が生成されるまでの間は、不整合が発生することになる。ここではその現象を「追従遅れ」と呼ぶ。追従遅れは、たとえ音源が移動しなくても、音が急に鳴り始めた場合や、音がいったん鳴り止んだ後に再び鳴り始めた場合などにも発生する。以降では、これらの音を「突発音」と呼ぶ。
【００４４】
図６は突発音と観測信号との対応について説明する図である。この図６の例は音源が２つあると想定している。
（ａ）音源１
（ｂ）音源２
これらの２つの音源である。
左から右に時間が経過している。（ａ）音源１、（ｂ）音源２、（ｃ）観測信号に示すブロックの高さは音量を示すものとする。
【００４５】
（ａ）音源１は無音区間６７を挟んで２回鳴っている。音源出力区間をそれぞれ音源１出力区間６１，６２とする。現在時刻の観測信号６６を観測している現在時刻においても出力されている。
（ｂ）音源２は、連続的に鳴っているとする。すなわち音源２出力区間６３を有する。
（ｃ）観測信号は、これらの音源１、音源２からマイクロホンへ到達した信号の和として表せる。
【００４６】
（ｃ）観測信号中に点線枠で示す学習データのブロック６４は、図４に示す学習データのブロック４１と同じ区間であり、学習データのブロック６４の区間の観測信号から学習された分離行列を現在時刻（ｔ１）の観測信号６６に適用することで分離を行なう。学習データのブロック６４と現在時刻（ｔ１）の観測信号６６との間には区間６５（ブロック終端から現在時刻までの区間６５）が存在する。
現在時刻（ｔ１）の観測信号６６は、現在時刻の音源出力６９に基づく観測信号である。
【００４７】
しかし、音源１の無音区間６７と学習データのブロック長６４（図４に示す学習データのブロック４１と同一）との長さによっては、学習データと現在の観測信号との間で不整合が発生する場合がある。
【００４８】
例えば（ｃ）観測信号中、現在時刻（ｔ１）の観測信号６６には音源１由来の音源１出力区間６２と、音源２由来の音源２出力区間６３との両方が観測信号として含まれるのに対し、学習データのブロック６４は音源２由来の音源２出力区間６３しか観測されていない。
【００４９】
現在時刻（ｔ１）の観測信号６６のように、学習データのブロックには含まれない音が現在鳴っていることを、「突発音が発生した」と表現する。言い換えると、学習データのブロック６４には音源１の観測信号が含まれていないため、たとえそのブロックよりも前に音源１が鳴っていた（音源１出力区間６１に相当）としても、学習データのブロック６４において学習された分離行列にとって音源１（音源１出力区間６２の区間）は突発音である。
【００５０】
図７は突発音の発生が分離結果に及ぼす影響、特に追従遅れについて説明する図である。図７には、
（ａ）観測信号
（ｂ１）分離結果１
（ｂ２）分離結果２
（ｂ３）分離結果３
これらのデータを示している。
図の左から右に時間が経過している。
【００５１】
図７に示す例において、ＩＣＡ（独立成分分析）システムは３個以上のマイクロホンを有し、出力チャンネルも３以上であると想定している。
（ａ）観測信号には、時間ｔ０〜ｔ５の間、継続して鳴り続けている継続音７１と、時間ｔ１〜ｔ４の間のみ出力される突発音７２が含まれている。
図７の（ａ）観測信号は、図６（ｃ）観測信号と同様の観測信号であり、継続音７１は、例えば図６の（ｂ）音源２に、突発音７２は図６の（ａ）音源１に対応する。
【００５２】
突発音７２の出力開始前、継続音７１のみが鳴っているｔ０〜ｔ１区間７３において分離行列が十分に収束した後では、継続音７１に対応した信号は一つのチャンネルのみに出力される。これが（ｂ１）分離結果１である。他のチャンネル、すなわち（ｂ２）分離結果２と、（ｂ３）分離結果３にはほぼ無音が出力される。
【００５３】
ここで、突発音７２が発生したとする。例えば、それまで黙っていた人がしゃべり始めた場合などである。この時点で観測信号に適用可能な分離行列は、突発音７２が発生する以前のデータ、すなわち、時間ｔ１以前の継続音７１のデータのみを観測データとして学習して生成された分離行列となる。
【００５４】
この結果、時間ｔ１以前の観測信号に基づいて生成した分離行列を適用して、時間ｔ１以降の突発音７２が観測された観測信号を分離することになり、観測信号に対応する正しい分離結果は得られない、すなわち、時間ｔ１以前の観測信号に基づいて生成した分離行列は、時間ｔ１以降の観測信号に含まれる突発音７２を考慮しない分離行列であるからである。この結果、その分離行列を適用した分離結果、例えば、時間ｔ１〜ｔ３の分離結果と、実際の観測信号、すなわち継続音７１と突発音７２との混合である観測信号との間に不整合が発生する。
【００５５】
突発音が鳴り始めてから、その突発音を反映した分離行列が学習されるまでの間（時間ｔ１〜ｔ２の区間７４）は、全部のチャンネル（（ｂ１）分離結果１、（ｂ２）分離結果２、（ｂ３）分離結果３）に突発音が出力されるという現象が発生する。すなわち、突発音については全く音源分離がなされない。この時間は、最小で学習時間より若干大きい値、最大で学習時間とブロックシフト幅との和である。例えば、学習時間が０．３秒、ブロックシフトが０．２秒というシステムでは、最小で０．３秒強、最大で０．５秒は突発音が分離せずに全チャンネルに出力される。
【００５６】
その後、新たな学習ブロックにおける学習処理により逐次、新たな分離行列が生成され更新される。この分離行列更新処理によって、突発音が分離行列に反映されるにつれて一つのチャンネル（図７では（ｂ２）分離結果２）を除いて突発音の出力が小さくなる（時間ｔ２〜ｔ３の区間７５）。やがて一つのチャンネル（（ｂ２）分離結果２）のみに出力されるようになる（ｔ３〜の区間７６）。
【００５７】
この図７に示す例において、追従遅れの発生区間は、時間ｔ１〜ｔ２の区間７４と時間ｔ２〜ｔ３の区間７５を合わせた区間、すなわち時間ｔ１〜ｔ３の区間７７である。
【００５８】
突発音発生時に生ずる追従遅れの問題点がどこにあるかについては、突発音が目的音であるか妨害音であるかによって異なる。以降、それぞれの場合について説明する。目的音とは、解析対象とする音である。
【００５９】
突発音が妨害音である場合、言い換えると鳴りっぱなし継続音７１が目的音である場合、突発音は除去されるのが望ましい。従って、問題は、図７に示す（ｂ１）分離結果１において妨害音が除去されずに残っていることである。
【００６０】
一方、突発音が目的音である場合、突発音は残すが、妨害音である鳴りっぱなしの継続音７１は除去されるのが望ましい。一見すると、図７に示す（ｂ２）分離結果２
はそのような出力に見える。しかし、追従遅れが発生している時間ｔ１〜ｔ３の区間７７では入力と分離行列とで不整合が発生しているため、出力の音が歪む（周波数間のバランスが原信号とは異なったものとなっている）可能性がある。すなわち、突発音が目的音である場合、問題は出力音が歪む場合があることである。
【００６１】
このように、突発音の性質によって、除去するか残すかという相反する処理を行なう必要があるため、単一の方法で解決するのは困難である。
【００６２】
［Ｂ２．消し残り］
次に、前述の「Ａ２．ＩＣＡのリアルタイム化」において説明した「ブロック単位バッチ処理」と「ずらし適用」との組み合わせにおいて、音源分離が正確に行われないもう１つの要因である「消し残り」について説明する。
【００６３】
例えば、図７の時間ｔ０〜ｔ１の区間７３、あるいは時間ｔ３〜ｔ４の区間７６等では分離行列が十分収束し、先行する学習データに基づく分離行列を適用して観測データの分離を行えば、正確な分離が行えているはずである。しかし、このような区間でも一つのチャンネルに完全に一つの音源が出力されるとは限らず、他の音源がある程度残る。これを「消し残り」と呼ぶ。例えば、図７に示す消し残り７８は、（ｂ２）分離結果には残るべきでない音である。同様に、消し残り７９も（ｂ３）分離結果３には出現すべきでない音である。
【００６４】
このような消し残りが発生する主な要因として、以下の点が考えられる。
ａ）その空間の残響の長さが、短時間フーリエ変換（ＳＴＦＴ）のフレーム長よりも長い。
ｂ）音源の数が、マイクロホンの数よりも多い。
ｃ）マイク間隔が狭いため低い周波数において妨害音が消しきれない。
【００６５】
リアルタイムＩＣＡを用いた音源分離システムにおいては、追従遅れの短縮と消し残りの減少とがトレードオフになり得る。なぜなら、追従遅れの短縮には学習時間の短縮が有効だが、その方法によっては消し残りが増加してしまうからである。
【００６６】
ＩＣＡの学習の計算量（ｃｏｍｐｕｔａｔｉｏｎａｌ  ｃｏｓｔ）は、短時間フーリエ変換（ＳＴＦＴ）のフレーム長に比例し、また、チャンネル数（マイクロホンの個数）の２乗に比例する。従って、それらの値を小さくすると、ループ回数が同じでも学習時間を短縮できるため、追従遅れも短縮できる。
【００６７】
しかし、フレーム長の短縮は、上記の消し残り発生の要因の１つ、すなわち、要因ａ）をさらに悪化させることになる。
また、マイクロホン数の減少は上記の消し残り発生の要因の１つ、すなわち要因ｂ）をさらに悪化させることになる。
【００６８】
従って、短時間フーリエ変換（ＳＴＦＴ）のフレーム長を短くする処理や、チャンネル数（マイクロホンの数）を減少させる処理は、追従遅れの短縮には貢献するが、その一方で、消し残りが発生しやすくなるという問題を生じさせる。
このように、追従遅れの短縮と消し残りは一方を解消しようとすると一方が悪化するという関係にある。
【００６９】
図７に示す消し残り７８は、鳴りっぱなしの継続音、すなわち、（ｂ１）分離結果１に対応する音として分離されるべきであり、消し残りが発生すると、そのチャンネルで支配的に出力されている成分（（ｂ１）分離結果１においては突発音７２）に対する分離性能が低下することになる。
一方、前述の「追従遅れ」が大きいと、突発音の正確な分離結果を得る時間が遅延することになる。具体的には、図７に示す突発音の発生時間ｔ１から、突発音に対応するチャンネル、すなわち（ｂ２）分離結果２にのみ、突発音に対応する音が分離される時間である時間ｔ３に至るまでの時間が延びてしまうことになる。
【００７０】
複数の音源からどの音源の音を取得したいか、これは目的に応じて異なる場合がある。ここで正確な分離結果を取得したい目的とする音を「目的音」とする。
この「目的音」が、鳴りっぱなしの継続音と突発音とのどちらであるかによって、異なる処理や設定をすることが望ましいということになる。
【００７１】
上記の消し残り発生の要因の残りの１つ、すなわち、
ｃ）マイク間隔が狭いため低い周波数において妨害音が消しきれない。
この要因はリアルタイム処理とは無関係である。しかし、以下に説明する本発明の構成によって解決できる課題であるため、ここで説明する。時間周波数領域のＩＣＡにおいて、マイクロホンの間隔が狭い（例えば２〜３ｃｍ程度）と、特に低い周波数で分離が十分には行なわれないことがある。これは、マイクロホン間で十分な位相差が得られないのが原因である。マイクロホン間隔を広げることで低い周波数での分離精度は向上できるが、逆に空間エリアシング（ｓｐａｔｉａｌ  ａｒｉａｓｉｎｇ）と呼ばれる現象により、高い周波数での分離精度が低下する可能性もある。また、物理的制約により、マイクロホンを広い間隔では設置できない場合もある。
【００７２】
以上の問題点をまとめると、以下の通りである。
（Ａ）「ブロック単位処理」および「ずらし適用」を用いたリアルタイムＩＣＡでは、突発音に対して「追従遅れ」や「消し残り」が発生し、音源分離が正確に行われない場合が発生する。
（Ｂ）音源分離を正確に行うための「追従遅れ」や「消し残り」の対処は、突発音が目的音か妨害音かで相反しているため、単一の方法では解決が難しい。
（Ｃ）従来のリアルタイムＩＣＡの枠組みでは、「追従遅れ」の短縮と「消し残り」の解消とはトレードオフの関係になる場合がある。
【先行技術文献】
【特許文献】
【００７３】
【特許文献１】特開２００６−２３８４０９号公報
【特許文献２】特開２００８−１４７９２０号公報
【非特許文献】
【００７４】
【非特許文献１】『入門・独立成分分析』（村田昇著、東京電機大学出版局）
【非特許文献２】『詳解  独立成分分析』の「１９．２．４．フーリエ変換法」
【発明の概要】
【発明が解決しようとする課題】
【００７５】
本発明は、このような状況に鑑みてなされたものであり、独立成分分析（Ｉｎｄｅｐｅｎｄｅｎｔ  Ｃｏｍｐｏｎｅｎｔ  Ａｎａｌｙｓｉｓ；ＩＣＡ）を用いて各音源信号単位の高精度な分離処理を遅延の少ないリアルタイム処理として実行する信号処理装置、および信号処理方法、並びにプログラムを提供することを目的とする。
【課題を解決するための手段】
【００７６】
本発明の第１の側面は、
複数のセンサが取得した複数音源の出力の混合信号に対する短時間フーリエ変換（ＳＴＦＴ）によって時間周波数領域の観測信号を生成し、該観測信号に対する線形フィルタリング処理により各音源対応の音源分離結果を生成する分離処理部を有し、
前記分離処理部は、
前記観測信号に対する線形フィルタリング処理を実行して各音源対応の分離信号を生成する線形フィルタリング処理部と、
前記複数のセンサによって取得された観測信号に含まれる全ての音源方向に死角を形成した全死角空間フィルタを適用して死角方向の音を除去した全死角空間フィルタ適用信号を生成する全死角空間フィルタ適用部と、
前記分離信号と前記全死角空間フィルタ適用信号を入力し、前記分離信号に含まれる前記全死角空間フィルタ適用信号に対応する信号成分を除去するフィルタリング処理を実行する周波数フィルタリング部を有し、前記周波数フィルタリング部の処理結果を音源分離結果として生成する信号処理装置にある。
【００７７】
さらに、本発明の信号処理装置の一実施態様において、前記信号処理装置は、複数音源からの出力を混合した混合信号からなる観測信号に対して、独立成分分析（ＩＣＡ：Ｉｎｄｅｐｅｎｄｅｎｔ  Ｃｏｍｐｏｎｅｎｔ  Ａｎａｌｙｓｉｓ）を適用した学習処理により、前記混合信号を分離する分離行列を求め、さらに前記観測信号から取得された全ての音源方向に死角を形成した全死角空間フィルタを生成する学習処理部を有し、前記線形フィルタリング処理部は、前記観測信号に対して、前記学習処理部の生成した分離行列を適用して前記混合信号を分離して各音源対応の分離信号を生成し、前記全死角空間フィルタ適用部は、前記観測信号に対して、前記学習処理部の生成した全死角空間フィルタを適用して死角方向の音を除去した全死角空間フィルタ適用信号を生成する。
【００７８】
さらに、本発明の信号処理装置の一実施態様において、前記周波数フィルタリング部は、前記分離信号から前記全死角空間フィルタ適用信号を減算する処理により、前記分離信号に含まれる前記全死角空間フィルタ適用信号に対応する信号成分を除去するフィルタリング処理を実行する。
【００７９】
さらに、本発明の信号処理装置の一実施態様において、前記周波数フィルタリング部は、前記全死角空間フィルタ適用信号を雑音成分としたスペクトル減算による周波数フィルタリング処理により、前記分離信号に含まれる前記全死角空間フィルタ適用信号に対応する信号成分を除去するフィルタリング処理を実行する。
【００８０】
さらに、本発明の信号処理装置の一実施態様において、前記学習処理部は、前記観測信号を区分したブロック単位での学習処理を実行してブロック単位の学習結果に基づく分離行列および全死角空間フィルタを生成する処理を実行し、前記分離処理部は、前記学習処理部の生成した最新の分離行列および全死角空間フィルタを適用した処理を実行する。
【００８１】
さらに、本発明の信号処理装置の一実施態様において、前記周波数フィルタリング部は、前記分離信号からの前記全死角空間フィルタ適用信号対応成分の除去レベルを分離信号チャネルに応じて変更する処理を行う。
【００８２】
さらに、本発明の信号処理装置の一実施態様において、前記周波数フィルタリング部は、前記分離信号からの前記全死角空間フィルタ適用信号対応成分の除去レベルを分離信号チャネルのパワー比に応じて変更する処理を行う。
【００８３】
さらに、本発明の信号処理装置の一実施態様において、前記分離処理部は、観測信号からの切り出しデータ単位であるフレーム中、現在の観測信号を含むフレームを適用したスケール調整としてのリスケーリング処理を実行した分離行列と、全死角空間フィルタを生成して、リスケーリング処理後の分離行列と全死角空間フィルタを適用した処理を行う。
【００８４】
さらに、本発明の第２の側面は、
信号処理装置において音源分離処理を実行する信号処理方法であり、
分離処理部において、複数のセンサが取得した複数音源の出力の混合信号に対する短時間フーリエ変換（ＳＴＦＴ）によって時間周波数領域の観測信号を生成し、該観測信号に対する線形フィルタリング処理により各音源対応の音源分離結果を生成する分離処理ステップを有し、
前記分離処理ステップは、
前記観測信号に対する線形フィルタリング処理を実行して各音源対応の分離信号を生成する線形フィルタリング処理ステップと、
前記複数のセンサによって取得された観測信号に含まれる全ての音源方向に死角を形成した全死角空間フィルタを適用して死角方向の音を除去した全死角空間フィルタ適用信号を生成する全死角空間フィルタ適用ステップと、
前記分離信号と前記全死角空間フィルタ適用信号を入力し、前記分離信号に含まれる前記全死角空間フィルタ適用信号に対応する信号成分を除去するフィルタリング処理を実行する周波数フィルタリングステップを有し、前記周波数フィルタリングステップの処理結果を音源分離結果として生成する信号処理方法にある。
【００８５】
さらに、本発明の第３の側面は、
信号処理装置において音源分離処理を実行させるプログラムであり、
分離処理部において、複数のセンサが取得した複数音源の出力の混合信号に対する短時間フーリエ変換（ＳＴＦＴ）によって時間周波数領域の観測信号を生成し、該観測信号に対する線形フィルタリング処理により各音源対応の音源分離結果を生成する分離処理ステップを実行させ、
前記分離処理ステップにおいては、さらに、
前記観測信号に対する線形フィルタリング処理を実行して各音源対応の分離信号を生成する線形フィルタリング処理ステップと、
前記複数のセンサによって取得された観測信号に含まれる全ての音源方向に死角を形成した全死角空間フィルタを適用して死角方向の音を除去した全死角空間フィルタ適用信号を生成する全死角空間フィルタ適用ステップと、
前記分離信号と前記全死角空間フィルタ適用信号を入力し、前記分離信号に含まれる前記全死角空間フィルタ適用信号に対応する信号成分を除去するフィルタリング処理を実行する周波数フィルタリングステップを実行させて、前記周波数フィルタリングステップの処理結果を音源分離結果として生成させるプログラムにある。
【００８６】
なお、本発明のプログラムは、例えば、様々なプログラム・コードを実行可能な画像処理装置やコンピュータ・システムに対して、コンピュータ可読な形式で提供する記憶媒体、通信媒体によって提供可能なプログラムである。このようなプログラムをコンピュータ可読な形式で提供することにより、情報処理装置やコンピュータ・システム上でプログラムに応じた処理が実現される。
【００８７】
本発明のさらに他の目的、特徴や利点は、後述する本発明の実施例や添付する図面に基づくより詳細な説明によって明らかになるであろう。なお、本明細書においてシステムとは、複数の装置の論理的集合構成であり、各構成の装置が同一筐体内にあるものには限らない。
【発明の効果】
【００８８】
本発明の一実施例の構成によれば、複数音源からの出力を混合した混合信号からなる観測信号に対して、独立成分分析（ＩＣＡ：Ｉｎｄｅｐｅｎｄｅｎｔ  Ｃｏｍｐｏｎｅｎｔ  Ａｎａｌｙｓｉｓ）を適用した学習処理により、混合信号を分離する分離行列を求めて分離信号を生成するとともに、観測信号として検出された音源に対する死角を持つ全死角空間フィルタを適用して検出音を除去した全死角空間フィルタ適用信号を生成する。さらに、分離信号に含まれる全死角空間フィルタ適用信号に対応する信号成分を除去するフィルタリング処理を実行し、周波数フィルタリング処理結果から音源分離結果を生成する。本構成により、例えば突発音等が含まれる混合信号に対する高精度な音源分離が可能となる。
【図面の簡単な説明】
【００８９】
【図１】Ｎ個の音源から異なる音が鳴っていて、それらをｎ個のマイクで観測するという状況について説明する図である。
【図２】周波数ビンにおける分離（図２（Ａ）参照）と、全周波数ビンの分離処理（図２（Ｂ）参照）について説明する図である。
【図３】観測信号のスペクトログラムを重複のある複数のブロック１〜Ｎに分割し、ブロックごとに学習を行なって分離行列を求める処理例について説明する図である。
【図４】各ブロックから求まった分離行列を、それより以降の観測信号へ適用する「ずらし適用」について説明する図である。
【図５】重複のあるブロックから分離行列を求めるためスレッドと呼ばれる処理の単位を、時刻をずらして複数並列に起動する方式について説明する図である。
【図６】突発音の発生と観測信号との対応について説明する図である。
【図７】突発音の発生が分離結果に及ぼす影響、特に追従遅れについて説明する図である。
【図８】フレーム単位のリスケーリング処理について説明する図である。
【図９】例えば図７に示す（ｂ１）分離結果１から全死角空間フィルタの結果を減算して突発音を相殺して音源対応出力のみを残す処理について説明する図である。
【図１０】２チャンネル周波数フィルタリングについて説明する図である。
【図１１】本発明の具体的な２チャンネル周波数フィルタリング処理について説明する図である。
【図１２】本発明の一実施例に従った信号処理装置の構成例について説明する図である。
【図１３】学習処理部のスレッド制御部の詳細構成例について説明する図である。
【図１４】スレッド演算部において実行する処理について説明する図である。
【図１５】学習スレッドの状態遷移について説明する図である。
【図１６】学習スレッドの状態遷移について説明する図である。
【図１７】音源分離処理の全体シーケンスについて説明するフローチャートを示す図である。
【図１８】短時間フーリエ変換の詳細について説明する図である。
【図１９】図１７に示すフローチャートにおけるステップＳ１０１の初期化処理の詳細について説明するフローチャートを示す図である。
【図２０】スレッド制御部１３１による複数の学習スレッド１，２に対する制御シーケンスを示す図である。
【図２１】図１７に示すフローチャートにおけるステップＳ１０５においてスレッド制御部１３１によって実行されるスレッド制御処理について説明するフローチャートを示す図である。
【図２２】図２１に示すフローチャートにおけるステップＳ２０３において実行される待機中状態における処理について説明するフローチャートを示す図である。
【図２３】図２１に示すフローチャートのステップＳ２０４において実行される蓄積中状態における処理について説明するフローチャートを示す図である。
【図２４】図２１に示すフローチャートのステップＳ２０５において実行される学習中状態における処理について説明するフローチャートを示す図である。
【図２５】図２４に示すフローチャートのステップＳ２３９において実行される、分離行列等更新処理について説明するフローチャートを示す図である。
【図２６】図２４に示すフローチャートのステップＳ２４１において実行される待機時間の設定処理について説明するフローチャートを示す図である。
【図２７】図１７に示すフローチャートにおけるステップＳ１０６において実行される分離処理について説明するフローチャートを示す図である。
【図２８】パワー比の算出に適用する関数の例を示す図である。
【図２９】学習スレッドの処理について説明するフローチャートを示す図である。
【図３０】図２９に示すフローチャートのステップＳ３９４において実行される、コマンド処理について説明するフローチャートを示す図である。
【図３１】図３０に示すフローチャートのステップＳ４０５において実行される処理の一例である分離行列の学習処理例について説明するフローチャートを示す図である。
【図３２】図３１に示すフローチャートのステップＳ４２０において実行する後処理について説明するフローチャートを示す図である。
【図３３】「全死角空間フィルタ＆周波数フィルタリング」と線形フィルタリングとを組み合わせた場合の構成例について説明する図である。
【図３４】線形フィルタリングを行う分散最小ビームフォーマ（ＭＶＢＦ）の適用例について説明する図である。
【発明を実施するための形態】
【００９０】
以下、図面を参照しながら本発明の信号処理装置、および信号処理方法、並びにプログラムの詳細について説明する。説明は以下の項目に従って行う。
１．本発明の構成と処理の概要について
２．本発明の信号処理装置の具体的実施例について
３．本発明の信号処理装置の実行する音源分離処理について
３−１．全体シーケンス
３−２．初期化処理について
３−３．スレッド制御処理について
３−４．分離処理について
４．スレッド演算部における学習スレッドの処理について
５．本発明の信号処理装置のその他の実施例（変形例）について
６．本発明の信号処理装置の構成に基づく効果についてのまとめ
【００９１】
［１．本発明の構成と処理の概要について］
まず、本発明の構成と処理の概要について説明する。
本発明は、複数の信号が混合された信号を独立成分分析（ＩＣＡ：Ｉｎｄｅｐｅｎｄｅｎｔ  Ｃｏｍｐｏｎｅｎｔ  Ａｎａｌｙｓｉｓ）を用いて分離する処理を行うものである。しかしながら、前述したように、先行する観測データに基づいて生成した分離行列を用いた音源分離処理を行うと、突発音に対する分離ができないという問題がある。本発明では、例えばこのような突発音に関する問題を解決するため、例えば本出願人の先の特許出願（特開２００８−１４７９２０号公報）に開示した従来のリアルタイムＩＣＡシステムに対して以下の要素を新規に追加した構成を持つ。
【００９２】
（１）突発音の歪みの問題に対処するため、分離結果のリスケーリング（周波数間のバランスを原信号に近づける処理）をフレーム単位で行なう構成。
なお、この処理を「頻繁リスケーリング」と呼ぶ。
【００９３】
（２）突発音を除去するために、検出された全部の音源方向に死角を向けるフィルタ（以降「全死角空間フィルタ（ａｌｌ−ｎｕｌｌ  ｓｐａｔｉａｌ  ｆｉｌｔｅｒ）」）をＩＣＡの学習データと同一の区間から生成する構成。さらに、観測信号にＩＣＡの分離結果を適用した結果と、同観測信号に全死角空間フィルタを適用した結果との間で、周波数フィルタリングに相当する処理または周波数フィルタリングを行なう構成。
なお、この処理構成を、「全死角空間フィルタ＆周波数フィルタリング」と呼ぶ。
【００９４】
（３）突発音の性質によって異なる対処をするため、ＩＣＡの各出力チャンネルが音源に対応した信号を出力しているかどうか判別し、その結果に応じて以下のどちらかの処理をする構成。
ｉ）音源に対応していると判別された場合は、「頻繁リスケーリング」と「全死角空間フィルタ＆周波数フィルタリング」との両方を適用する。
その結果、突発音はそのチャンネルからは除去される。
ｉｉ）音源に対応していないと判別された場合は、「頻繁リスケーリング」のみを適用する。その結果、突発音はそのチャンネルから出力される。
なお、この処理構成を「チャンネル別の判別」と呼ぶ。
【００９５】
以下では、まず、上記（１）〜（３）のそれぞれについての概要を説明する。
（１）頻繁リスケーリング
本出願人の先の特許出願である特開２００８−１４７９２０では、リスケーリングは学習終了時に分離行列に対して行なわれていた。
図５を参照して、この分離行列のリスケーリング処理について説明する。
例えば図５に示すスレッド２の学習区間５８の学習が終了したときに、学習データ５９を用いて分離行列のスケール（周波数間のバランス）が決定され、次に分離行列が更新されるまでスケールは一定であった。その場合、学習データ５９に含まれている音源に対しては正しいスケールで出力されるが、それ以外の音源（すなわち突発音）に対しては正しくないスケールで出力される可能性があった。
【００９６】
そこで本発明では、リスケーリング（周波数間のバランスを原信号に近づける処理）をフレーム単位で行なうことで、突発音の歪みを低減させる。フレーム単位のリスケーリング処理について図８を参照して説明する。
【００９７】
図８には、先に説明した図４と同様、
（Ａ）観測信号スペクトログラム
（Ｂ）分離結果スペクトログラム
これらの各データを示している。
図８に示す学習データのブロック８１は、図４に示す学習データのブロック４１に対応する。
図８に示す現在時刻の観測信号８２は、図４に示す現在時刻の観測信号４２に対応する。
図８に示す分離行列８３は、図４に示す分離行列４３に対応する。図８に示す分離行列８３は、学習データブロック８１から求められた分離行列である。
【００９８】
従来のリスケーリングは、学習データブロック８１の学習データを用いて行なわれていた。それに対して、以下に説明する本発明の処理では、現在時刻を終端とする一定長のブロック、すなわち、図８に示す現在時刻を含むブロック８７を設定し、この現在時刻を含むブロック８７の区間の観測信号を用いてリスケーリングを行なう。リスケーリングの具体的な式については後述する。このようなリスケーリング処理を行うことで、突発音に対しても早い段階でスケールを合わせる（＝歪みを低減する）ことができる。
【００９９】
（２）全死角空間フィルタ＆周波数フィルタリング
次に、突発音を除去するための有効な処理である「全死角空間フィルタ＆周波数フィルタリング」処理について図８を用いて説明する。図８に示す「学習データのブロック８１」は、図４に示した学習データのブロック４１と同一であり、従来はこのデータから分離行列８３（図４の分離行列４３と同一）のみを生成していた。それに対して本発明では、同一のデータ（学習データのブロック８１）から図８に示す分離行列８３のみならず全死角空間フィルタ８４も生成する。この全死角空間フィルタ８４の生成方法については後述する。
【０１００】
全死角空間フィルタ８４は、学習データのブロック８１の区間内に存在する全ての音源方向に死角を形成したフィルタ（ベクトルまたは行列）であり、これは突発音、すなわち、学習データのブロック８１では鳴っていなかった方向の音のみを透過する働きをする。なぜなら、学習データのブロック８１で鳴っていた音については、位置を変えずに鳴り続けている限り、全死角空間フィルタ８４が形成する死角によって除去されるのに対し、突発音については、その方向に死角が形成されておらず、素通ししてしまうからである。
【０１０１】
一方、分離行列８３も突発音を素通しする。その結果は出力チャンネルによって異なり、あるチャンネルではそれまで出力されていた音源に突発音が重畳され（図７の（ｂ１）分離結果１）、他のあるチャンネルでは突発音のみが出力される（図７の（ｂ２）分離結果２、および（ｂ３）分離結果３）。
【０１０２】
ここで、図７に示す（ｂ１）分離結果１のような結果から全死角空間フィルタの結果を減算（またはそれに類する操作）すると、突発音が相殺され、音源に対応した出力のみが残る。その処理シーケンスについて図９を参照して説明する。
【０１０３】
図９には、
（ａ）観測信号
（ｂ）全死角空間フィルタ適用信号
（ｃ１）処理結果１
（ｃ２）処理結果２
（ｃ３）処理結果３
これらの各信号を示している。左から右に時間（ｔ）が経過し、ブロックの高さが音量を示している。
【０１０４】
（ａ）観測信号は、先に説明した図７の（ａ）観測信号と同じ観測信号である。観測信号には、時間ｔ０〜ｔ５の間、継続して鳴り続けている継続音９１と、時間ｔ１〜ｔ４の間のみ出力される突発音９２が含まれている。
【０１０５】
図９に示す（ａ）観測信号に対して、全死角空間フィルタを適用すると、（ｂ）全死角空間フィルタ適用信号が得られる。すなわち、鳴りっぱなしの継続音９１はほぼ除去されるのに対し、突発音９２は鳴り始めが除去されずに残る。
（ｂ）全死角空間フィルタ適用信号では、時間ｔ０〜ｔ５の間、鳴りっぱなしの継続音９１はほぼ除去される。一方、突発音９２は鳴り始め（時間ｔ１〜）が除去されずに残る。時間ｔ１〜ｔ２の区間９４では、突発音９２は全く除去されない。
【０１０６】
全死角空間フィルタは、時間的に先行する観測信号に含まれる音源を除去する働きを持つが、時間ｔ１〜ｔ２の区間９４の直前の観測信号には突発音９２が含まれず、全死角空間フィルタによって除去されないためである。
【０１０７】
この図９（ｂ）に示す全死角空間フィルタ適用信号を、分離行列適用結果の一つである図７（ｂ１）分離結果１から減算する。と、突発音が除去され、鳴りっぱなしの継続音９１のみが残った結果が得られる。これが、図９（ｃ１）処理結果１の信号である。すなわち、図９（ｃ１）処理結果１は、図７（ｂ１）分離信号と、図９（ｂ）全死角空間フィルタ適用信号を利用した以下の演算の結果として得られる信号である。
処理結果１＝（分離結果１）−（全死角空間フィルタ適用信号）
【０１０８】
なお、減算の際に突発音を完全に除去するためには、全死角空間フィルタ適用結果のスケールを、分離行列適用結果に含まれる突発音のスケールと合わせる必要がある。これを「全死角空間フィルタのリスケーリング」と呼ぶ。なおリスケーリング処理は一方の信号のスケール（信号の変動の範囲）をもう一方の信号に合わせる処理として行われる。この場合は、全死角空間フィルタ適用結果のスケールを、分離行列適用結果に含まれる突発音のスケールに近づける処理として行われる。スケールはＩＣＡの出力チャンネルごとに合わせる必要があるため、リスケーリング後の全死角空間フィルタ適用結果は、ＩＣＡのチャンネル数と同一である。（リスケーリング前の全死角空間フィルタ適用結果のチャンネル数は１である。）
【０１０９】
上記の「減算」は、通常の引き算（複素数領域の引き算）でも良いが、一般化して、２チャンネル周波数フィルタリングと呼ばれる処理を用いても良い。
図１０を参照して、２チャンネル周波数フィルタリングについて説明する。
【０１１０】
一般的に、２チャンネル周波数フィルタリングは２つの入力を持つ。
一方は観測信号１０２［Ｘ（ω，ｔ）］、
もう一方は推定ノイズ１０１［Ｎ（ω，ｔ）］
である。これらは同一の時刻と周波数の信号である。
この２つの信号から、ゲイン１０４（観測信号に乗じる係数）［Ｇ（ω，ｔ）］をゲイン推定部１０３で計算し、そのゲインをゲイン適用部１０５において観測信号に乗じることで処理結果１０６を得る。処理結果Ｕ（ω，ｔ）は、下式によって示される。
Ｕ（ω，ｔ）＝Ｇ（ω，ｔ）×Ｘ（ω，ｔ）
【０１１１】
具体的には、ノイズが支配的な周波数ではゲインを小さく、ノイズが少ない周波数ではゲインを大きくすることで、ノイズの除去された信号を生成するのである。通常の減算も周波数フィルタリングの一種とみなすことができるが、他に、スペクトル減算（ｓｐｅｃｔｒａｌ  ｓｕｂｔｒａｃｔｉｏｎ）やＭｉｍｉｍｕｍ  Ｍｅａｎ  Ｓｑａｕｒｅ  Ｅｒｒｏｒ  （ＭＭＳＥ）・Ｗｉｅｎｅｒ  フィルタ・Ｊｏｉｎｔ  ＭＡＰといった既知の方式も適用可能である。
【０１１２】
本発明の具体的な２チャンネル周波数フィルタリング処理について図１１を参照して説明する。本発明の処理では、観測信号の入力として分離行列適用結果１１２、すなわち、
Ｙ'ｋ（ω，ｔ）
を入力する。
また、推定ノイズの入力として、突発音である全死角空間フィルタ適用結果（リスケーリング後）１１１、すなわち、
Ｚ'ｋ（ω，ｔ）
を入力する。
【０１１３】
ゲイン推定部１１３は、これら全死角空間フィルタ適用結果１１１と分離行列適用結果１１２を入力してゲイン１１４［Ｇｋ（ω，ｔ）］を求める。ゲイン適用部１１５が、ゲイン１１４［Ｇｋ（ω，ｔ）］を、分離行列適用結果１１２、すなわち、Ｙ'ｋ（ω，ｔ）に乗じることで、突発音が除去された結果であるＵｋ（ω，ｔ）を求める。処理結果Ｕｋ（ω，ｔ）は下式によって示される。
Ｕｋ（ω，ｔ）＝Ｇｋ（ω，ｔ）×Ｙ'ｋ（ω，ｔ）
【０１１４】
なお、周波数フィルタリングにおいてスペクトル減算のような非線形な方式を用いると、「背景技術」の欄で述べた「消し残り」も消すことが可能である。すなわち、「消し残り」は分離行列でも全死角空間フィルタでも消せないため、それぞれの結果同士を減算すると相殺される。そのため、追従遅れと消し残りとがトレードオフになるという課題も解消できる。
【０１１５】
（３）チャンネル別の判別
前述の「全死角空間フィルタ＆周波数フィルタリング」処理を全てのチャンネルに対して適用すると、かえって弊害となることがある。それは、突発音が目的音である場合である。例えば図７において、（ｂ２）分離結果２には突発音のみが出力されており、このチャンネルに対して、図９に示した（ｂ）全死角空間フィルタ適用信号との減算を行なうと、突発音の鳴り始め（図７に示す時間ｔ１〜ｔ２の区間７４）が除去され、無音が出力される。突発音が妨害音である場合はこれでも問題ないが、突発音が目的音である場合にはこれは望ましくない。
【０１１６】
そこで、以下に述べる基準を用いて、「全死角空間フィルタ＆周波数フィルタリング」を適用すべきか否かをチャンネルごとに判別する。あるいは、周波数フィルタリングの度合いをチャンネルごとに変更する。そうすることで、鳴りっぱなしの音（突発音が発生する前から鳴っている音）のみが出力されるチャンネルと、突発音のみが出力されるチャンネルとの両方が同時に実現できる。
【０１１７】
あるチャンネルに「全死角空間フィルタ＆周波数フィルタリング」を適用するか否か、すなわち、突発音を除去するのが望ましいか否かは、突発音が発生する直前にそのチャンネルから音源に対応した信号が出力されているかに依存する。音源に対応した信号が既に出力されている場合は周波数フィルタリングを行ない（あるいは減算する量を大きくし）、そのような信号が出力されていない場合には周波数数フィルタリングをスキップする（あるいは減算する量を小さくする）。
【０１１８】
例えば、図７において、突発音７２が発生する直前の時間ｔ０〜ｔ１の区間７３に注目すると、（ｂ１）分離結果１のチャンネルには音源の継続音７１に対応した信号が出力されている。このチャンネルに対しては全死角空間フィルタおよび周波数フィルタリングを適用する。そうすることで、突発音が発生しても、その突発音は除去され、継続音７１に由来する信号のみが出力され続ける。
これは、図９の（ｃ１）処理結果１に対応する。
【０１１９】
一方、他のチャンネルである図７に示す（ｂ２）分離結果２、（ｂ３）分離結果３の時間ｔ０〜ｔ１の区間７３では、継続音７１由来の成分は除去され、無音に近い信号が出力されている。このようなチャンネルに対しては、周波数フィルタリングは適用しない。すなわち、図９の（ｃ２）処理結果２、（ｃ３）処理結果３である。これらのチャンネルには頻繁リスケーリングのみ適用する。「頻繁リスケーリング」とは、前述したように、分離結果のリスケーリング（周波数間のバランスを原信号に近づける処理）をフレーム単位で行なう処理である。
この様な処理を行うことで、突発音が発生したときに突発音のみからなる信号が出力される。その場合でも、頻繁リスケーリングはフレーム毎に行なわれているため、従来法と異なり、突発音の鳴り始めの歪みは低減される。
【０１２０】
ＩＣＡの各出力（分離行列の適用結果）が音源に対応しているか否かは、分離行列に依存する。従ってその判別はフレーム毎に行なう必要はなく、分離行列が更新されたタイミングで行えばよい。判別のための具体的な尺度については後述する。
【０１２１】
なお、上記の判別を「周波数フィルタリングを適用する／しない」の２値で行なうと、適用の有無が切り替わった時点で処理結果が大きく変化してしまう。そのような現象を防ぐには、ＩＣＡの出力が音源に対応しているか否かを連続値で表現し、その値に応じて周波数フィルタリングを作用させる度合い（減算量）を連続的に変化させる処理を行なえばよい。詳細は後述する。
【０１２２】
［２．本発明の信号処理装置の具体的実施例について］
以下、本発明の信号処理装置の具体的な実施例について説明する。本発明の信号処理装置の一構成例を図１２に示す。なお、図１２に示す装置構成は、本出願人が先に出願した特許出願である特開２００８−１４７９２０「リアルタイム音源分離装置および方法」をベースとした構成である。この特開２００８−１４７９２０において示した構成に、全死角空間フィルタおよび周波数フィルタリングに関するモジュールである共分散行列計算部１２５，全死角空間フィルタ適用部１２７、周波数フィルタリング部１２８、全死角空間フィルタ保持部１３４、パワー比保持部１３５を追加した構成を有する。なお、図１２に示す信号処理装置は、具体的には例えばＰＣによって実現可能である。すなわち、図１２の示す信号処理装置内の各処理部の処理は、例えば、予め規定されたプログラムに従った処理を実行するＣＰＵによって実行可能である。
【０１２３】
図１２の左側に示す分離処理部１２３は主に観測信号の分離を行なう。図１２の右側に示す学習処理部１３０は主に分離行列の学習を行なう。具体的には、分離行列の生成、全死角空間フィルタの生成、パワー比の算出等を実行する。全死角空間フィルタは、前述したように学習データのブロック区間で検出された全ての音源方向に死角を形成したフィルタ（ベクトルまたは行列）であり、これは突発音、すなわち、学習データブロックでは鳴っていなかった方向の音のみを透過する働きをする。また、パワー比は、各チャンネルの音のパワー（音量）の比率情報である。
【０１２４】
なお、分離処理部１２３における処理と、学習処理部１３０の処理は並列に行われる。分離処理部１２３の処理は表（ｆｏｒｅｇｒｏｕｎｄ）の処理であり、学習処理部１３０の処理は裏（ｂａｃｋｇｒｏｕｎｄ）の処理であると言える。
【０１２５】
システム全体で見ると、観測信号に対する音源分離処理をフレーム毎に行なって分離結果を生成する一方で、これらの分離処理に適用する分離行列や全死角空間フィルタを、適宜、最新のものに置き換えるという動作をする。分離行列や全死角空間フィルタの提供を学習処理部１３０が行い、分離処理部１２３が、学習処理部１３０から提供された分離行列や全死角空間フィルタを適用して音源分離処理を実行する。本発明で追加された３つの要素の内、全死角空間フィルタの生成自体は分離行列の学習と同様に学習処理部１３０内で裏の処理として行なわれるが、分離行列および全死角空間フィルタの頻繁リスケーリングや、それぞれを観測信号に適用することや、周波数フィルタリングなどは、分離処理部１２３内で表の処理として行なわれる。
【０１２６】
以下では、それぞれの構成要素の処理について説明する。
複数のマイクロホン１２１で収録された音はＡＤ変換部１２２でデジタル信号に変換され、分離処理部１２３のフーリエ変換部１２４へ送られる。フーリエ変換部１２４では窓つきの短時間フーリエ変換（ＳＴＦＴ）によって周波数領域のデータへ変換する（詳細は後述する）。その際、フレームと呼ばれる一定個数のデータが生成される。以降の処理は、このフレームを単位として行なわれる。フーリエ変換されたデータは、共分散行列計算部１２５、分離行列適用部１２６、全死角空間フィルタ適用部１２７、スレッド制御部１３１にそれぞれ送られる。
【０１２７】
以下では、先に分離処理部１２３における表の処理の信号の流れについて説明し、その後で学習処理部１３０の処理について説明する。
【０１２８】
分離処理部１２３の共分散行列計算部１２５は、フーリエ変換部１２４の生成する観測信号のフーリエ変換データを入力し、観測信号の共分散行列をフレーム毎に計算する。計算の詳細は後述する。ここで求めた共分散行列は、分離行列適用部１２６および全死角空間フィルタ適用部１２７のそれぞれで、フレーム毎にリスケーリングを行なうために利用される。また、周波数フィルタリング部１２８において周波数フィルタリングを適用する度合いを決める尺度としても利用される。
【０１２９】
分離行列適用部１２６では、学習処理部１３０において現在時刻より前に求められた分離行列、すなわち分離行列保持部１３３に保持された分離行列に対してリスケーリングを行なった後、１フレーム分の観測信号とリスケーリング後の分離行列とを乗算して１フレーム分の分離行列適用結果を生成する。
【０１３０】
全死角空間フィルタ適用部１２７では、学習処理部１３０において現在時刻より前に求められた全死角空間フィルタ、すなわち全死角空間フィルタ保持部１３４に保持された全死角空間フィルタに対してリスケーリングを行なった後、１フレーム分の観測信号とリスケーリング後の全死角空間フィルタとを乗算して１フレーム分の全死角空間フィルタ適用結果を生成する。
【０１３１】
周波数フィルタリング部１２８は、観測信号に基づくフーリエ変換データに対する分離行列の適用結果を分離行列適用部１２６から受け取る一方で、観測信号に基づくフーリエ変換データに対する全死角空間フィルタの適用結果を全死角空間フィルタ適用部１２７から受け取り、両方の適用結果から、先に図１１を参照して説明した２チャンネル周波数フィルタリングを行なう。その結果は、フーリエ逆変換部１２９へ送られる。
【０１３２】
フーリエ逆変換部１２９へ送られた分離結果は時間領域の信号に変換され、後段処理部１３６へ送られる。後段処理部１３６の実行する後段の処理とは、例えば音声認識や話者識別やサウンド出力などである。後段の処理によっては、周波数領域のデータをそのまま使用することも可能であり、その場合、フーリエ逆変換は省略可能である。
【０１３３】
次に、フーリエ変換部１２４は、観測信号に基づくフーリエ変換データを学習処理部１３０のスレッド制御部１３１にも提供する。
スレッド制御部１３１へ送られた観測信号は、スレッド演算処理部１３２の複数の学習スレッド１３２−１〜Ｎへ送られる。それぞれの学習スレッドは、与えられた観測信号を一定量だけ蓄積した後、ＩＣＡのバッチ処理を用いて観測信号から分離行列を求める。この処理は、先に図５を参照して説明した処理と同様の処理である。さらに、スレッド制御部１３１は分離行列から全死角空間フィルタおよびパワー比も計算で求める。求まった分離行列、全死角空間フィルタ、パワー比は、分離行列保持部１３３、全死角空間フィルタ保持部１３４、パワー比保持部１３５に保持され、それぞれスレッド制御部１３１の制御の下、分離処理部１２３の分離行列適用部１２６、全死角空間フィルタ適用部１２７、周波数フィルタリング部１２８へ送られる。
【０１３４】
なお、全死角空間フィルタ適用部１２７および分離行列適用部１２６からスレッド制御部１３１への点線は、その時点で最新のリスケーリング済み全死角空間フィルタおよび分離行列を学習初期値に反映させることを表している。詳細は後段の［３．本発明の信号処理装置のその他の実施例（変形例）について］において説明する。
【０１３５】
次に、図１２に示す装置構成における学習処理部１３０のスレッド制御部１３１の詳細構成について、図１３を参照して説明する。
【０１３６】
現フレーム番号保持カウンタ１５１は、観測信号が１フレーム分供給されるごとに値が１インクリメントされ、所定の値に達すると初期値に戻るようになされている。
学習初期値保持部１５２は、それぞれのスレッドにおいて学習処理を実行する場合の分離行列Ｗの初期値を保持するものである。分離行列Ｗの初期値は、基本的には最新の分離行列と同一であるが、異なる値を用いるものとしても良い。例えば、学習初期値にはリスケーリング（周波数ビン間のパワーを調整する処理。詳細は後述）を適用する前の分離行列を用い、分離行列にはスケーリング適用後のものを用いるようにする。
【０１３７】
蓄積開始予定タイミング指定情報保持部１５３は、蓄積を開始するタイミングを複数のスレッド間で一定間隔にするために用いられる情報である。使用方法は後述する。なお、蓄積開始予定タイミングは、相対時刻を用いて表されていてもよいし、相対時刻の代わりにフレーム番号で管理してもよいし、時間領域信号のサンプル番号で管理しても良い。これについては他の「時刻」や「タイミング」を管理するための情報についても同様である。
【０１３８】
観測信号蓄積タイミング情報保持部１５４は、分離部１２７で現在使用されている分離行列Ｗが、どのタイミングで取得された観測信号を基に学習されたものであるかを示す情報、すなわち、最新の分離行列に対応した観測信号の相対時刻またはフレーム番号を保持するものである。観測信号の蓄積タイミング情報保持部１５４には、対応する観測信号の蓄積開始タイミングと蓄積終了タイミングとの両方を格納しても良いが、ブロック長、すなわち、観測信号の蓄積時間が一定ならば、いずれか一方だけを保存すれば十分である。
【０１３９】
また、スレッド制御部１３１は、それぞれのスレッドへリンクされているポインタを保持したポインタ保持部１５５を有し、これを用いて、複数のスレッド１３２−１〜Ｎの処理を制御している。
【０１４０】
次に、図１４を参照してスレッド演算部１３２において実行する処理について説明する。スレッド１３２−１〜Ｎのそれぞれは、観測信号バッファ１６１、分離結果バッファ１６２、学習演算部１６３、および、分離行列保持部１６４の各モジュールの機能を用いて、バッチ処理のＩＣＡを実行する。
【０１４１】
観測信号バッファ１６１は、スレッド制御部１３１から供給される観測信号を保持する。
分離結果バッファ１６２には、学習演算部１６３により演算された分離行列収束前の分離結果が保持される。
【０１４２】
学習演算部１６３は、観測信号バッファ１６１に蓄積されている観測信号を、分離行列保持部１６４に保持されている分離処理用の分離行列Ｗに基づいて分離して、分離結果バッファ１６２に蓄積するとともに、分離結果バッファ１６２に蓄積される分離結果を用いて、学習中の分離行列を更新する処理を実行する。
【０１４３】
スレッド演算部１３２（＝学習スレッド）は状態遷移マシンであり、現在の状態は状態格納部１６５に格納される。スレッドの状態はカウンタ１６６のカウンタ値によって、スレッド制御部１３１により制御される。カウンタ１６６は、観測信号が１フレーム分供給されるのと同期して値が変化し、この値によって状態を切り替える。詳細は後述する。
【０１４４】
観測信号の開始・終了タイミング保持部１６７には、学習に使用されている観測信号の開始タイミングと終了タイミングを示す情報のうちの少なくともいずれか一方が保持されている。タイミングを示す情報は、上述したように、フレーム番号やサンプル番号であっても良いし、相対時刻情報であっても良い。ここでも、開始タイミングと終了タイミングとの両方を格納しても良いが、ブロック長、すなわち、観測信号の蓄積時間が一定ならば、いずれか一方だけを保存すれば十分である。
【０１４５】
学習終了フラグ１６８は、学習が終了したことをスレッド制御部１３１に通知するために用いられるフラグである。スレッドの起動時においては、学習終了フラグ１６８はＯＦＦ（フラグが立っていない）にセットされ、学習が終了した時点でＯＮにセットされる。そして、スレッド制御部１３１が、学習が終了したことを認識した後、スレッド制御部１３１の制御により、学習終了フラグ１６８は、再び、ＯＦＦにセットされる。
【０１４６】
なお、状態格納部１６５、カウンタ１６６、観測信号の開始・終了タイミング保持部１６７のデータは、スレッド制御部１３１等の外部モジュールから値を書き換えることができるものとする。例えば、スレッド演算部１３２において学習のループが回っている間も、スレッド制御部１３１はカウンタ１６６の値を変更することができる。
【０１４７】
前処理用データ保持部１６９は、前処理が施された観測信号を元に戻す際に必要となるデータを保存しておく領域である。具体的には、例えば、前処理において観測信号の正規化（分散を１に、平均を０にそろえる）が実行される場合、前処理用データ保持部１６９には、分散（または標準偏差やその逆数）や平均などの値が保持されるので、これを用いて正規化前の信号を復元することができる。また、例えば、前処理として無相関化（ｐｒｅ−ｗｈｉｔｅｎｉｎｇとも称される）が実行される場合、前処理用データ保持部１６９には、無相関化で乗じた行列が保持される。
【０１４８】
全死角空間フィルタ保持部１６０は、観測信号バッファ１６１に含まれる全ての音源の方向に死角を形成するフィルタであり、学習終了時の分離行列から生成する。または、観測信号バッファのデータから生成する方法も存在する。生成方法については後述する。
【０１４９】
次に、学習スレッド１３２−１〜Ｎの状態遷移について図１５および図１６を参照して説明する。実装としては、カウンタ１６６の値に基づいて学習スレッド自身が自分の状態を変化させるという仕様にしても良いが、スレッド制御部がカウンタの値や「学習終了フラグ」１６８の値に応じて状態遷移コマンドを発行し、学習スレッドはそのコマンドを受けて状態を変化させるという仕様でも良い。以下の実施例では、後者の仕様を採用している。
【０１５０】
図１５は、先に図５を参照して説明したスレッド中の１つを示している。スレッドの各々は、観測信号の「蓄積中」状態において指定された時間、すなわち１ブロック長の観測信号がバッファに蓄えられる。指定された時間が経過した後、状態は学習中に遷移する。
【０１５１】
学習中の状態において、分離行列Ｗが収束するまで（または一定回数）学習処理ループが実行され、蓄積中の状態において蓄積された観測信号に対応した分離行列が求められる。分離行列Ｗが収束した後（または一定回数の学習処理ループが実行された後）状態は、待機中に遷移する。
【０１５２】
そして、待機中の状態において、指定された時間だけ、観測信号の蓄積や学習は実行されず、待機される。待機中の状態を維持する時間は、学習にかかった時間によって決まる。すなわち、図１５に示されるように、予め、「蓄積中」状態と「学習中」状態と「待機中」状態との合計の時間幅であるスレッド長（ｔｈｒｅａｄ＿ｌｅｎ）が定められ、基本的には、「学習中」状態が終了したときからスレッド長が終了するまでの間の時間が、「待機中」状態の時間（待機時間）とされる。待機時間が過ぎた後、状態は、観測信号の「蓄積中」状態へ戻る。
【０１５３】
これらの時間は、例えば、ミリ秒などの単位で管理してもよいが、短時間フーリエ変換で生成されるフレームを単位として計測するものとしても良い。以降の説明では、フレームを単位として計測する（たとえば、カウントアップをおこなう）ものとする。
【０１５４】
図１６を参照してスレッドの状態遷移についてさらに説明する。システムの起動直後において各スレッドは「初期状態」１８１にあるが、その内の１つは「蓄積中」１８３へ、残りは「待機中」１８２へ状態を遷移させる（状態遷移コマンドを発行する）。先に説明した図５を例にとると、スレッド１が「蓄積中」へ遷移したスレッド、それ以外が「待機中」へ遷移したスレッドである。以下では、「蓄積中」へ遷移したスレッドについて先に説明する。
【０１５５】
観測信号の蓄積に要する時間をブロック長（ｂｌｏｃｋ＿ｌｅｎ）と呼ぶ（図１５参照）。また、蓄積・学習・待機の１周期に要する時間をスレッド長（ｔｈｒｅａｄ＿ｌｅｎ）と呼ぶ。これらの時間は、ミリ秒などの単位で管理してもよいが、短時間フーリエ変換で生成されるフレームを単位としても良い。以降の説明では、フレームを単位としている。
【０１５６】
「蓄積中→学習中」および「待機中→蓄積中」の状態遷移については、カウンタの値に基づいて行なう。すなわち、「蓄積中」（図１５の蓄積中状態１７１および図１６の蓄積中状態１８３）から始まったスレッドの中では、観測信号が１フレーム分供給されるごとにカウンタを＋１し、カウンタの値がブロック長（ｂｌｏｃｋ＿ｌｅｎ）と同じ値になったら、「学習中」（図１５の学習中状態１７２および図１６の学習中状態１８４）へ状態を遷移させる。学習は、分離処理と並列にバックグラウンドで行なわれるが、その間も観測信号のフレームと連動してカウンタを＋１していく。
【０１５７】
学習が終了したら、状態を「待機中」（図１５の待機中状態１７３および図１６の待機中状態１８２）へ遷移させる。待機中も学習中と同様に、観測信号のフレームと連動してカウンタを＋１していく。そしてカウンタがスレッド長（ｔｈｒｅａｄ＿ｌｅｎ）と同じ値になったら、状態を「蓄積中」（図１５の蓄積中状態１７１および図１６の蓄積中状態１８３）へ遷移させると共に、カウンタを０（または適切な初期値）に戻す。
【０１５８】
一方、「初期状態」１８１から「待機中」（図１５の待機中状態１７３および図１６の待機中状態１８２）へ遷移したスレッドについては、待機させたい時間に対応した値にカウンタをセットする。例えば、図５のスレッド２は、ブロックのシフト幅（ｂｌｏｃｋ＿ｓｈｉｆｔ）だけ待機してから「蓄積中」へ遷移する。同様に、スレッド３はブロックのシフト幅の２倍（ｂｌｏｃｋ＿ｓｈｉｆｔ×２）だけ待機している。これらを実現するためには、
スレッド２のカウンタを、
（スレッド長）−（ブロックシフト幅）：（ｔｈｒｅａｄ＿ｌｅｎ）−（ｂｌｏｃｋ＿ｓｈｉｆｔ）にセットする。
また、スレッド３のカウンタを、
（スレッド長）−（２×ブロックシフト幅）：（ｔｈｒｅａｄ＿ｌｅｎ）−（ｂｌｏｃｋ＿ｓｈｉｆｔ×２）にセットする。
このような設定にすれば、カウンタの値がスレッド長（ｔｈｒｅａｄ＿ｌｅｎ）に達した後で「蓄積中」へ遷移し、それ以降はスレッド１と同様に「蓄積中→学習中→待機中」の周期を繰り返す。
【０１５９】
学習スレッドを何個用意する必要があるかは、スレッド長とブロックのシフト幅とで決める。スレッド長を  ｔｈｒｅａｄ＿ｌｅｎ、ブロックのシフト幅をｂｌｏｃｋ＿ｓｈｉｆｔとすると、必要な個数は、
（スレット長）／（ブロックシフト幅）、すなわち、
ｔｈｒｅａｄ＿ｌｅｎ／ｂｌｏｃｋ＿ｓｈｉｆｔ
で求まる。
なお、端数は切り上げる。
【０１６０】
例えば図５では、
［スレッド長（ｔｈｒｅａｄ＿ｌｅｎ）］＝１．５×［ブロック長（ｂｌｏｃｋ＿ｌｅｎ）］、
［ブロックシフト幅（ｂｌｏｃｋ＿ｓｈｉｆｔ）］＝０．２５×ブロック長（ｂｌｏｃｋ＿ｌｅｎ）］
に設定してあるため、必要なスレッド数は１．５／０．２５＝６である。
【０１６１】
［３．本発明の信号処理装置の実行する音源分離処理について］
（３−１．全体シーケンス）
次に、本発明の信号処理装置におけるリアルタイム音源分離処理の全体シーケンスについて、図１７に示すフローチャートを参照して説明する。図１７に示すフローチャートは、分離処理部１２３の処理を中心として説明するフローチャートである。学習処理部１３０の「裏の処理（学習）」については、分離処理とは別の処理単位（別スレッド・別プロセス・別プロセッサなど）で動かすことが可能であるため、別のフローチャートを用いて説明する。また、両者でやりとりするコマンド等については、図２０に示すシーケンス図で説明する。
【０１６２】
最初に、図１７に示すフローチャートを参照して分離処理部１２３の処理について説明する。システムが起動したら、ステップＳ１０１において、各種の初期化を行なう。初期化の詳細は後述する。ステップＳ１０３の音入力から、ステップＳ１０８の分離結果の送信までの処理を、システムでの処理が終了（ステップＳ１０２でＹｅｓ）するまで繰り返す。
【０１６３】
ステップＳ１０３の音入力は、オーディオデバイス（実施形態によってはネットワークやファイルなど）から一定数のサンプルを取り込み（この処理を「キャプチャー」と呼ぶ）、バッファに蓄える処理である。これをマイクロホンの個数分だけ行なう。以降では、キャプチャーされたデータを観測信号と呼ぶ。
【０１６４】
次に、ステップＳ１０４において、観測信号を一定長ごとに切り出して、短時間フーリエ変換（ＳＴＦＴ）を行う。短時間フーリエ変換の詳細について図１８を参照して説明する。
【０１６５】
例えば図１に示すような環境においてｋ番目のマイクによって収録された観測信号ｘｋを図１８（ａ）に示す。この観測信号ｘｋから一定長を切り出した切り出しデータであるフレーム１９１〜１９３にハニング窓やサイン窓等の窓関数を作用させる。なお、切り出した単位をフレームと呼ぶ。１フレーム分のデータに対して、離散フーリエ変換（有限区間のフーリエ変換のこと。略称DFT）または高速フーリエ変換（FFT）を施すことにより、周波数領域のデータであるスペクトルＸｋ（ｔ）を得る（ｔはフレーム番号）。
【０１６６】
切り出すフレームの間には、図に示すフレーム１９１〜１９３のように重複があってもよく、そうすることで連続するフレームのスペクトルＸｋ（ｔ−１）〜Ｘｋ（ｔ＋１）を滑らかに変化させることができる。また、スペクトルをフレーム番号に従って並べたものをスペクトログラムと呼ぶ。図１８（ｂ）がスペクトログラムの例である。
【０１６７】
本発明では入力チャンネルが複数（マイクの個数分）あるため、フーリエ変換もチャンネル数だけ行なう。以降では、全チャンネル・１フレーム分のフーリエ変換結果をＸ（ｔ）というベクトルで表わす（先に説明した式［３．１１］）。式［３．１１］において、ｎはチャンネル数（＝マイク数）である。Ｍは周波数ビンの総数であり、短時間フーリエ変換のポイント数をＪとすると、Ｍ＝Ｊ／２＋１である。
【０１６８】
図１７のフローに戻り、説明を続ける。ステップＳ１０４において、観測信号を一定長ごとに切り出して、短時間フーリエ変換（ＳＴＦＴ）を行った後、ステップＳ１０５において、それぞれの学習スレッドに対する制御を行なう。詳細は後述する。
【０１６９】
次に、ステップＳ１０５で生成された観測信号Ｘ（ｔ）に対して、ステップＳ１０６において分離を行なう。分離行列をＷとすると（前記の式［３．１０］）、分離結果Ｙ（ｔ）（式［３．４］）は
Ｙ（ｔ）＝ＷＸ（ｔ）
で求まる（式［３．１２］）。
【０１７０】
次に、ステップＳ１０７において、分離結果Ｙ（ｔ）に対して逆フーリエ変換（逆ＦＴ）をかけることで、時間領域の信号に戻す。それからステップＳ１０８において、分離結果を後段の処理へ渡す。以上のステップＳ１０３〜Ｓ１０８を、終了まで繰り返す。
【０１７１】
（３−２．初期化処理について（Ｓ１０１））
図１７に示すフローチャートにおけるステップＳ１０１の初期化処理の詳細について、図１９に示すフローチャートを参照して説明する。
【０１７２】
ステップＳ１５１において、図１２および図１３に示すスレッド制御部１３１は、初期化処理を実行する。具体的には、図１３に示す各構成についてして以下の処理を行う。
現フレーム番号保持カウンタ１５１（図１３参照）を初期化してその値を０とする。
学習初期値保持部１５２（図１３参照）に適切な初期値を代入する。例えば、初期値は単位行列でも良いし、前回のシステム終了時の分離行列Ｗが保存されている場合は、前回のシステム終了時の分離行列Ｗ、またはこの分離行列に適切な変換を作用させたものを使用しても良い。また、例えば、画像や先見知識等の情報により、音源の方向がある程度の精度で推定できるような場合には、音源方向に基づいて初期値を算出して、設定するものとしてもよい。
【０１７３】
さらに、
蓄積開始予定タイミング指定情報保持部１５３には、
（必要スレッド数−１）×［ブロックシフト幅（ｂｌｏｃｋ＿ｓｈｉｆｔ）］
上記式の算出値が設定される。
この値は、一番大きなスレッド番号を有するスレッドの蓄積が開始するタイミング（フレーム番号）である。
そして、観測信号の蓄積タイミング情報保持部１３４には、最新の分離行列に対応した観測信号を示すタイミング情報（フレーム番号または相対時刻情報）が保持されるので、ここでは、初期化されて、０が保持される。
【０１７４】
なお、分離行列保持部１３３（図１２参照）にも、初期化された場合の学習初期値保持部１５２と同様に、適切な初期値が保持される。分離行列保持部１３３に保持される初期値は、単位行列でも良いし、前回のシステム終了時の分離行列が保存されている場合は、前回のシステム終了時の分離行列Ｗ、またはこの分離行列に適切な変換を作用させたものを使用しても良い。
【０１７５】
さらに、全死角空間フィルタ保持部１３４（図１２参照）にも初期値を代入する。この初期値は分離行列の初期値に依存する。分離行列として単位行列を用いる場合は、全死角空間フィルタには「無効」を表わす値を代入し、この値のときは後述の周波数フィルタリングが機能しないようにしておく。一方、分離行列の初期値として他に適切な値を用いる場合は、そこから全死角空間フィルタの値を計算する。
【０１７６】
パワー比保持部１３５（図１２参照）にも初期値を代入する。初期値として例えば０を代入しておくと、最初の分離行列が学習で求まるまでの間（例えば図５の区間５１）は周波数フィルタリングを機能させないようにすることができる。
【０１７７】
ステップＳ１５２において、スレッド制御部１３１は、スレッド演算部１３２において実行されるスレッドを必要な数Ｎだけ確保し、それらの状態を「初期化」状態とする。
【０１７８】
ここで、必要なスレッドの数Ｎは、スレッド長／ブロックシフト幅（ｔｈｒｅａｄ＿ｌｅｎ／ｂｌｏｃｋ＿ｓｈｉｆｔ）の小数点以下を切り上げる（すなわち、ｔｈｒｅａｄ＿ｌｅｎ／ｂｌｏｃｋ＿ｓｈｉｆｔよりも大きく最も値の近い整数）ことにより求められる。
【０１７９】
ステップＳ１５３において、スレッド制御部１３１は、スレッドループを開始して、全てのスレッドの初期化が終了するまで、初期化未処理のスレッドを検出して、ステップＳ１５４乃至ステップＳ１５９の処理を実行する。ステップＳ１５２で生成された個数だけループを回す。なお、スレッド番号は１から順に振ってき、ループ内では変数ｓで表わされるものとする。（ループの代わりに、学習スレッドの個数だけ並列に処理しても構わない。以降の学習スレッドのループについても同様である。）
【０１８０】
ステップＳ１５４において、スレッド制御部１３１は、スレッド番号は１であるか否かを判断する。１番目のスレッドとそれ以外では初期設定が異なるため、ステップＳ１５４で処理を分岐する。
【０１８１】
ステップＳ１５４において、スレッド番号が１であると判断された場合、ステップＳ１５５において、スレッド制御部１３１は、スレッド番号１のスレッド（例えば、スレッド１３２−１）を制御して、そのカウンタ１６６（図１４参照）を初期化（例えば０にセット）する。
【０１８２】
ステップＳ１５６において、スレッド制御部１３１は、スレッド番号１のスレッド（例えば、スレッド１３２−１）に、「蓄積中」状態に状態を遷移させるための状態遷移コマンドを発行して、処理は、後述するステップＳ１５９に進む。状態遷移はスレッド制御部から学習スレッドに対して「指定された状態に遷移せよ」というコマンド（以降「状態遷移コマンド」）を発行することで行なう。（以降の説明における状態遷移は全て同様である。）
【０１８３】
ステップＳ１５４において、スレッド番号は１ではないと判断された場合、ステップＳ１５７において、スレッド制御部１３１は、対応するスレッド（スレッド１３２−２乃至スレッド１３２−Ｎのうちのいずれか）のカウンタ１６６の値を、ｔｈｒｅａｄ＿ｌｅｎ−ｂｌｏｃｋ＿ｓｈｉｆｔ×（スレッド番号−１）に設定する。
【０１８４】
ステップＳ１５８において、スレッド制御部１３１は、「待機中」状態に状態を遷移させるための状態遷移コマンドを発行する。
【０１８５】
ステップＳ１５６、または、ステップＳ１５８の処理の終了後、ステップＳ１５９において、スレッド制御部１３１は、スレッド内のまだ初期化されていない情報、すなわち、状態格納部１６５（図１４参照）に格納された状態を示す情報、および、カウンタ１６６のカウンタ値以外の情報を初期化する。具体的には、例えば、スレッド制御部１３１は、学習終了フラグ１６８（図１４参照）をＯＦＦにセットし、観測信号の開始・終了タイミング保持部１６７、および、前処理用データ保持部１６９の値を初期化（例えば、０にセット）する。
【０１８６】
スレッド演算部１３２に確保された全てのスレッド、すなわち、スレッド１３２−１乃至スレッド１３２−Ｎが初期化された場合、ステップＳ１６０において、スレッドループが終了され、初期化は終了する。
【０１８７】
このような処理により、スレッド制御部１３１は、スレッド演算部１３２に確保された複数のスレッドのすべてを初期化する。
【０１８８】
なお、図１９のステップＳ１５４〜Ｓ１５８の処理は、図２０のシーケンス図では最初の「初期化」処理と、その直後の状態遷移コマンド送信に該当する。なお、図２０は、スレッド制御部１３１による複数の学習スレッド１，２に対する制御シーケンスを示している。各スレッドは、待機、蓄積、学習という処理を繰り返し実行する。スレッド制御部は観測信号を各スレッドに提供して、各スレッドが観測データを蓄積した後、学習処理を行い、分離行列を生成してスレッド制御部に提供する。
【０１８９】
（３−３．スレッド制御処理について（Ｓ１０５））
次に、図２１に示すフローチャートを参照して、図１７のフローチャート中のステップＳ１０５の処理、すなわち、スレッド制御部１３１によって実行されるスレッド制御処理について説明する。
【０１９０】
なお、このフローチャートは、スレッド制御部１３１から見たものであり、学習スレッド１３２−１〜Ｎから見たものではないことに注意されたい。例えば「学習中処理」とは、学習スレッドの状態が「学習中」であるときにスレッド制御部１３１が行なう処理のことである。（学習スレッド自体の処理については、図２９を参照されたい。）
【０１９１】
ステップＳ２０１〜Ｓ２０６は学習スレッドについてのループであり、図２１に示すフローのステップＳ１５２で生成された個数だけループを回す（並列処理でも構わない）。ステップＳ２０２において、学習スレッドの現在の状態を状態保持部１６５（図１４参照）から読み込み、その値によってそれぞれ「待機中処理」・「蓄積中処理」・「学習中処理」を実行する。それぞれの処理の詳細は後述する。
【０１９２】
フローの各ステップについて説明する。ステップＳ２０１において、スレッド制御部１３１は、スレッドループを開始し、制御実行するスレッドのスレッド番号を示す変数ｓをｓ＝１として、１つのスレッドの処理が終了すると変数ｓを１インクリメントして、ｓ＝Ｎとなるまで、ステップＳ２０２乃至ステップＳ２０７のスレッドループの処理を繰り返し実行する。
【０１９３】
ステップＳ２０２において、スレッド制御部１３１は、変数ｓで示されるスレッド番号のスレッドの状態格納部１６５に保持されている、そのスレッドの内部状態を示す情報を取得する。変数ｓで示されるスレッド番号のスレッドの状態として、「待機中」状態であると検出された場合、ステップＳ２０３において、スレッド制御部１３１は、図２２のフローチャートを用いて後述する待機中状態における処理を実行し、処理は、後述するステップＳ２０６に進む。
【０１９４】
ステップＳ２０２において、変数ｓで示されるスレッド番号のスレッドの状態が「蓄積中」状態であると検出された場合、ステップＳ２０４において、スレッド制御部１３１は、図２３のフローチャートを用いて後述する蓄積中状態における処理を実行し、処理は、後述するステップＳ２０６に進む。
【０１９５】
ステップＳ２０２において、変数ｓで示されるスレッド番号のスレッドの状態が「学習中」状態であると検出された場合、ステップＳ２０５において、スレッド制御部１３１は、図２４のフローチャートを用いて後述する学習中状態における処理を実行する。
【０１９６】
ステップＳ２０３、ステップＳ２０４、または、ステップＳ２０５の処理の終了後、ステップＳ２０６において、スレッド制御部１３１は、変数ｓを１インクリメントする。そして、制御実行するスレッドのスレッド番号を示す変数ｓが、ｓ＝ｉとなったとき、スレッドループを終了する。
【０１９７】
ステップＳ２０７において、スレッド制御部１３１は、現フレーム番号保持カウンタ１５１（図１３参照）に保持されているフレーム番号を１インクリメントし、スレッド制御処理を終了する。
【０１９８】
このような処理により、スレッド制御部１３１は、複数のスレッドの全てを、それらの状態に応じて制御することができる。
【０１９９】
なお、ここでは、立ち上げられたスレッドの数ｉだけ、スレッドループが繰り返されるものとして説明したが、スレッドループを繰り返す代わりに、スレッドの個数ｉの並列処理を実行するものとしてもよい。
【０２００】
次に、図２２のフローチャートを参照して、図２１に示すフローチャートにおけるステップＳ２０３において実行される、待機中状態における処理について説明する。
【０２０１】
この待機中状態における処理は、図２１を用いて説明したスレッド制御処理における変数ｓに対応するスレッドの状態が「待機中」状態であるときに、スレッド制御部１３１において実行される処理である。
【０２０２】
ステップＳ２１１において、スレッド制御部１３１は、対応するスレッド１３２のカウンタ１６６（図１４参照）を、１インクリメントする。
【０２０３】
ステップＳ２１２において、スレッド制御部１３１は、対応するスレッド１３２のカウンタ１６６の値は、スレッド長（ｔｈｒｅａｄ＿ｌｅｎ）より小さいか否かを判断する。ステップＳ２１２において、カウンタ１６６の値は、スレッド長より小さいと判断された場合、待機中処理を終了し、図２１のステップＳ２０６に進む。
【０２０４】
ステップＳ２１２において、カウンタ１６６の値がスレッド長より小さくないと判断された場合、ステップＳ２１３において、スレッド制御部１３１は、「蓄積中」状態に状態を遷移させるための状態遷移コマンドを、対応するスレッド１３２に発行する。
【０２０５】
すなわち、スレッド制御部１３１は、図１６を用いて説明した状態遷移図において、「待機中」であるスレッドを、「蓄積中」に遷移させるための状態遷移コマンドを発行する。
【０２０６】
ステップＳ２１４において、スレッド制御部１３１は、対応するスレッド１３２のカウンタ１６６（図１４参照）を初期化（例えば、０にセット）し、観測信号の開始・終了タイミング保持部１６７（図１４参照）に、観測信号の蓄積開始タイミング情報、すなわち、スレッド制御部１３１の現フレーム番号保持カウンタ１５１（図１３参照）に保持されている現在のフレーム番号、または、それと同等の相対時刻情報などを設定して、待機中処理を終了し、図２１のステップＳ２０６に進む。
【０２０７】
このような処理により、スレッド制御部１３１は、「待機中」状態であるスレッドを制御し、そのカウンタ１６６の値に基づいて、「蓄積中」に状態を遷移させることができる。
【０２０８】
次に、図２３のフローチャートを参照して、図２１に示すフローチャートのステップＳ２０４において実行される蓄積中状態における処理について説明する。
【０２０９】
この蓄積中状態における処理は、図２１を用いて説明したスレッド制御処理における変数ｓに対応するスレッドの状態が「蓄積中」状態であるときに、スレッド制御部１３１において実行される処理である。
【０２１０】
ステップＳ２２１において、スレッド制御部１３１は、１フレーム分の観測信号Ｘ（ｔ）を、学習のために、対応するスレッド１３２に供給する。この処理は、図２０に示すスレッド制御部からそれぞれのスレッドへの観測信号の供給に対応する。
【０２１１】
ステップＳ２２２において、スレッド制御部１３１は、対応するスレッド１３２のカウンタ１６６を、１インクリメントする。
【０２１２】
ステップＳ２２３において、スレッド制御部１３１は、対応するスレッド１３２のカウンタ１６６の値がブロック長（ｂｌｏｃｋ＿ｌｅｎ）より小さいか否か、換言すれば、対応するスレッドの観測信号バッファ１６１（図１４参照）が満杯であるか否かを判断する。ステップＳ２２３において、カウンタ１６６の値がブロック長より小さい、換言すれば、対応するスレッドの観測信号バッファ１６１が満杯ではないと判断された場合、蓄積中処理を終了し、図２１のステップＳ２０６に進む。
【０２１３】
ステップＳ２２３において、カウンタ１６６の値がブロック長より小さくない、換言すれば、対応するスレッドの観測信号バッファ１６１が満杯であると判断された場合、ステップＳ２２４において、スレッド制御部１３１は、「学習中」状態に状態を遷移させるための状態遷移コマンドを、対応するスレッド１３２に発行して、蓄積中処理を終了し、図２１のステップＳ２０６に進む。
【０２１４】
すなわち、スレッド制御部１３１は、図１６を用いて説明した状態遷移図において、「蓄積中」であるスレッドを、「学習中」に遷移させるための状態遷移コマンドを発行する。
【０２１５】
このような処理により、スレッド制御部１３１は、「蓄積中」状態であるスレッドに観測信号を供給してその蓄積を制御し、そのカウンタ１６６の値に基づいて、「蓄積中」から「学習中」に状態を遷移させることができる。
【０２１６】
次に、図２４のフローチャートを参照して、図２１に示すフローチャートのステップＳ２０５において実行される、学習中状態における処理について説明する。
【０２１７】
この学習中状態における処理は、図２１を用いて説明したスレッド制御処理における変数ｓに対応するスレッドの状態が「学習中」状態であるときに、スレッド制御部１３１において実行される処理である。
【０２１８】
ステップＳ２３１において、スレッド制御部１３１は、対応するスレッド１３２の学習終了フラグ１６８（図１４参照）がＯＮであるか否かを判断する。ステップＳ２３１において、学習フラグがＯＮであると判断された場合、処理は、後述するステップＳ２３７に進む。
【０２１９】
ステップＳ２３１において、学習フラグがＯＮではないと判断された場合、すなわち、対応するスレッドにおいて学習処理が実行中である場合、ステップＳ２３２に進み、時刻の比較処理を行う。「時刻の比較」とは、学習スレッド１３２内に記録されている、観測信号の開始時刻１６７（図１４参照）と、スレッド制御部１３１に保存されている、現在の分離行列に対応した蓄積開始時刻１５４（図１３参照）とを比較する処理である。スレッド１３２内に記録されている観測信号の開始時刻１６７（図１４参照）が、スレッド制御部１３１に保存されている現在の分離行列に対応した蓄積開始時刻１５４よりも前である場合は、以降の処理をスキップする。
【０２２０】
一方、スレッド１３２内に記録されている観測信号の開始時刻１６７（図１４参照）が、スレッド制御部１３１に保存されている現在の分離行列に対応した蓄積開始時刻１５４よりも後または同じである場合は、ステップＳ２３３に進む。ステップＳ２３３において、スレッド制御部１３１は、対応するスレッド１３２のカウンタ１６６を、１インクリメントする。
【０２２１】
次にステップＳ２３４において、スレッド制御部１３１は、対応するスレッド１３２のカウンタ１６６の値がスレッド長（ｔｈｒｅａｄ＿ｌｅｎ）より小さいか否かを判断する。ステップＳ２３４において、カウンタ１６６の値がスレッド長より小さいと判断された場合、学習中処理を終了し、図２１のステップＳ２０６に進む。
【０２２２】
ステップＳ２３４において、カウンタ１６６の値がスレッド長より小さくないと判断された場合、ステップＳ２３５において、スレッド制御部１３１は、カウンタ１６６の値から所定の値を減算し、学習中処理を終了し、図２１のステップＳ２０６に進む。
【０２２３】
学習中にカウンタの値がスレッド長に達した場合とは、学習にかかる時間が長くなってしまい、「待機中」状態の時間が存在しなくなった場合である。その場合、学習はまだ継続しており、観測信号バッファ１６１は利用されているため、次の蓄積を開始することができない。そこで、スレッド制御部１３１は、学習が終了するまで、次の蓄積の開始、すなわち、「蓄積中」状態へ状態を遷移させるための状態遷移コマンドの発行を延期する。そのため、スレッド制御部１３１は、カウンタ１６６の値から所定の値を減算する。減算する値は、例えば、１であっても良いが、それよりも大きな値でも良く、例えば、スレッド長の１０％などといった値であっても良い。
【０２２４】
なお、「蓄積中」状態への遷移の延期を行なうと、蓄積開始時刻がスレッド間で不等間隔となり、最悪の場合、複数のスレッドでほぼ同一の区間の観測信号を蓄積してしまう可能性もある。そうなると、いくつかのスレッドが無意味になるだけでなく、例えば、ＣＰＵが実行するＯＳのマルチスレッドの実装によっては、１つのＣＰＵで複数の学習が同時に動くことになって、更に学習時間が増大し、間隔が一層不均等になってしまう可能性がある。
【０２２５】
そのような事態を防ぐためには、他のスレッドの待機時間を調整して蓄積開始タイミングが再び等間隔になるように調整すればよい。この処理は、ステップＳ２４１において実行される。この待機時間の調整処理の詳細については後述する。
【０２２６】
ステップＳ２３１において、学習終了フラグがＯＮであると判断された場合の処理について説明する。これは、学習スレッド内の学習ループが終了する度に一回実行される処理である。ステップＳ２３１において、学習終了フラグがＯＮであり、対応するスレッドにおいて学習処理が終了したと判断した場合、ステップＳ２３７において、スレッド制御部１３１は、対応するスレッド１３２の学習終了フラグ１６８をＯＦＦにする。この処理は、この分岐が連続実行されるのを防ぐための操作である。
【０２２７】
その後、スレッド制御部１３１はスレッドの打ち切りフラグ１７０（図１４参照）がＯＮであるかＯＦＦであるかを確認し、ＯＮである場合は、ステップＳ２３９において分離行列等の更新処理を行い、ステップＳ２４１において待機時間の設定処理を行なう。一方、スレッドの打ち切りフラグ１７０（図１４参照）がＯＦＦである場合は、ステップＳ２３９の分離行列等の更新処理は省略し、ステップＳ２４１において待機時間の設定処理を行なう。ステップＳ２３９の分離行列等の更新処理と、ステップＳ２４１の待機時間の設定処理の詳細については後述する。
【０２２８】
このような処理により、スレッド制御部１３１は、対応するスレッドの学習終了フラグ１６８を参照して、「学習中」状態のスレッドの学習が終了したか否かを判断し、学習が終了した場合、分離行列Ｗを更新し、待機時間を設定するとともに、「学習中」状態から、「待機中」または「蓄積中」に状態を遷移させることができる。
【０２２９】
次に、図２５のフローチャートを参照して、図２４に示すフローチャートのステップＳ２３９において実行される分離行列等の更新処理について説明する。これは、学習で求まった分離行列と、全死角空間フィルタとパワー比を、他のモジュールに反映させる処理である。
【０２３０】
ステップＳ２５１において、スレッド制御部１３１は、スレッドの観測信号の開始・終了タイミング保持部１６７（図１４参照）に保持されている観測信号の開始タイミングと、観測信号の蓄積タイミング情報保持部１５４（図１３参照）に保持されている、現在の分離行列に対応した蓄積開始タイミングとを比較し、観測信号の開始タイミングが蓄積開始タイミングより早いか否かを判断する。
【０２３１】
すなわち、図５に示されるように、スレッド１の学習とスレッド２の学習とは、その一部で時間が重なっている。図５では、学習区間５７のほうが、学習区間５８より先に終了しているが、例えば、それぞれの学習にかかる時間によっては、学習区間５７よりも学習区間５８のほうが先に終了してしまう場合もあり得る。
【０２３２】
ここで、ステップＳ２５１の判断が実行されず、学習の終了が遅いものが最新の分離行列として扱われてしまった場合、スレッド２由来の分離行列Ｗ２が、より古いタイミングで取得された観測信号によって学習されて得られたスレッド１由来の分離行列Ｗ１に上書きされてしまう。そこで、新しいタイミングで取得された観測信号によって得られた分離行列が最新の分離行列として扱われるように、観測信号の開始・終了タイミング保持部１６７に保持されている観測信号の開始タイミングと、観測信号の蓄積タイミング情報保持部１５４に保持されている現在の分離行列に対応した蓄積開始タイミングとが比較される。
【０２３３】
ステップＳ２５１において、観測信号の開始タイミングが現在の分離行列に対応した蓄積開始タイミングよりも早いと判断された場合、換言すれば、このスレッドの学習の結果得られた分離行列Ｗは、現在、観測信号の蓄積タイミング情報保持部１５４に保持されている分離行列Ｗよりも早いタイミングで観測された信号に基づいて学習されていると判断された場合、このスレッドの学習の結果得られた分離行列Ｗは利用されないので、分離行列更新処理は終了する。
【０２３４】
ステップＳ２５１において、観測信号の開始タイミングが現在の分離行列に対応した蓄積開始タイミングよりも早くないと判断された場合、すなわち、このスレッドの学習の結果得られた分離行列Ｗは、現在、観測信号の蓄積タイミング情報保持部１５４に保持されている分離行Ｗよりも遅いタイミングで観測された信号に基づいて学習されていると判断された場合、ステップＳ２５２において、スレッド制御部１３１は、対応するスレッドの学習によって得られた分離行列Ｗを取得し、分離行列保持部１３３（図１２参照）に供給して設定する。同様に同様に最新の全死角空間フィルタを全死角空間フィルタ保持部１３４に設定し、分離行列適用結果のパワー比をパワー比保持部１３５に設定する。
【０２３５】
ステップＳ２５３において、スレッド制御部１３１は、学習初期値保持部１５２に保持されるそれぞれのスレッドにおける学習の初期値を設定する。
【０２３６】
具体的には、スレッド制御部１３１は、学習初期値として、対応するスレッドの学習によって得られた分離行列Ｗを設定するものとしてもよいし、対応するスレッドの学習によって得られた分離行列Ｗを用いて演算される、分離行列Ｗとは異なる値を設定するものとしても良い。例えば、分離行列保持部１３３（図１２参照）にはリスケーリング適用後の値を代入し、学習初期値保持部１５２にはリスケーリング適用前の値を代入するようにする処理としてもよい。それ以外の例については、変形例で説明する。なお、学習初期値の計算は、「分離行列の更新処理」において行なう他に、学習の前処理として行なうことも可能である。詳細は変形例を参照されたい。
【０２３７】
ステップＳ２５４において、スレッド制御部１３１は、対応するスレッドの観測信号の開始・終了タイミング保持部１６７（図１４参照）に保持されているタイミング情報を、観測信号の蓄積タイミング情報保持部１５４（図１３参照）に設定する。これらの処理によって、分離行列等更新処理を終了する。
【０２３８】
ステップＳ２５４の処理により、現在使用中、すなわち、分離行列保持部１３３に保持されている分離行列Ｗが、どの時間区間の観測信号から学習されたものであるかが示される。
【０２３９】
次に、図２６のフローチャートを参照して、図２４に示すフローチャートのステップＳ２４１において実行される待機時間の設定処理について説明する。
【０２４０】
ステップＳ２８１において、スレッド制御部１３１は、残りの待機時間を計算する。
【０２４１】
具体的には、スレッド制御部１３１は、残り待機時間（フレーム個数）をｒｅｓｔ、蓄積開始予定タイミング指定情報保持部１５３（図１３参照）に保持されている蓄積開始予定タイミング（フレーム番号、または、対応する相対時刻）をＣｔ、現フレーム番号保持カウンタ１５１に保持されている現フレーム番号をＦｔ、ブロックのシフト幅をｂｌｏｃｋ＿ｓｈｉｆｔとして、残り待機時間ｒｅｓｔを、
ｒｅｓｔ＝Ｃｔ＋ｂｌｏｃｋ＿ｓｈｉｆｔ−Ｆｔ
として算出する。すなわち、Ｃｔ＋ｂｌｏｃｋ＿ｓｈｉｆｔが、次々回蓄積開始予定時刻を意味するため、そこからＦｔを引くことで、「次々回蓄積開始予定時刻までの残り時間」が求まるのである。
【０２４２】
ステップＳ２８２において、スレッド制御部１３１は、残りの待機時間ｒｅｓｔの計算結果は正の値であるか否かを判断する。ステップＳ２８２において、残りの待機時間ｒｅｓｔの計算結果は正の値ではない、すなわち、ゼロまたは負の値であると判断された場合、処理は、後述するステップＳ２８６に進む。
【０２４３】
ステップＳ２８２において、残りの待機時間ｒｅｓｔの計算結果は正の値であると判断された場合、ステップＳ２８３において、スレッド制御部１３１は、「待機中」状態に状態を遷移させるための状態遷移コマンドを、対応するスレッドに発行する。
【０２４４】
ステップＳ２８４において、スレッド制御部１３１は、対応するスレッドのカウンタ１６６（図１４参照）の値を、ｔｈｒｅａｄ＿ｌｅｎ−ｒｅｓｔに設定する。そうすることで、カウンタの値が、ｔｈｒｅａｄ＿ｌｅｎに達するまでの間は、「待機中」状態が継続される。
【０２４５】
ステップＳ２８５において、スレッド制御部１３１は、蓄積開始予定タイミング指定情報保持部１５３（図１３参照）に保持されている値Ｃｔに、ｂｌｏｃｋ＿ｓｈｉｆｔの値を加算する、すなわち、蓄積開始予定タイミング指定情報保持部１５３に次回の蓄積開始タイミングである、Ｃｔ＋ｂｌｏｃｋ＿ｓｈｉｆｔの値を設定し、残り待機時間の計算処理を終了する。
【０２４６】
ステップＳ２８２において、残りの待機時間ｒｅｓｔの計算結果は正の値ではない、すなわち、ゼロまたは負の値であると判断された場合、予定された蓄積開始タイミングを過ぎているのにもかかわらず蓄積が始まっていないことを意味するので、直ちに蓄積を開始する必要がある。そこで、ステップＳ２８６において、スレッド制御部１３１は、「蓄積中」状態に状態を遷移させるための状態遷移コマンドを、対応するスレッドに発行する。
【０２４７】
ステップＳ２８７において、スレッド制御部１３１は、カウンタの値を初期化（例えば０をセット）する。
【０２４８】
ステップＳ２８８において、スレッド制御部１３１は、蓄積開始予定タイミング指定情報保持部１５３に次回の蓄積開始タイミング、すなわち、現フレーム番号であるＦｔを設定し、残り待機時間の計算処理を終了する。
【０２４９】
このような処理により、それぞれのスレッドにおける「学習中」状態にかかる時間に応じて、「待機中」状態とする時間を設定することができる。
【０２５０】
（３−４．分離処理について（Ｓ１０６））
次に、図１７に示すフローチャートのステップＳ１０６の処理である分離処理の詳細について、図２７に示すフローチャートを参照して説明する。
【０２５１】
図２７のフローに示すステップＳ３０１〜Ｓ３１０はループ処理であり、ループ内の処理を周波数ビンごとに行なう。なお、ループ処理の代わりに、並列処理として実行してもよい。
【０２５２】
ステップＳ３０２において、後述のリスケーリングで必要な共分散行列をあらかじめ計算しておく。これは、図１２に示す共分散行列計算部１２５に対応する処理である。リスケーリング処理は分離行列に対する処理であるステップＳ３０３と全死角空間フィルタに対する処理であるステップＳ３０５があるが、いずれも観測信号の共分散行列から計算可能である。そのため、ステップＳ３０２では観測信号の共分散行列を以下に示す式［４．３］を用いて計算する。
【０２５３】
【数４】
2011107602.tif 000007
【０２５４】
ただし、平均操作＜・＞ｔを行なう区間は、図８に示す現在時刻を含むブロック８７であり、現在のフレームを含んでいる。そのため、現在のフレーム番号をｔ、現在時刻を含むブロック区間８７の長さ（フレーム数）をＬとすると、式［４．４］の操作を毎フレーム行なうことで、観測信号の共分散行列は更新される。
【０２５５】
次に、ステップＳ３０３において分離行列のリスケーリングを行なう。このリスケーリングは先の［１．本発明の構成と処理の概要について］の欄において説明した「頻繁リスケーリング」のことであり、このリスケーリング処理の目的は突発音が出力される際の歪みを低減することである。リスケーリングの基本的な考え方は、分離結果を特定のマイクロホンへ射影することにあり、「特定のマイクロホンへ射影する」とは、例えば図１において、ｌ番目のマイクロホンで観測される信号を、それぞれの音源に由来する成分にスケールを保ったまま分解することである。
【０２５６】
リスケーリング処理は、観測信号からの切り出しデータ単位であるフレーム中、現在の観測信号を含むフレームを適用して行われる。前述したように分離処理部１２３の共分散行列計算部１２５は、フーリエ変換部１２４の生成する観測信号のフーリエ変換データを入力し、観測信号の共分散行列をフレーム毎に計算する。ここで求めた共分散行列が分離行列適用部１２６および全死角空間フィルタ適用部１２７の各々においてフレーム毎のリスケーリング処理を行なうために利用される。
【０２５７】
リスケーリング処理のために、上記の式［４．１］および式［４．２］によってリスケーリング用の行列Ｒ（ω）をいったん求め、その次に、リスケーリング用行列Ｒ（ω）のｌ行目（ｌ（小文字のエル）は射影先のマイクロホン番号）を要素とする対角行列を求める（式［４．６］の右辺の第１項）。その対角行列をリスケーリング前の分離行列Ｗ（ω）に乗じることで、リスケーリング済みの分離行列Ｗ'（ω）を得る（式［４．６］）。
【０２５８】
ステップＳ３０４では、リスケーリング後の分離行列Ｗ'（ω）を観測信号Ｘ（ω，ｔ）に乗じることで（式［４．７］）、分離行列適用結果Ｙ'（ω，ｔ）を得る。
Ｙ'（ω，ｔ）＝Ｗ'（ω）×Ｘ（ω，ｔ）
として、分離行列適用結果Ｙ'（ω，ｔ）を得る。
この処理は、観測信号Ｘ（ω，ｔ）に対するリスケーリング後の分離行列Ｗ'（ω）を適用した線形フィルタリング処理に相当する。
【０２５９】
ステップＳ３０３、Ｓ３０４の処理は、図８に示す処理例において、
現在時刻の観測信号Ｘ（ｔ）８２の取得と、
分離行列８３の適用処理、
これらの処理に対応する。
図８に示す分離行列８３は、学習データブロック８１から求められた分離行列である。先に説明したように、従来のリスケーリングは、学習データブロック８１の学習データを用いて行なわれていた。それに対して、本発明の処理では、ステップＳ３０３において、現在時刻を終端とする一定長のブロック、すなわち、図８に示す現在時刻を含むブロック８７を設定し、この現在時刻を含むブロック８７の区間の観測信号を用いてリスケーリングを行なう。この処理により突発音に対しても早い段階でスケールを合わせる（＝歪みを低減する）ことができる。
【０２６０】
さらに必要に応じて、式［４．８］および式［４．９］による再調整を行なう。これは、リスケーリング後の分離行列適用結果Ｙ'（ω，ｔ）の要素の総和が、射影先マイクロホンに対応した観測信号Ｘｌ（ω，ｔ）の絶対値を超えていないかチェックし、超えている場合にＹ'（ω，ｔ）の絶対値を小さくする処理である。式［４．１］で求めたリスケーリング係数は、大きな音が鳴り止んだ直後でも、その音が区間内（図８の８７）に残っている限り大きな値となる傾向があり、その結果、現在の観測信号が無音に近い音（背景音）であっても大きなスケールによって背景音が強調されてしまう場合がある。しかし、式［４．８］および式［４．９］による再調整を行なうことで、スケールが大きくなるのを防ぐことができる。
【０２６１】
次に、ステップＳ３０５において、全死角空間フィルタのリスケーリングを行なう。このリスケーリングの目的は、全死角空間フィルタの適用結果に含まれる突発音と、分離行列適用結果に含まれる突発音との間でスケールを合わせ、後述の周波数フィルタリングで突発音が相殺されるようにするためである。
【０２６２】
図１２に示す分離処理部１２３は、前述したフレーム単位の頻繁リスケーリングを行う。すなわち、観測信号からの切り出しデータ単位であるフレーム中、現在の観測信号を含むフレームを適用したスケール調整としてのリスケーリング処理を実行した分離行列と、同様にリスケーリング処理を実行した全死角空間フィルタとを、ステップＳ３０３とステップＳ３０５において生成する。ステップＳ３０４では、リスケーリング処理後の分離行列を適用し、ステップＳ３０６では、リスケーリング後の全死角空間フィルタを適用した処理を行う。
【０２６３】
例えば図８に示す構成において、全死角空間フィルタ８４は、学習データのブロック８１の区間において鳴っている全ての音源の方向に死角を形成したフィルタ（ベクトルまたは行列）であり、これは突発音、すなわち、学習データのブロック８１では鳴っていなかった方向の音のみを透過する働きをする。なぜなら、学習データのブロック８１で鳴っていた音については、位置を変えずに鳴り続けている限り、フィルタが形成する死角によって除去されるのに対し、突発音については、その方向に死角が形成されておらず、素通ししてしまうからである。
【０２６４】
ステップＳ３０５において、全死角空間フィルタのリスケーリング処理では、以下に示す式［７．１］および式［７．２］によってリスケーリング用の行列Ｑ（ω）を求める。（式［７．１］のＹ'（ω，ｔ）は、式［４．９］の再調整を適用する前の値である。）
【０２６５】
【数５】
2011107602.tif 000008
【０２６６】
ただし、式［７．２］のＢ（ω）はリスケーリング前の全死角空間フィルタであり、ｎ個の入力から１個の出力を生成するフィルタである（Ｂ（ω）の計算方法は後述する）。また、式［７．１］のＺ（ω，ｔ）は、リスケーリング前の全死角空間フィルタ適用結果であり、以下に示す式［５．５］で計算される。
【０２６７】
【数６】
2011107602.tif 000009
【０２６８】
なお、Ｚ（ω，ｔ）はベクトルではなく、スカラーである。また、Ｑ（ω）はｎ個の要素からなる行ベクトル（横長のベクトル）である。Ｑ（ω）にＢ（ω）を乗じることで（式［７．３］）、リスケーリング済みの全死角空間フィルタＢ'（ω）を得る。Ｂ'（ω）はｎ行ｎ列の行列である。
【０２６９】
ステップＳ３０６では、リスケーリング済みの全死角空間フィルタＢ'（ω）に観測信号を乗じることで（式［７．４］）、リスケーリング済みの全死角空間フィルタ適用結果Ｚ'（ω，ｔ）を得る。ただし、式［７．４］のμｋ（ω）は、式［４．８］で求めた値であり、Ｙ'（ω，ｔ）を再調整した場合にＺ'（ω，ｔ）も再調整するためである。
【０２７０】
全死角空間フィルタ適用結果Ｚ'（ω，ｔ）はｎ個の要素からなる列ベクトル（縦長のベクトル）であり、ｋ番目の要素はＹ'ｋ（ω，ｔ）にスケールを合わせた全死角空間フィルタ適用結果である。
【０２７１】
ステップＳ３０５、Ｓ３０６は、図８の処理例を参照して説明すると、
現在時刻の観測信号Ｘ（ｔ）８２の取得、
リスケーリング済みの全死角空間フィルタＢ'（ω）８４の生成、
リスケーリング済みの全死角空間フィルタＢ'（ω）に観測信号を乗じることで（式［７．４］）、リスケーリング済みの全死角空間フィルタ適用結果Ｚ'（ω，ｔ）を得る処理に対応する。
【０２７２】
次のステップＳ３０７〜Ｓ３１０はループであり、ステップＳ３０８の周波数フィルタリングをチャンネルごとに行なうことを意味する。なお、ループの代わりに並列処理として実行してもよい。
【０２７３】
ステップＳ３０８の周波数フィルタリングは、リスケーリング済み分離行列適用結果Ｙ'ｋ（ω，ｔ）（ベクトルＹ'（ω，ｔ）のｋ番目の要素）に対して、周波数ごとに異なる係数を乗じる処理であるが、本発明ではリスケーリング済み分離行列適用結果Ｙ'ｋ（ω，ｔ）からリスケーリング済み全死角空間フィルタ適用結果（突発音にほぼ等しい）を除去するために用いる。
【０２７４】
周波数フィルタリングの例として、以下の３点について説明する。
（１）複素数上の引き算
（２）スペクトル減算
（３）ウィナーフィルタ
【０２７５】
まず、（１）複素数上の引き算による周波数フィルタリングについて説明する。この処理は、分離行列を適用して生成した分離信号から全死角空間フィルタ適用信号を減算する処理により、分離信号に含まれる全死角空間フィルタ適用信号に対応する信号成分を除去するフィルタリング処理である。
以下に示す式［８．１］は、複素数上の減算を表わす式である。
【０２７６】
【数７】
2011107602.tif 000010
【０２７７】
上記式［８．１］において、係数αｋは０以上の実数であり、この係数によって、先に、［１．本発明の構成と処理の概要について］の欄において説明した「（３）チャンネル別の判別」を実現する。
すなわち、突発音の性質によって異なる対処をするため、ＩＣＡの各出力チャンネルが音源に対応した信号を出力しているかどうか判別し、その結果に応じて以下のどちらかの処理をする。
ｉ）音源に対応していると判別された場合は、「頻繁リスケーリング」と「全死角空間フィルタ＆周波数フィルタリング」との両方を適用する。
その結果、突発音はそのチャンネルからは除去される。
ｉｉ）音源に対応していないと判別された場合は、「頻繁リスケーリング」のみを適用する。その結果、突発音はそのチャンネルから出力される。
これを「チャンネル別の判別」と呼ぶ。
【０２７８】
このように、突発音発生前に各チャンネルが音源に対応した信号を出力しているかに応じて、突発音の削減量を調整する。
【０２７９】
各チャンネルの出力が音源に対しているか否かを判別する方法は各種存在するが、以下の説明で用いているのは、分離行列適用結果のパワーを用いる方法である。すなわち、音源に対応しているチャンネルは比較的パワーが大きく、音源に対応していないチャンネルは比較的パワーが小さいという性質を利用する。
【０２８０】
上記式［８．１］に示される係数αｋは、式［８．５］によって計算する。この式において、ｒｋはチャンネルｋのパワー比、αはαｋの最大値である。パワー比は、全体の観測された音の全パワー、あるいは最大の音に対する各チャンネル（ｋ）のパワーの比率である。パワー比ｒｋはチャンネルｋのパワー（音量）をＶｋとして、式［８．６］または式［８．７］を適用して算出する。これらの式の詳細については後述する。
【０２８１】
ｆ（）は０以上１以下を返値とする関数であり、式［８．１０］および図２８に示すグラフで表される関数である。この関数の目的は、パワー比ｒｋによって引き算の有無が急激に切り替わるのを防ぐためである。（逆に、ｒｍｉｎ＝ｒｍａｘとすると、パワー比が閾値を跨いだ時点で、引き算の有無が急激に変化する。）
式［８．１０］のｆｍｉｎは、０または小さな正の値である。ｆｍｉｎを０以外の値に設定する効果については、後で説明する。
【０２８２】
ステップＳ３０８の周波数フィルタリングは、図１２に示す周波数フィルタリング部１２８として実行される。周波数フィルタリング部１２８は、分離信号からの全死角空間フィルタ適用信号対応成分の除去レベルを分離信号チャネルに応じて変更する処理を行う。具体的には、分離信号チャネルのパワー比に応じて除去レベルを変更する。
【０２８３】
パワー比ｒｋは式［８．６］〜［８．９］で計算するが、式［８．８］および［８．９］に含まれる平均操作＜・＞ｔは分離行列の学習で使用された観測信号と同じ区間で行なう。すなわち、図８に示す処理例における現在時刻を含むブロック８７ではなく、学習データのブロック８１の区間である。これらの式では最新フレームのデータは用いていないため、αｋおよびｒｋの計算は毎フレーム行なう必要はなく、分離行列の学習が終了したタイミングで行えばよい。そこで、ｒｋの具体的な計算方法については、図３１に示す分離行列学習のフローチャートのステップＳ４２０の後処理の詳細について説明した図３２のフローを参照して後段で説明する。
【０２８４】
複素数上の引き算（式［８．１］）でも突発音は除去可能となる。しかし、線形フィルタリングの一種であるため、「従来技術の問題点」で述べた「追従遅れと消し残りとのトレードオフ」という課題は解消できない。一方、以下で述べる非線形な周波数フィルタリングを用いると、そのトレードオフも解消することが可能となる。
【０２８５】
上記した式［８．２］は、周波数フィルタリングの一般式である。すなわち、リスケーリング済みの分離行列適用結果Ｙ'ｋ（ω，ｔ）を絶対値で正規化した項、
Ｙ'ｋ（ω，ｔ）／｜Ｙ'ｋ（ω，ｔ）｜
に対して、ゲインＧｋ（ω，ｔ）を乗じる。周波数フィルタリングの手法によってゲインの計算方法は様々であるが、以下で説明するスペクトル減算法（ｓｐｅｃｔｒａｌ  ｓｕｂｔｒａｃｔｉｏｎ）では、スペクトル振幅の差分から求める。
【０２８６】
（２）スペクトル減算による周波数フィルタリングについて説明する。
スペクトル減算による周波数フィルタリング処理は、全死角空間フィルタ適用信号を雑音成分としたスペクトル減算による周波数フィルタリング処理により、分離行列を適用して生成した分離信号に含まれる全死角空間フィルタ適用信号に対応する信号成分を除去するフィルタリング処理である。
【０２８７】
スペクトル減算法の式は、上記の式［８．３］および式［８．４］に示される通りである。式［８．３］は振幅そのものの減算であり、Ｍａｇｎｉｔｕｄｅ  Ｓｐｅｃｔｒａｌ  Ｓｕｂｔｒａｃｔｉｏｎ  と呼ばれる。式［８．４］は振幅の２乗の減算であり、Ｐｏｗｅｒ  Ｓｐｅｃｔｒａｌ  Ｓｕｂｔｒａｃｔｉｏｎと呼ばれる。両式において、ｍａｘ｛Ａ，Ｂ｝は２つの引数の内で大きい方を返り値とする操作を表わす。αｋは、一般的にはｏｖｅｒ−ｓｕｂｔｒａｃｔｉｏｎ  ｆａｃｔｏｒ  と呼ばれる項であるが、本発明では式［８．５］の演算をすることで、「音源に対応した信号が出力されているか」に応じて減算量を調整する働きもしている。βはｆｌｏｏｒｉｎｇ  ｆａｃｔｏｒと呼ばれ、０に近い小さな値（例えば０．０１）である。ｍａｘ｛｝の第２項によって、減算後のゲインが０や負の値になるのを防ぐ。
【０２８８】
αｋの計算は、複素数上の引き算の場合と同様に、式［８．５］〜［８．１０］に従って行なう。なお、式［８．１０］において、ｆｍｉｎを０の代わりに正の小さな値とすると、
ｒｋ＜ｒ＿ｍｉｎ
の場合にも周波数フィルタリングが小さく作用するため、「消し残り」をある程度除去することができる。
【０２８９】
（３）ウィナーフィルタによる周波数フィルタリングについて説明する。
ウィナーフィルタとは、目的音と妨害音とのパワーの比である事前ＳＮＲ（ｐｒｉｏｒｉ  ＳＮＲ）に基づいて係数Ｇｋ（ω，ｔ）を計算する方式である。事前ＳＮＲが既知であれば、ウィナーフィルタによって求まる係数は、妨害音の除去性能が二乗誤差最小の意味で最適であることが知られている。ウィナーフィルタの詳細については、例えば以下を参照されたい。
特許出願  ２００７−５３３３３１［Ｈ１８．８．３１］
特再ＷＯ０７／０２６８２７  ［Ｈ２１．  ３．１２］
［発明の名称］  マイクロホンアレイ用ポストフイルタ
［出願人］  北陸先端科学技術大学院大学，トヨタ自動車（株）
［発明者］  赤木  正人，李  軍鋒，上地  正昭，佐々木  和也
【０２９０】
ウィナーフィルタに基づいて係数を計算するためには事前ＳＮＲの値が必要だが、一般にその値は未知である。そこで、事前ＳＮＲの代わりに、観測信号と妨害音とのパワー比である事後ＳＮＲ（ｐｏｓｔｅｒｉｏｒｉ  ＳＮＲ）と、直前のフレームでの処理結果を目的音とみなした１フレーム分の事前ＳＮＲとから、事前ＳＮＲをフレームごとに推定する方法が提案されており、それをＤｅｃｉｓｉｏｎ  Ｄｉｒｅｃｔｅｄ  （ＤＤ）法と呼ぶ。ＤＤ法を用いて突発音を除去する方法について、式［８．１２］〜式［８．１４］を用いて説明する。（これらの式において、上付きの［ｐｏｓｔ］と［ｐｒｉｏｒ］は、それぞれ「事後」「事前」を区別するためのものである。）
【０２９１】
式［８．１２］は、１フレーム分の事後ＳＮＲを求める式である。この式においてαｋ
は式［８．５］などから求める。ただし、ウィナーフィルタにおいては、ｏｖｅｒ−ｓｕｂｔｒａｃｔｉｏｎを行なう必要はないため、α＝１でよい。あるいは、α＜１とすることで、突発音の除去効果を小さくすることもできる。次に、式［８．１３］を用いて、事前ＳＮＲの推定値を求める。この式のκは忘却係数であり、１未満かつ１に近い値を用いる。
事前ＳＮＲの推定値から、式［８．１４］を用いて周波数フィルタリングの係数Ｇｋ（ω，ｔ）を計算する。
【０２９２】
周波数フィルタリングの方法として、上記では、
（１）複素数上の引き算
（２）スペクトル減算
（３）ウィナーフィルタ
これらについて説明したが、これらの方法以外にも、以下の方法も適用可能である。
（４）  Ｍｉｎｉｍｕｍ  Ｍｅａｎ  Ｓｑｕａｒｅ  Ｅｒｒｏｒ  （ＭＭＳＥ）  Ｓｈｏｒｔ  Ｔｉｍｅ  Ｓｐｅｃｔｒａｌ  Ａｍｐｌｉｔｕｄｅ  （ＳＴＳＡ）、または  ＭＭＳＥ  Ｌｏｇ  Ｓｐｅｃｔｒａｌ  Ａｍｐｌｉｔｕｄｅ  （ＬＳＡ）
【０２９３】
なお、これらの詳細については以下を参照されたい。
＊『独立成分分析を用いた雑音推定に基づくＭＭＳＥ  ＳＴＳＡ』
岡本  亮維，  高橋  祐，猿渡  洋，鹿野  清宏，
日本音響学会講演論文集，２−９−６，ｐｐ．６６３−−６６６，Ｍａｒｃｈ  ２００９．
"ＭＭＳＥ  ＳＴＳＡ  ｗｉｔｈ  Ｎｏｉｓｅ  Ｅｓｔｉｍａｔｉｏｎ  Ｂａｓｅｄ  ｏｎ  Ｉｎｄｅｐｅｎｄｅｎｔ  Ｃｏｍｐｏｎｅｎｔ  Ａｎａｌｙｓｉｓ"
Ｒｙｏ  ＯＫＡＭＯＴＯ，  Ｙｕ  ＴＡＫＡＨＡＳＨＩ，  Ｈｉｒｏｓｈｉ  ＳＡＲＵＷＡＴＡＲＩ  ａｎｄ  Ｋｉｙｏｈｉｒｏ  ＳＨＩＫＡＮＯ
＊登録特許４１７２５３０号公報  雑音抑圧の方法及び装置並びにコンピユ−タプログラム
＊"Ｄｉｆｆｕｓｅ  ｎｏｉｓｅ  ｓｕｐｐｒｅｓｓｉｏｎ  ｂｙ  ｃｒｙｓｔａｌ−ａｒｒａｙ−ｂａｓｅｄ  ｐｏｓｔ−Ｆｉｌｔｅｒ  ｄｅｓｉｇｎ"
Ｎｏｂｕｔａｋａ  ＩＴＯ，  Ｎｏｂｕｔａｋａ  ＯＮＯ，  ａｎｄ  Ｓｈｉｇｅｋｉ  ＳＡＧＡＹＡＭＡ
【０２９４】
図２７に示すフローチャートに従った分離処理により、従来法の分離結果よりも精度の高い分離結果であるＵ１（ω，ｔ）〜Ｕｎ（ω，ｔ）が生成されるようになる。
【０２９５】
［４．スレッド演算部における学習スレッドの処理について］
図１２に示すスレッド制御部１３１と、各学習スレッド１３２−１〜Ｎを適用したスレッド演算部１３２の処理は並列で動作しており、学習スレッドはスレッド制御部とは別のフローに基づいて動いている。以降では、スレッド演算部における学習スレッドの処理について、図２９に示すフローチャートを用いて説明する。
【０２９６】
スレッド演算部１３２は、起動後、ステップＳ３９１において、初期設定される。起動のタイミングは、図１７の全体フローのステップＳ１０１の初期化処理の期間であり、図１９に示すフローのステップＳ１５２の学習スレッドの確保処理のタイミングとなる。
【０２９７】
スレッド演算部１３２において学習スレッドは、起動後、ステップＳ３９１において初期設定され、その後、イベントが発生するまで待機する（処理をブロックする）。（この「待機」は、学習スレッドの状態の１つである「待機中」とは別である。）イベントは、以下のどれかのアクションが行なわれたときに発生する。
・状態遷移コマンドが発行された。
・フレームデータが転送された。
・終了コマンドが発行された。
どのイベントが発生したかによって、以降の処理を分岐する（ステップＳ３９２）。
すなわち、スレッド制御部１３１から入力されたイベントによって、続く処理が分岐される。
【０２９８】
ステップＳ３９３において、状態遷移コマンドが入力されたと判断された場合、ステップＳ３９４において対応するコマンド処理が実行される。
【０２９９】
ステップＳ３９３において、フレームデータの転送イベントの入力を受けたと判断された場合、ステップＳ３９５において、スレッド１３２は、フレームデータを取得する。次に、ステップＳ３９６において、スレッド１３２は、取得したフレームデータを、観測信号バッファ１６１（図１４参照）に蓄積し、ステップＳ３９２に戻り、次イベントを待機する。
【０３００】
観測信号バッファ１６１（図１４参照）は、配列またはスタックの構造をしており、観測信号はカウンタと同じ番号の個所に格納されるものとする。
【０３０１】
ステップＳ３９３において、終了コマンドが入力されたと判断された場合、ステップＳ３９７において、スレッド１３２は、例えば、メモリの開放などの適切な終了前処理を実行し、処理が終了される。
【０３０２】
このような処理により、スレッド制御部１３１の制御に基づいて、それぞれのスレッドにおいて処理が実行される。
【０３０３】
次に、図３０のフローチャートを参照して、図２９に示すフローチャートのステップＳ３９４において実行される、コマンド処理について説明する。
【０３０４】
ステップＳ４０１において、スレッド１３２は、供給された状態遷移コマンドに応じて、それ以降の処理を分岐する。なお、以降では「○○の状態へ遷移する」というコマンドを「状態遷移コマンド『○○』」と表現する。
【０３０５】
ステップＳ４０１において、供給された状態遷移コマンドが、「待機中」状態への遷移を指令する「状態遷移コマンド『待機中』」である場合、ステップＳ４０２において、スレッド１３２は、状態格納部１６５（図１４参照）に、状態が「待機中」であることを示す情報を格納する、すなわち、状態を「待機中」に遷移して、コマンド処理を終了する。
【０３０６】
ステップＳ４０１において、供給された状態遷移コマンドが「蓄積中」状態への遷移を指令する「状態遷移コマンド『蓄積中』」である場合、ステップＳ４０３において、スレッド１３２は、状態格納部１６５に、状態が「蓄積中」であることを示す情報を格納する、すなわち、状態を「蓄積中」に遷移して、コマンド処理を終了する。
【０３０７】
ステップＳ４０１において、供給された状態遷移コマンドが「学習中」状態への遷移を指令する「状態遷移コマンド『学習中』」である場合、ステップＳ４０４において、スレッド１３２は、状態格納部１６５に、状態が「学習中」であることを示す情報を格納する、すなわち、状態を「学習中」に遷移する。
【０３０８】
さらに、ステップＳ４０５において分離行列の学習処理を実行する。この処理の詳細については後述する。
【０３０９】
ステップＳ４０６において、スレッド１３２は、学習が終了したことをスレッド制御部１３１へ通知するために、学習終了フラグ１６８をＯＮにして処理を終了する。フラグを立てることで、学習が終了した直後であることをスレッド制御部１３１へ通知するのである。
【０３１０】
このような処理により、スレッド制御部１３１から供給された状態遷移コマンドに基づいて、それぞれのスレッドの状態が遷移される。
【０３１１】
次に、図３１のフローチャートを参照して、図３０に示すフローチャートのステップＳ４０５において実行される処理の一例である分離行列の学習処理例について説明する。これは、バッチによって分離行列を求める処理であり、バッチ処理であればどのアルゴリズムも適用可能である。ただし、パーミュテーション（ｐｅｒｍｕｔａｔｉｏｎ）を起こしにくい方式を用いる必要がある。以下では、本出願人の先の出願である特開２００６−２３８４０９『音声信号分離装置・雑音除去装置および方法』に開示した構成を適用した例について説明する。
【０３１２】
ステップＳ４１１において、スレッド１３２の学習演算部１６３（図１４参照）は、観測信号バッファ１６１に蓄積された観測信号に対して、必要に応じて、前処理を実行する。
【０３１３】
具体的には、学習演算部１６３は、学習のループに入る前に、必要に応じて、観測信号バッファ１６１に蓄積された観測信号に対して、正規化（normalization）や無相関化（uncorrelation または ｐｒｅ−ｗｈｉｔｅｎｉｎｇ）などの処理を行なう。例えば、正規化を行なう場合、学習演算部１６３は、ブロック内のフレームについて観測信号の標準偏差を求め、標準偏差の逆数からなる対角行列をＳとして、以下に示す式［９．１］により、Ｘ'＝ＳＸを計算する。ただしＸは、ブロック内の全フレーム分の観測信号からなる行列であり、図８の学習データのブロック８１で表わされる区間である。
【０３１４】
【数８】
2011107602.tif 000011
【０３１５】
一方、無相関化は共分散行列が単位行列となるような変換である。無相関化の方法は何通りかあるが、ここでは共分散行列の固有値（Ｅｉｇｅｎｖａｌｕｅ）および固有ベクトル（Ｅｉｇｅｎｖｅｃｔｏｒ）を用いる方法を説明する。
【０３１６】
蓄積された観測信号（例えば図８の学習データのブロック８１）から、式［９．７］を用いて周波数ビンごとに共分散行列ΣＸＸ（ω）を計算する。次にこの行列に対して固有値展開を適用すると、ΣＸＸ（ω）は固有値λ１〜λｎおよび固有ベクトルｐ１〜ｐｎを用いて式［９．８］のように分解できる。ただし、固有ベクトルは単位ベクトルかつ互いに直交しているものとする。固有値および固有ベクトルから式［９．９］のような行列Ｐ（ω）を生成すると、Ｐ（ω）は無相関化の行列となっている。
【０３１７】
すなわち、Ｐ（ω）を観測信号Ｘ（ω，ｔ）に乗じたものをＸ'（ω，ｔ）とすると（式［９．１０］）、Ｘ'（ω，ｔ）の共分散行列は式［９．１１］の関係を満たしている。
【０３１８】
このような無相関化を前処理として行なうことにより、学習において収束までのループ回数を少なくすることができる。また、本発明では、固有ベクトルから全死角空間フィルタを生成することも可能になる。（詳細は後述する）
【０３１９】
以下の式に現われる観測信号Ｘは、前処理を行なった観測信号Ｘ'も表わし得るものとする。
次に、ステップＳ４１２において、学習演算部１６３は、分離行列の初期値として、スレッド制御部１３１から、スレッド制御部１３１の学習初期値保持部１５２に保持されている学習初期値Ｗを取得する。
【０３２０】
ステップＳ４１３〜Ｓ４１９の処理は、学習のループであり、これらの処理をＷが収束するか打ち切りフラグがＯＮになるまで繰り返す。打ち切りフラグは、先に説明した図２４の学習中処理のフローのステップＳ２３６においてＯＮに設定されるフラグである。後から開始した学習がそれより前に開始した学習よりも早く終了した場合にＯＮになるものである。ステップＳ４１３において、打ち切りフラグがＯＮであると判断した場合は、処理を終了する。
【０３２１】
ステップＳ４１３において、打ち切りフラグがＯＦＦであると判断した場合は、ステップＳ４１４に進む。ステップＳ４１４において、学習演算部１６３は、分離行列Ｗの値が収束したか否かを判断する。分離行列Ｗの値が収束したか否かは、例えば、行列のノルムを用いて判定する。分離行列Ｗのノルム（全要素の２乗和）である‖Ｗ‖と、ΔＷのノルムである‖Ｗ‖とをそれぞれ計算し、両者の比である‖ΔＷ‖／‖Ｗ‖が一定の値（例えば１／１０００）よりも小さければ、Ｗが収束したと判定する。または単純に、ループが一定数（例えば５０回）回ったかどうかで判定しても構わない。
【０３２２】
ステップＳ４１４において、分離行列Ｗの値が収束したと判断された場合、処理は、後述するステップＳ４２０に進み、後処理を実行して処理を終了する。すなわち、分離行列Ｗが収束するまで、学習処理ループが実行される。
【０３２３】
ステップＳ４１４において、分離行列Ｗの値が収束していないと判断された場合（またはループ回数が所定の値に達していない場合）、ステップＳ４１５〜Ｓ４１９の学習のループの中に進む。学習は、全ての周波数ビンにおいて、先に説明した式［３．１］〜式［３．３］を繰り返す処理として行なわれる。すなわち、分離行列Ｗを求めるために、式［３．１］から式［３．３］までを分離行列Ｗが収束するまで（または一定回数）繰り返し実行する。この繰り返し実行が「学習」である。なお、分離結果Ｙ（ｔ）は式［３．４］で表わされる。
【０３２４】
ステップＳ４１６が、式［３．１］に対応する。
ステップＳ４１７が、式［３．２］に対応する。
ステップＳ４１８が、式［３．３］に対応している。
【０３２５】
式［３．１］〜式［３．３］は周波数ビンごとの式であるため、ステップＳ４１５とステップＳ４１９で周波数ビンについてのループを回すことで、全周波数ビンのΔＷを求めている。
【０３２６】
なお、ＩＣＡのアルゴリズムとしては、式［３．２］以外も適用可能である。たとえば、前処理として無相関化を行なった場合は、正規直交制約（ｏｒｔｈｏｎｏｒｍａｌ  ｃｏｎｓｔｒａｉｎｔ）に基づく勾配法である以下に示す式［３．１３］〜［３．１５］を用いても良い。なお、式［３．１３］のＸ'（ω，ｔ）は、無相関化後の観測信号である。
【０３２７】
【数９】
2011107602.tif 000012
【０３２８】
これらのループ処理の終了後に、ステップＳ４１３に戻り打ち切りフラグの判定、ステップＳ４１４における分離行列の収束判定を行う。打ち切りフラグがＯＮであれば処理を終了する。ステップＳ４１４で分離行列の収束が確認された場合（あるいは規定ループ数に達した場合）は、ステップＳ４２０に進む。
【０３２９】
ステップＳ４２０の後処理の詳細について、図３２に示すフローチャートを参照して説明する。
ステップＳ４２０の後処理においては、以下の処理を実行する。
（１）分離行列を、正規化前の観測信号に対応させる。
（２）周波数ビンの間のバランスを調整する（リスケーリング）。
【０３３０】
まず、（１）分離行列を、正規化前の観測信号に対応させる処理について説明する。
前処理として正規化が行なわれた場合、上述した処理（図３１のステップＳ４１５〜Ｓ４１９）により求められる分離行列Ｗは、正規化前の観測信号Ｘを分離するためのものではなく、正規化後の観測信号Ｘ'を分離するためのものである。すなわち、ＷにＸを直接乗じても、それは分離された信号ではない。そこで、上述した処理により求められた分離行列Ｗ（ω）を補正して、正規化前の観測信号Ｘ（ω，ｔ）を分離するためのものへと変換する。
【０３３１】
具体的には、正規化の際に作用させた行列をＳ（ω）とすると、Ｗ（ω）を正規化前の観測信号に対応させるには、
Ｗ（ω）←Ｗ（ω）Ｓ（ω）
という補正を行なえばよい（式［９．１］）。
前処理として無相関化を行なった場合も同様に、
Ｗ（ω）←Ｗ（ω）Ｐ（ω）
という補正を行なう。（Ｐ（ω）は無相関化の行列）
【０３３２】
次に（２）周波数ビンの間のバランスを調整する（リスケーリング）処理について説明する。
ＩＣＡのアルゴリズムによっては、分離結果Ｙの周波数ビン間のバランス（スケール）が、予想される原信号のものと異なっている場合がある（特開２００６−２３８４０９『音声信号分離装置・雑音除去装置および方法』はそのような例である）。そのような場合、後処理で周波数ビンのスケールを補正する必要がある。スケールの補正のために、式［９．５］と式［９．６］から補正用の行列を計算する。式［９．５］のｌ（小文字のエル）は、射影先のマイクロホンの番号である。補正用の行列が求まったら、式［９．３］によって分離行列Ｗ（ω）を補正する。
【０３３３】
なお、
（１）分離行列を、正規化前の観測信号に対応させる。
（２）周波数ビンの間のバランスを調整する（リスケーリング）。
これらをまとめて、式［９．４］を適用して一気に補正しても構わない。こうしてリスケーリングされた分離行列は、図１２に示す分離行列保持部１３３に格納され、必要に応じて分離処理部１２３の実行する分離処理（表の処理）において参照される。
【０３３４】
次に、ステップＳ４５３の全死角空間フィルタの生成処理に進む。全死角空間フィルタの生成方法には以下の２通りが可能である。
（１）分離行列から生成
（２）観測信号共分散行列の固有ベクトルから生成
【０３３５】
まず、「（１）分離行列から全死角空間フィルタを生成する方法」
について説明する。
ステップＳ４５２においてリスケーリングされた分離行列をＷ（ω）、その行ベクトルをＷ１（ω）〜Ｗｎ（ω）とすると、全死角空間フィルタＢ（ω）は、先に示した式［５．１］で計算できる。ただし、ｌ（小文字のエル）は射影先のマイクロホン番号を表わす。ｅｌはｎ次元の行ベクトルであり、ｌ番目の要素のみが１、それ以外を０とした行列である。
【０３３６】
式［５．１］に従って求まった全死角空間フィルタＢ（ω）を観測信号Ｘ（ω）に乗じると、その結果Ｚ（ω，ｔ）は全死角空間フィルタ適用結果となる（式［５．４］）。
こうして計算した全死角空間フィルタＢ（ω）が全死角空間フィルタとして機能する理由は、式［５．３］で説明できる。
【０３３７】
この式［５．３］において、
Ｗｋ（ω）Ｘ（ω，ｔ）
は、分離行列適用結果のｋチャンネル目である。
分離行列は、先に図３２を参照して説明した分離処理フローのステップＳ４５２の分離行列のリスケーリング処理においてリスケーリングされているため、分離行列適用結果を全チャンネルで総和すると、射影先マイクロホンの観測信号であるＸｌ（ω，ｔ）とほぼ等しくなる。
【０３３８】
従って、式［５．３］の左辺は０に近い値になるはずである。また、式［５．３］の左辺は、式［５．１］の全死角空間フィルタＢ（ω）を用いて式［５．４］の右辺のように変形できる。すなわちＢ（ω）は、観測信号Ｘ（ω，ｔ）から０に近い信号を生成するフィルタ、すなわち全死角空間フィルタと見なすことができるのである。
【０３３９】
なお、分離行列の収束が不十分の場合、そのような分離行列から生成される全死角空間フィルタは、学習データの区間に含まれる音源もある程度は透過させる性質をもつ。例えば、先に図７を参照して説明した従来法では、時間ｔ２〜ｔ３の区間７５においては分離行列が収束しておらず、そのために突発音もある程度は出力されるが、その区間の分離行列から生成された全死角空間フィルタも、やはり突発音をある程度は透過する。それが図９における時間ｔ２〜ｔ３の区間９５である。しかし、図７に示す時間ｔ２〜ｔ３の区間７５と、図９に示す時間ｔ２〜ｔ３の区間９５において突発音が同様に透過しているため、周波数フィルタリングによって相殺される。すなわち、図９に示す（ｃ１）処理結果１において時間ｔ２〜ｔ３の区間９５に対応する区間でも突発音は消える。
【０３４０】
次に、「（２）観測信号共分散行列の固有ベクトルから全死角空間フィルタを生成する方法」について説明する。
【０３４１】
図３１を参照して説明した分離行列の学習処理におけるステップＳ４１１の「前処理」として無相関化を用いた場合、観測信号の共分散行列に対する固有値分解はすでに完了している。すなわち、以下に示す式［６．１］（式［９．８］と同一）のように、観測信号共分散行列Σｘｘ（ω）は、固有値λ１〜λｎと固有ベクトルｐ１〜ｐｎを用いて表される。
【０３４２】
【数１０】
2011107602.tif 000013
【０３４３】
ここで、固有値は全て０以上かつ降順に並んでいるとする。すなわち、
λ１≧λ２≧・・・≧λｎ≧０
を満たすとする。この場合、最小の固有値λｎに対応した固有ベクトルｐｎは、全死角空間フィルタの性質を持っている。従って、式［６．２］のように全死角空間フィルタＢ（ω）を設定すれば、以降は「（１）分離行列から生成」の場合と同様に全死角空間フィルタＢ（ω）を使用することができる。
【０３４４】
この方法は、ＩＣＡ以外でも、時間周波数領域で観測信号にベクトルや行列を乗じて音源分離を行なう方式と組み合わせることで、前述した「消し残り」を軽減することができる。
【０３４５】
こうして生成された全死角空間フィルタは、図１２に示す全死角空間フィルタ保持部１３４に格納され、必要に応じて、分離処理部１２３の実行する分離処理（表の処理）に際して参照される。
以上で、ステップＳ４５３の全死角空間フィルタの生成処理についての説明を終了する。
【０３４６】
次に、ステップＳ４５４の「パワー比を計算」する処理について説明する。パワー比は、例えば、先に図２７を参照して説明した分離処理におけるステップＳ３０８の「周波数フィルタリング」処理において参照されるが、パワー比の計算で用いる観測信号は学習データの区間（例えば図８に示す学習データのブロック８１）と同一であるため、パワー比の計算自体は学習終了時に一度行えば、次回に分離行列が更新されるまでの間はその値が有効である。
【０３４７】
パワー比を求める前に、まず前記した式［８．８］または式［８．９］を用いて、チャンネルごとにパワー（区間内の要素の２乗和）を計算する。ただし、分離行列Ｗｋ（ω）は、ステップＳ４５２においてリスケーリングされた分離行列であり、また、平均操作＜・＞ｔは学習データの区間（図８の例では、学習データのブロック８１）で行なう。
【０３４８】
パワー比の計算は、前記の式［８．６］・式［８．７］・式［８．１１］のいずれかを適用して行なう。チャンネルｋのパワー（分散）をＶｋとして、式［８．６］・式［８．７］・式［８．１１］のいずれかを適用してパワー比ｒｋを算出する。３つの式の違いは分母にある。式［８．６］の分母は同一区間内でチャンネル間でパワーを比較して最大のものである。式［８．７］の分母は非常に大きな音が入力されたときのパワーをＶｍａｘとしてあらかじめ計算しておいたものである。式［８．１１］の分母はパワーＶｋをチャンネル間で平均したものである。どれを使用するかは使用環境に応じて使い分ければよく、例えば比較的静かな環境で使用される場合は式［８．７］を、背景ノイズが比較的大きな環境で使用される場合は式［８．６］を用いる。それに対し、式［８．１１］を用い、かつ、rmin≦１≦rmaxとなるようにrminとrmaxを設定した場合は、広範囲の環境において比較的安定して動作する。なぜなら、周波数フィルタリングが適用されないチャンネルと適用されるチャンネルが、それぞれ少なくとも１つは存在するため、全チャンネルに対して突発音が除去されたり残ったりすることが起こらないからである。
【０３４９】
こうして計算されたチャンネル対応のパワー比ｒｋは、図１２に示すパワー比保持部１３５に格納され、必要に応じて分離処理部１２３の実行する分離処理（表の処理）に際して参照される。すなわち、パワー比に基づく関数（式［８．１０］および図２８）を用いることで、周波数フィルタリング（図２７のステップＳ３０８）の実行態様をチャンネルごとに決定する際に利用される。
以上で、ステップＳ４５４のパワー比の計算処理についての説明を終了する。
【０３５０】
［５．本発明の信号処理装置のその他の実施例（変形例）について］
次に、上述した実施例と異なる実施例としての変形例について説明する。
（５−１．変形例１）
上述した実施例では、周波数フィルタリングのチャンネルごとの適用形態を決定する方法として、パワー比に基づく関数（式［８．１０］および図２８）を用いる方法について説明した。
【０３５１】
別の手段として、「チャンネル間で分離行列適用結果のパワーを比較し、パワーが最小のチャンネル以外のチャンネルに対して周波数フィルタリングを適用する」という方法も可能である。すなわち、パワーが最小のチャンネルを突発音の出力用として常に確保しておくのである。パワーが最小のチャンネルはどの音源にも対応していない可能性が高いため、このような簡易的な方法でも十分に実用になる。
【０３５２】
ただし、突発音の出力されるチャンネルが頻繁に切り替わる（例えば、突発音が鳴っている間に切り替わってしまう）のを防ぐために、工夫が必要である。ここでは、そのような工夫として以下の２点、すなわち、
（１）  パワー比計算の平滑化
（２）  全死角空間フィルタを学習初期値に反映させる。
これらの２点について説明する。
【０３５３】
（１）パワー比計算の平滑化
まず、パワー比計算の平滑化について説明する。
チャンネルごとのパワーを、以下に示す式［１０．１］に基づいて計算する。
【０３５４】
【数１１】
2011107602.tif 000014
【０３５５】
上記式［１０．１］に基づいてチャンネルごとのパワーを計算すると、パワーがほぼ同じ出力チャンネルが複数存在する場合に、パワー最小のチャンネルが頻繁に切り替わりやすくなる。例えば、観測信号が無音に近い場合、全ての出力チャンネルも無音に近くなる、すなわち出力パワーがほとんど同じになり、パワー最小チャンネルが僅差で決定されるため、それが頻繁に切り替えるという現象が発生し得る。
【０３５６】
そのような現象を防ぐため、減算量（または  ｏｖｅｒ−ｓｕｂｔｒａｃｔｉｏｎ  ｆａｃｔｏｒ）αｋは、先に示した式［８．５］の代わりに式［１０．３］で計算する。ただし、αｍｉｎは０か０に近い正の値であり、αは式［８．５］と同様にαｋの最大値である。すなわち、パワー最小のチャンネルに対しては周波数フィルタリングを非適用に近い状態とし、それ以外のチャンネルに対しては周波数フィルタリングをそのまま適用する。なお、αｍｉｎを０に近い正の値とすることで、突発音用に確保されたチャンネルであっても、「消し残り」（「従来法の問題点」を参照）をある程度低減することができる。
【０３５７】
（２）全死角空間フィルタを学習初期値に反映させる
次に、全死角空間フィルタを学習初期値に反映させる手法について説明する。パワー最小のチャンネルに対してのみ周波数フィルタリングを非適用（または、非適用に近い状態）とすることで、突発音はそのチャンネルのみに出力される。一方、突発音が鳴り続けると、やがて分離行列に反映され、周波数フィルタリングの作用がなくても一つのチャンネルのみに出力されるようになる。例えば図７に示す（ｂ２）分離結果２のチャンネルである。そのため、両者でチャンネルを一致させるような工夫をしないと、突発音が鳴っている途中で出力先チャンネルが交替するという現象が発生し得る。
【０３５８】
周波数フィルタリングを非適用にしたチャンネルにその後も突発音が出力され続けるようにする（＝チャンネル交替を防ぐ）ためには、「どのチャンネルに周波数フィルタリングが適用されたか（または適用されなかったか）」という情報が、次回の学習の初期値に反映されるようになっていればよい。その方法について以下で説明する。
【０３５９】
前述した実施例では、学習初期値の設定を図２５を参照して説明した「分離行列更新処理」のステップＳ２５３において（すなわち学習終了直後に）行なっていたが、変形例では、図３１を参照して説明した「分離行列学習処理」のステップＳ４１２の分離行列Ｗの初期値設定時において（すなわち次の学習の直前で）行なう。理由は、学習開始直前における最新の分離行列および全死角空間フィルタの値を学習初期値に反映させるためである。（図１２の、分離行列適用部１２６および全死角空間フィルタ適用部１２７からスレッド制御部１３１への矢印を参照。）
【０３６０】
図３１を参照して説明した「分離行列学習処理」のステップＳ４１２の分離行列Ｗの初期値の計算として、先に示した式［１０−４］を全周波数ビンについて行なう。ただし、この式［１０−４］の左辺のＷ（ω）は学習初期値として、図１３に示すスレッド制御部１３１の学習初期値保持部１５２および図１４に示すスレッド演算部１３２の分離行列保持部１６４に格納される値、右辺のＷ'（ω）およびＢ'（ω）はそれぞれ頻繁リスケーリング後の分離行列と全死角空間フィルタである。α'ｋは式［１０．３］のαｋと同一の値を用いてもよいが、式［１０．５］のように異なる値を用いてもよい。例えば、周波数フィルタリングとしてスペクトル減算を用いた場合、式［１０．３］ではα＝１．５とする一方、式［１０．５］ではα'＝１．０とする。（スペクトル減算においてはα＞１とすることで、ｏｖｅｒ−ｓｕｂｔｒａｃｔｉｏｎという効果が得られるが、通常の引き算ではα＝１の方が望ましいため。）
【０３６１】
α'＝１かつα'ｍｉｎ＝０（または０に近い正の値）とすると、式［１０．４］で計算される分離行列Ｗ（ω）は、パワー最小のチャンネルは突発音を出力し、それ以外のチャンネルは突発音を抑圧するという性質をもつ。従って、そのような値を学習初期値とすることで、学習後も同一のチャンネルに突発音が出力され続ける可能性が高くなる。
【０３６２】
なお、必要に応じて、式［１０．４］の代わりに式［１０．６］の操作を行なってもよい。この式において、ｎｏｒｍａｌｉｚｅ（）は、カッコ内の行列に対して、各行ベクトルのノルムを１に正規化する操作を表わす。
【０３６３】
また、学習スレッド同士で学習時間が重複する可能性がある場合（例えば図５では学習時間５７と学習時間５８とで時間が重複している）は、最新以外の分離行列も学習初期値に反映させた方が、どのチャンネルにどの音源が出力されるかが安定する。（理由は特開２００８−１４７９２０を参照されたい。）  変形例において、最新以外の分離行列を学習初期値に反映させるためには、式［１０．６］の代わりに式［１０．７］を用いる。この式において、右辺のＷ（ω）は前回計算された学習初期値であり、図１３に示す学習初期値保持部１５２に格納されている。μは忘却係数であり、０以上、１以下の値をとる。
【０３６４】
この変形例による判別法を先に示した式［８．１］〜［８．１０］と比較すると、ちょうどｎ個（マイクロホン数と同じ）の音源が連続的に鳴っている状態で新たに突発音が鳴った場合のみ不具合が発生する。すなわち、ｎ−１個の出力チャンネルに対しては周波数フィルタリングによって突発音が除去されるが、最もパワーが小さかったチャンネルに対しては周波数フィルタリングが適用されないため、突発音が重畳して出力される。（その場合でも、従来法と比べると  ｎ−１個のチャンネルに対してはメリットがある。）
【０３６５】
一方、突発音が鳴る前の音源数がｎよりも少ない場合は、どのチャンネルから突発音が出力されるかがあらかじめ予想できる。そのため、主に突発音の方を目的音として使用するようなアプリケーション（例えば、音楽が鳴っている環境において、ときどき音声でコマンドを入力する）においては、ＩＣＡの複数の出力チャンネルの内のどれが目的音なのかを特定するのが容易になるという利点がある。
【０３６６】
（５−２．変形例２）
ＩＣＡ以外の線形フィルタリングとの組み合わせ
上述した実施例では、リアルタイムＩＣＡに対して全死角空間フィルタと周波数フィルタリング（減算）とを組み合わせたが、ＩＣＡ以外の線形フィルタリング処理と組み合わせることも可能であり、そうすることで「消し残り」を低減することが可能である。ここでは、線形フィルタリングと組み合わせた場合の構成例について説明した後、線形フィルタリングの具体例として分散最小ビームフォーマ（ＭＶＢＦ：Ｍｉｎｉｍａｌ  Ｖａｒｉａｎｃｅ  Ｂｅａｍｆｏｒｍｅｒ）を用いた場合の処理について説明する。
【０３６７】
図３３は、「全死角空間フィルタ＆周波数フィルタリング」と線形フィルタリングとを組み合わせた場合の構成例を示す図である。図３３に示す構成によって実行する処理は、図１２に示す分離処理部１２３の実行する観測信号の分離処理（表の処理）とほぼ同様の処理である。
【０３６８】
何らかの線形フィルタの生成および適用を行なう系（フーリエ変換部３０３→線形フィルタ生成＆適用部３０５）と全死角空間フィルタの生成および適用を行なう系（フーリエ変換部３０３→全死角空間フィルタ生成＆適用部３０４）とを用意し、それぞれの適用結果に対して周波数フィルタリング（減算）を行なう。線形フィルタ生成＆適用部３０５から全死角空間フィルタ生成＆適用部３０４への破線は、全死角空間フィルタの適用結果に対して必要に応じてリスケーリング（全死角空間フィルタ適用結果のスケールを線形フィルタ適用結果のスケールに合わせる）ことを意味する。
【０３６９】
なお、ここでいう線形フィルタリングとは、分離行列Ｗ（ω）を行列またはベクトルとし、Ｗ（ω）と観測信号ベクトルＸ（ω，ｔ）とを乗算することで（すなわち、分離結果：Ｙ（ω，ｔ）＝Ｗ（ω）Ｘ（ω，ｔ）の形式で）信号の分離・抽出・除去などを行なう処理のことを意味する。
【０３７０】
以下では、線形フィルタリングとして分散最小ビームフォーマを用いた場合について説明する。分散最小ビームフォーマは、目的音と妨害音とが混在する環境において、目的音の方向等の情報などを用いて目的音を抽出する技術の一つであり、適応ビームフォーマ（Ａｄａｐｔｉｖｅ  ｂｅａｍ  ｆｏｒｍｅｒ：  ＡＢＦ）と呼ばれる技術の一種である。詳細については、例えば以下の資料を参照されたい。
『音場の計測と指向性制御』小野順貴，安藤繁
弟２２回センシングフォーラム資料，ｐｐ．３０５−３１０，９月．２００５．ｈｔｔｐ：／／ｈｉｌ．ｔ．ｕ−ｔｏｋｙｏ．ａｃ．ｊｐ／ｐｕｂｌｉｃａｔｉｏｎｓ／ｄｏｗｎｌｏａｄ．ｐｈｐ？ｂｉｂ＝Ｏｎｏ２００５ＳｅｎｓｉｎｇＦｏｒｕｍ０９．ｐｄｆ
【０３７１】
以下では、図３４を用いて分散最小ビームフォーマ（ＭＶＢＦ）について簡単に説明した後、全死角空間フィルタおよび周波数フィルタリングとの組み合わせを説明する。図３４に示すような、目的音３５４（音源数１）と妨害音３５５（音源数１以上）とが混在する環境において、両者の音が混合した信号をｎ個のマイクロホン３５１〜３５３で観測する。観測信号からなるベクトルを、前記した式［２．２］と同様にＸ（ω，ｔ）とする。
【０３７２】
音源から各マイクロホンまでの伝達関数（インパルス応答）であるＨ１（ω）〜Ｈｎ（ω）は既知とし、それらを要素とするベクトルをＨ（ω）とする。ベクトルＨ（ω）は以下に示す式［１１．１］によって定義される。
【０３７３】
【数１２】
2011107602.tif 000015
【０３７４】
ベクトルＨ（ω）をステアリングベクトルと呼ぶ。なお、線形フィルタリングの具体例である分散最小ビームフォーマ（ＭＶＢＦ）においては、真の伝達関数を使用しなくても、Ｈ１（ω）〜Ｈｎ（ω）の間の比が正しければ目的音の抽出は可能である。そのため、ステアリングベクトルは、目的音の音源方向や位置などから算出したり、目的音のみが鳴っている（妨害音はすべて止まっている）区間の観測信号から推定したりすることも可能である。
【０３７５】
図３４に示すように、観測信号Ｘ１（ω，ｔ）〜Ｘｎ（ω，ｔ）にフィルタ係数（Ｄ１（ω）〜Ｄｎ（ω））を乗じるフィルタ３５８を通して総和したものを分離結果Ｙ（ω，ｔ）３５９とする。分離結果Ｙ（ω，ｔ）３５９は、フィルタ係数を要素とするベクトルＤ（ω）（式［１１．２］）を用いて式［１１．３］のように表わせる。ＩＣＡの場合と異なり、出力は１チャンネル、すなわちＹ（ω，ｔ）はスカラーである。
【０３７６】
分散最小ビームフォーマ（ＭＶＢＦ）のフィルタであるＤ（ω）は、式［１１．５］で求められる。この式において、ΣＸＸ（ω）は観測信号の共分散行列であり、ＩＣＡの場合と同様に前記した式［４．４］での操作で得られる。なお、式［１１．５］は、「目的音３５４由来の音はそのまま残す」という制約（式［１１．４］に相当）の下で、Ｙ（ω，ｔ）の分散＜｜Ｙ（ω，ｔ）｜２＞を最小にするＭＶＢＦフィルタＤ（ω）を求めるという問題を解くことで導出される。式［１１．５］によって計算されるＭＶＢＦフィルタＤ（ω）は、目的音の方向のゲインを１に保つ一方で、それぞれの妨害音の方向には死角を形成している。
【０３７７】
しかし、ＭＶＢＦによる音源抽出には、ＩＣＡにおける「消し残り」と同様の課題がある。すなわち、妨害音の音源数がマイク数以上の場合や、妨害音が無指向性の場合（＝点音源でない場合）などには、妨害音を死角で消しきれなくなるため、抽出の性能が低下する。また、マイクロホンの配置によって、ある周波数帯域での抽出精度が低下する可能性がある。
【０３７８】
また、計算量の制限などにより、フィルタの更新を毎フレームではなく複数フレームに１回の頻度でしか行なえない場合もある。その場合は、「追従遅れ」と同様の現象も発生する。例えば、フィルタの更新を１０フレームに１回の頻度で行なった場合、突発音が鳴ってから最大で９フレームの間は、その音が除去されずに出力されてしまう。
【０３７９】
一方、本発明の全死角空間フィルタと周波数フィルタリングをＭＶＢＦと組み合わせることで、「消し残り」にも「追従遅れ」にも対処可能となる。その際、共分散行列に対して固有値分解を行なうことで、計算量の増加なしに全死角空間フィルタを計算することができる。以下、その方法について説明する。
【０３８０】
観測信号の共分散行列を、前記した式［４．４］でフレームごとに計算する。そしてＭＶＢＦフィルタの更新頻度に合わせ、共分散行列に対して固有値分解を行なう（前記式［６．１］）。ＩＣＡと組み合わせた場合と同様に、全死角空間フィルタは、最小の固有値に対応した固有ベクトルの転置である（式［６．２］）。
【０３８１】
固有値分解の結果を用いると、逆行列を含まないシンプルな式でＭＶＢＦのフィルタを計算することができる。前記の式［９．９］から計算される無相関化行列Ｐ（ω）を用いると、観測信号の共分散行列は式［１１．７］のように書け、それを用いてＭＶＢＦのフィルタは式［１１．８］のように書くことができるからである。言い換えると、式［１１．５］において観測信号の共分散行列を求める手段として固有値分解を用いれば、同時に全死角空間フィルタも求まっている。
【０３８２】
こうして求まった全死角空間フィルタＢ（ω）に対して、リスケーリング（全死角空間フィルタ適用結果のスケールをＭＶＢＦフィルタ適用結果のスケールに合わせる処理）を行なう。リスケーリングは、式［１１．９］で計算される係数Ｑ（ω）を全死角空間フィルタＢ（ω）に乗じることで行なう（式［１１．１１］）。リスケーリング済み全死角空間フィルタの適用結果Ｚ'（ω，ｔ）は、式［１１．１２］で行なう。ＭＶＢＦ側の出力が１チャンネルなので、Ｚ'（ω，ｔ）も１チャンネル（すなわちＺ'（ω，ｔ）はスカラー）である。
【０３８３】
こうして生成されたＭＶＢＦの結果（式［１１．３］）と全死角空間フィルタ適用結果（式［１１．１２］）との間で、周波数フィルタリング（広い意味での減算）を行なう。それによって、ＭＶＢＦの結果から「消し残り」が除去されるようになる。また、ＭＶＢＦフィルタの更新を複数フレームごとに行なったために「追従遅れ」が発生している場合でも、突発音を除去することができるようになる。
【０３８４】
［６．本発明の信号処理装置の構成に基づく効果についてのまとめ］
以下、本発明の信号処理装置の構成に基づく効果についてまとめて記載する。本発明の信号処理装置の構成に基づく効果としては以下のような効果がある。
（１）独立成分分析を用いたリアルタイム音源分離システムにおいて、分離行列適用結果の他に全死角空間フィルタ適用結果も生成し、両者の間で周波数フィルタリングまたは減算を行なうことにより、突発音を除去することができる。
（２）周波数フィルタリングを適用する強さ（または減算の量）を、音源に対応した信号が突発音発生前に出力されていたかに応じて切り替えることにより、
ａ）音源に対応した信号が出力されているチャンネルからは突発音が除去され、
ｂ）音源に対応した信号が出力されていないチャンネルからは突発音が出力されることが可能になる。
（３）分離行列に対して最短で１フレーム毎にリスケーリングを行なうことにより、突発音が出力される際の歪みを低減することができる。
【０３８５】
以上、特定の実施例を参照しながら、本発明について詳解してきた。しかしながら、本発明の要旨を逸脱しない範囲で当業者が実施例の修正や代用を成し得ることは自明である。すなわち、例示という形態で本発明を開示してきたのであり、限定的に解釈されるべきではない。本発明の要旨を判断するためには、特許請求の範囲の欄を参酌すべきである。
【０３８６】
また、明細書中において説明した一連の処理はハードウェア、またはソフトウェア、あるいは両者の複合構成によって実行することが可能である。ソフトウェアによる処理を実行する場合は、処理シーケンスを記録したプログラムを、専用のハードウェアに組み込まれたコンピュータ内のメモリにインストールして実行させるか、あるいは、各種処理が実行可能な汎用コンピュータにプログラムをインストールして実行させることが可能である。例えば、プログラムは記録媒体に予め記録しておくことができる。記録媒体からコンピュータにインストールする他、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットといったネットワークを介してプログラムを受信し、内蔵するハードディスク等の記録媒体にインストールすることができる。
【０３８７】
なお、明細書に記載された各種の処理は、記載に従って時系列に実行されるのみならず、処理を実行する装置の処理能力あるいは必要に応じて並列的にあるいは個別に実行されてもよい。また、本明細書においてシステムとは、複数の装置の論理的集合構成であり、各構成の装置が同一筐体内にあるものには限らない。
【産業上の利用可能性】
【０３８８】
以上、説明したように、本発明の一実施例の構成によれば、複数音源からの出力を混合した混合信号からなる観測信号に対して、独立成分分析（ＩＣＡ：Ｉｎｄｅｐｅｎｄｅｎｔ  Ｃｏｍｐｏｎｅｎｔ  Ａｎａｌｙｓｉｓ）を適用した学習処理により、混合信号を分離する分離行列を求めて分離信号を生成するとともに、観測信号として検出された音源に対する死角を持つ全死角空間フィルタを適用して検出音を除去した全死角空間フィルタ適用信号を生成する。さらに、分離信号に含まれる全死角空間フィルタ適用信号に対応する信号成分を除去するフィルタリング処理を実行し、周波数フィルタリング処理結果から音源分離結果を生成する。本構成により、例えば突発音等が含まれる混合信号に対する高精度な音源分離が可能となる。
【符号の説明】
【０３８９】
４１  学習データブロック
４２  現在時刻の観測信号
４３  分離行列
４４  現在時刻の分離結果
４５  分離結果スペクトログラム区間
４６  現在時刻を含む観測信号ブロック
５１〜５３  適用分離行列規定区間
５４  観測信号蓄積区間
５５  学習開始タイミング
５７，５８  学習区間
６１，６２  音源１出力区間
６３  音源２出力区間
６４  学習データブロック
６５  ブロック終端から現在時刻までの区間
６７  音源１の無音区間
６９  現在時刻の音源出力
７１  継続音
７２  突発音
７８，７９  消し残り
８１  学習データブロック区間
８２  現在時刻の観測信号
８３  分離行列
８４  全死角空間フィルタ
８５  周波数フィルタリング
９１  継続音
９２  突発音
１０１  推定ノイズ
１０２  観測信号
１０３  ゲイン推定部
１０４  ゲイン
１０５  ゲイン適用部
１０６  処理結果
１１１  推定ノイズ
１１２  観測信号
１１３  ゲイン推定部
１１４  ゲイン
１１５  ゲイン適用部
１１６  処理結果
１２１  マイクロホン
１２２  ＡＤ変換部
１２３  分離処理部
１２４  フーリエ変換部
１２５  共分散行列計算部
１２６  分離行列適用部
１２７  全死角空間フィルタ適用部
１２８  周波数フィルタリング部
１２９  フーリエ逆変換部
１３０  学習処理部
１３１  スレッド制御部
１３２  スレッド演算部
１３３  分離行列保持部
１３４  全死角空間フィルタ保持部
１３５  パワー比保持部
１３６  後段処理部
１５１  現フレーム番号保持カウンタ
１５２  学習初期値保持部
１５３  蓄積開始予定タイミング指定情報保持部
１５４  観測信号蓄積タイミング情報保持部
１５５  ポインタ保持部
１６０  全死角空間フィルタ保持部
１６１  観測信号バッファ
１６２  分離結果バッファ
１６３  学習演算部
１６４  分離行列保持部
１６５  状態格納部
１６６  カウンタ
１６７  観測信号の開始・終了タイミング保持部
１６８  学習終了フラグ
１６９  前処理用データ保持部
１７０  打ち切りフラグ
１７１，１７４  蓄積中状態
１７２  学習中状態
１７３  待機中状態
１８１  初期状態
１８２  待機中状態
１８３  蓄積中状態
１８４  学習中状態
１９１〜１９３  フレーム
３０１  マイクロホン
３０２  ＡＤ変換部
３０３  フーリエ変換部
３０４  全死角空間フィルタ生成＆適用部
３０５  線形フィルタ生成＆適用部
３０６  周波数フィルタリング部
３０７  フーリエ逆変換部
３０８  後段処理部
３５１〜３５３  マイクロホン
３５４  目的音
３５５  妨害音
３５８  フィルタ
３５９  分離結果
【図１】
2011107602.tif 000016
【図１０】
2011107602.tif 000017
【図１１】
2011107602.tif 000018
【図１２】
2011107602.tif 000019
【図１３】
2011107602.tif 000020
【図１４】
2011107602.tif 000021
【図１６】
2011107602.tif 000022
【図１７】
2011107602.tif 000023
【図１９】
2011107602.tif 000024
【図２０】
2011107602.tif 000025
【図２１】
2011107602.tif 000026
【図２２】
2011107602.tif 000027
【図２３】
2011107602.tif 000028
【図２４】
2011107602.tif 000029
【図２５】
2011107602.tif 000030
【図２６】
2011107602.tif 000031
【図２７】
2011107602.tif 000032
【図２８】
2011107602.tif 000033
【図２９】
2011107602.tif 000034
【図３０】
2011107602.tif 000035
【図３１】
2011107602.tif 000036
【図３２】
2011107602.tif 000037
【図３３】
2011107602.tif 000038
【図３４】
2011107602.tif 000039
【図２】
2011107602.tif 000040
【図３】
2011107602.tif 000041
【図４】
2011107602.tif 000042
【図５】
2011107602.tif 000043
【図６】
2011107602.tif 000044
【図７】
2011107602.tif 000045
【図８】
2011107602.tif 000046
【図９】
2011107602.tif 000047
【図１５】
2011107602.tif 000048
【図１８】
2011107602.tif 000049