GHDSS (Geometric High-order Dicorrelation-based Source Separation) アルゴリズムに基づいて,音源分離処理を行う.GHDSS アルゴリズムは, マイクロホンアレイを利用した処理で,
音源信号間の高次無相関化
音源方向へ指向性の形成
という2つの処理を行う. 2.の指向性は,事前に与えられたマイクロホンの位置関係を幾何的制約 として処理を行う.また,HARK に実装されている GHDSS アルゴリズムは, マイクロホンの位置関係に相当する情報として,マイクロホンアレイ の伝達関数を利用することができる.
ノードの入力は,混合音のマルチチャネル複素スペクトルと,音源方向のデータである. また,出力は分離音ごとの複素スペクトルである.
HARK 2.1の変更点:
ファイル形式の変更
TF_CONJ_FILENAME で指定される伝達関数ファイル及びINITW_FILENAME、 EXPORT_W_FILENAMEで入出力される分離行列ファイルのファイル形式が 5.3 節で示されるファイルフォーマットに変更された.
POS引き継ぎ時の許容誤差の指定方法の変更
UPDATE_METHOD_TF_CONJ, UPDATE_METHOD_WをPOSまたはID_POSとしたときの、許容誤差の指定方法を距離[mm]とするよう変更した.
対応するパラメータ名 |
説明 |
TF_CONJ_FILENAME |
マイクロホンアレーの伝達関数 |
INITW_FILENAME |
分離行列初期値 |
どんなときに使うのか
所与の音源方向に対して,マイクロホンアレイを用いて当該方向の音源分離を行う. なお,音源方向として,音源定位部での推定結果,あるいは,定数値を使用すること ができる.
典型的な接続例
GHDSS ノードの接続例を図 6.50 に示す. 入力は以下の2つが必要である.
INPUT_FRAMES には,混合音の多チャネル複素スペクトル,
INPUT_SOURCES には,音源方向.
出力である分離音声に対して音声認識を行うために,MelFilterBank などを利用して, 音声特徴量に変換する以外に,以下のような音声認識の性能向上方法もある.
PostFilter ノードを利用して,音源分離処理によるチャネル間リークや 拡散性雑音を抑圧する(図 6.50 右上参照).
PowerCalcForMap ,HRLE ,SpectralGainFilter を接続して, 音源分離処理によるチャネルリークや拡散性雑音を抑圧する(PostFilter と比較して,チューニングが容易).
PowerCalcForMap ,MelFilterBank ,MFMGeneration を接続して, ミッシングフィーチャ理論を用いた音声認識を行うために, ミッシングフィーチャーマスクを生成する(図 6.50右下参照).
パラメータ名 |
型 |
デフォルト値 |
単位 |
説明 |
LENGTH |
512 |
[pt] |
分析フレーム長. |
|
ADVANCE |
160 |
[pt] |
フレームのシフト長. |
|
SAMPLING_RATE |
16000 |
[Hz] |
サンプリング周波数. |
|
LOWER_BOUND_FREQUENCY |
0 |
[Hz] |
分離処理で用いる周波数の最小値 |
|
UPPER_BOUND_FREQUENCY |
8000 |
[Hz] |
分離処理で用いる周波数の最大値 |
|
TF_CONJ_FILENAME |
マイクロホンアレーの伝達関数を記したファイル名. |
|||
INITW_FILENAME |
分離行列の初期値を記述したファイル名. |
|||
SS_METHOD |
ADAPTIVE |
高次無相関化に基づくステップサイズの算出方法.FIX, LC_MYU, ADAPTIVE から選択.FIXは固定値,LC_MYUは幾何制約に基づくステップサイズに連動した値,ADAPTIVEは自動調節. |
||
SS_METHOD==FIX |
以下 SS_METHOD が FIX の時に有効. |
|||
SS_MYU |
0.001 |
高次無相関化に基づく分離行列更新時のステップサイズ |
||
SS_SCAL |
1.0 |
高次相関行列計算におけるスケールファクタ |
||
NOISE_FLOOR |
0.0 |
入力信号をノイズとみなす振幅の閾値(上限) |
||
LC_CONST |
FULL |
幾何制約の手法を決める.DIAG, FULLから選択.DIAGは対角成分を使うのみ.FULLは全成分を使用する. |
||
LC_METHOD |
ADAPTIVE |
幾何制約に基づくステップサイズの算出方法.FIX, ADAPTIVE から選択.FIXは固定値,ADAPTIVEは自動調節. |
||
LC_METHOD==FIX |
以下 LC_METHOD が FIX の時に有効. |
|||
LC_MYU |
0.001 |
高次無相関化に基づく分離行列更新時のステップサイズ |
||
UPDATE_METHOD_TF_CONJ |
POS |
伝達関数を更新する手法を指定.POS,ID から選択. |
||
UPDATE_METHOD_W |
ID |
分離行列を更新する手法を指定. ID,POS,ID_POS から選択. |
||
UPDATE_ACCEPT_DISTANCE |
300.0 |
[mm] |
音源移動時に同一音源とみなす距離の閾値. |
|
EXPORT_W |
false |
分離行列をファイルに書き出すかを指定. |
||
EXPORT_W==true |
以下 EXPORT_W が trueの時に有効. |
|||
EXPORT_W_FILENAME |
分離行列を書きだすファイル名. |
|||
UPDATE |
STEP |
分離行列の更新方法を決める.STEP,TOTALから選択.STEPは高次無相関化に基づく更新を行った後に,幾何制約に基づく更新を行う.TOTALでは,高次無相関化に基づく更新と幾何制約に基づく更新を同時に行う. |
入力
: Matrix<complex<float> > 型.マルチチャネル複素スペクトル. 行がチャネル,つまり,各マイクロホンから入力された波形の 複素スペクトルに対応し,列が周波数ビンに対応する.
: Vector<ObjectRef> 型.音源定位結果等が格納された Source 型オブジェクトの Vector 配列である. 典型的には, SourceTracker ノード,SourceIntervalExtender ノードと 繋げ,その出力を用いる.
出力
: Map<int, ObjectRef> 型.分離音の音源IDと,分離音の1チャネル複素スペクトル
(Vector<complex<float> > 型) のペア.
パラメータ
: int 型. 分析フレーム長.前段階における値(AudioStreamFromMic ,MultiFFT ノードなど) と一致している必要がある.
: int 型. フレームのシフト長.前段階における値(AudioStreamFromMic ,MultiFFT ノードなど) と一致している必要がある.
: int 型. 入力波形のサンプリング周波数.
GHDSS 処理行う際に利用する最小周 波数値であり,これより下の周波数に対しては処理を行わず,出力スペクトルの値は0となる. 0以上サンプリング周波数値の半分までの範囲で指定する.
GHDSS 処理を行う際に利用する最大周 波数値であり,これより上の周波数に対しては処理を行わず,出力スペクトルの値は0となる. LOWER_BOUND_FREQUENCY $<$ UPPER_BOUND_FREQUENCY である必要がある.
: string 型. 分離行列の初期値を記したファイル名. 事前の計算により,値の収束した分離行列を初期値として与えることで, 音が鳴り始めた最初の部分から精度よく分離することが可能となる. ここで与えるファイルは,EXPORT_W を trueにすることで,予め用意しておく必要がある. ファイルフォーマットは 5.3.2 節を参照.
: string 型. 高次無相関化に基づくステップサイズの算出方法を選ぶ. ユーザが指定した値に固定する場合は FIX,幾何制約に基づくステップサイズ に連動した値にする場合は LC_MYU,自動調節する場合は ADAPTIVE を指定.
: float 型. 1.0 がデフォルト.高次相関行列計算における双曲線正接関数(tanh)の スケールファクタを指定する. 0より大きい正の実数を指定する.値が小さいほど非線形性が少なくなり 通常の相関行列計算に近づく.
: float 型. 0がデフォルト.入力信号をノイズとみなす振幅の閾値(上限)を指定する. 入力信号の振幅がこの値以下の場合,ノイズ区間とみなされ,分離行列の更新がされない. ノイズが大きく,分離行列が安定して収束しない場合に,正の実数を指定する.
: string 型. 幾何制約の手法を選択する. 幾何制約に対角成分(直接音成分)のみを使う場合は DIAG 直接音成分に加えて,非対角成分も使用する場合は FULLを指定する. 死角は高次無相関化によって自動的に形成されるため, DIAG でも高精度な分離が可能. デフォルトは FULL.
: string 型. 幾何制約に基づくステップサイズの算出方法を選ぶ. ユーザが指定した値に固定する場合は FIX,自動調節する場合は ADAPTIVE を指定.
: string 型. ID または POS を指定する.POS がデフォルト. 伝達関数の複素共役 TF_CONJ の更新をするかの判断を,各音源に付与された ID に基づいて行う (ID の場合) か,音源位置によって行う (POS の場合) かを指定する.
: string 型. ID,POS または ID_POS を指定.ID がデフォルト. 音源位置情報が変わった際に,分離行列の再計算が必要となる. この時の音源位置情報が変わったとみなす方法を指定する. 分離行列は,内部で対応する音源 ID や音源方向の座標とともに一定時間保存され, 一度音が止んでも,同一の方向からの音源と判断される音が検出されると, 再び保存された分離行列の値を用いて分離処理が行われる. このとき,分離行列の更新を行うかどうかの基準を設定する. ID を設定した場合,音源 ID によって同方向音源かどうか判断する. POS を設定した場合,音源方向を比較して判断する. ID_POS を設定した場合,音源 ID を比較し,同一と判断されなかった場合は, さらに音源方向の座標を比較して判断を行う.
: float 型.300.0 がデフォルト.音源の移動に対して同一音源とみなす距離[mm].設定した距離の範囲内であれば更新された分離行列を利用して演算が行われる.
: bool 型. falseがデフォルト. GHDSS により更新された分離行列の結果を出力するかどうかを設定. trueのとき,EXPORT_W_FILENAME を指定.
: string 型. EXPORT_W が trueのとき有効.分離行列を書きだすファイル名を指定. フォーマットは 5.3.2 節を参照.
: string 型. 分離行列の更新方法を決める.STEP,TOTALから選択.STEPは高次無相関化に基づく更新を行った後に,幾何制約に基づく更新を行う. TOTALでは,高次無相関化に基づく更新と幾何制約に基づく更新を同時に行う.
音源分離の定式化: 音源分離問題の定式化で用いる記号を表 6.45 にまとめる. インデックスの意味は,表 6.1 に準拠する. 演算は周波数領域において行われるため,各記号は周波数領域での,一般には複素数の値を表す. 伝達関数以外は一般に時間変化するが,同じ時間フレームにおける演算の場合は, 時間インデックス $f$ を省略して表記する. また,以下の演算は周波数ビン $k_ i$ について述べる. 実際には,$K$ 個それぞれの周波数ビン $k_0, \dots ,k_{K-1}$ に対して演算が行われている.
変数 |
説明 |
$\boldsymbol {S}(k_ i) = \left[S_1(k_ i), \dots ,S_ N(k_ i)\right]^ T$ |
周波数ビン$k_ i$に対応する音源複素スペクトルのベクトル. |
$\boldsymbol {X}(k_ i) = \left[X_1(k_ i), \dots ,X_ M(k_ i)\right]^ T$ |
マイクロホン観測複素スペクトルのベクトル,INPUT_FRAMES に対応. |
$\boldsymbol {N}(k_ i) = \left[N_1(k_ i), \dots ,N_ M(k_ i)\right]^ T$ |
各マイクロホンに作用する加法性ノイズ. |
$\boldsymbol {H}(k_ i) = \left[H_{m, n}(k_ i)\right]$ |
反射,回折などを含む伝達関数行列 ($M \times N$). |
$\boldsymbol {H}_ D(k_ i) = \left[H_{Dm, n}(k_ i)\right]$ |
直接音の伝達関数行列 ($M \times N$). |
$\boldsymbol {W}(k_ i) = \left[W_{n, m}(k_ i)\right]$ |
分離行列 ($N \times M$). |
$\boldsymbol {Y}(k_ i) = \left[Y_1(k_ i), \dots ,Y_ N(k_ i)\right]^ T$ |
分離音複素スペクトル. |
$\mu _{SS}$ |
高次無相関化に基づく分離行列更新時のステップサイズ,SS_MYUに対応. |
$\mu _{LC}$ |
幾何制約に基づく分離行列更新時のステップサイズ.LC_MYUに対応. |
$N$ 個の音源から発せられた音は,その空間の伝達関数 $\boldsymbol {H}(k_ i)$ の影響を受け, $M$ 個のマイクロホンを通じて式(38) のように観測される.
$\displaystyle \boldsymbol {X}(k_ i) $ | $\displaystyle = $ | $\displaystyle \boldsymbol {H}(k_ i)\boldsymbol {S}(k_ i) + \boldsymbol {N}(k_ i). \label{eq:observation} $ | (38) |
一般に,伝達関数 $\boldsymbol {H}(k_ i)$ は,部屋の形や,マイクロホンと音源の位置関係により 変化するため,推定は困難である.
しかし,音の反射や回折を無視して,直接音のみに限定した伝達関数 $\boldsymbol {H}_ D(k_ i)$は, 音源とマイクロホンの相対位置が分かっている場合は,次の式 (39) のように計算可能である.
$\displaystyle H_{Dm, n}(k_ i) $ | $\displaystyle = $ | $\displaystyle \exp \left(-j2\pi l_ ir_{m, n}\right),\label{eq:tfd} $ | (39) | ||
$\displaystyle l_ i $ | $\displaystyle = $ | $\displaystyle \frac{2\pi \omega _ i}{c}, \label{eq:wavenumber} $ | (40) |
ただし,$c$ は音速で,$l_ i$ は周波数ビン $k_ i$ での周波数 $\omega _ i$ に対応する波数とする. また,$r_{m,n}$ は,マイクロホン $m$ から音源 $n$ までの距離と,座標系の基準点 (たとえば原点) から音源 $n$ までの距離の差である. つまり,音源から各マイクロホンまでの到達時間の差から生じる位相差として,$\boldsymbol {H}_ D(k_ i)$ は定義される.
分離音の複素スペクトルの行列$\boldsymbol {Y}(k_ i)$は,
$\displaystyle \boldsymbol {Y}(k_ i) $ | $\displaystyle = $ | $\displaystyle \boldsymbol {W}(k_ i)\boldsymbol {X}(k_ i) \label{eq:GHDSS-separation} $ | (41) |
として求める. GHDSS アルゴリズムは,$\boldsymbol {Y}(k_ i)$ が $\boldsymbol {S}(k_ i)$ に近づくように, 分離行列 $\boldsymbol {W}(k_ i)$ を推定する.
このアルゴリズムで既知と仮定する情報は次の通り.
音源数 $N$
音源位置 (HARK では LocalizeMUSIC ノードが音源位置を推定する)
マイクロホン位置
直接音成分の伝達関数 $\boldsymbol {H}_ D(k_ i)$ (測定する or 式 (39) による近似)
未知の情報としては,
観測時の実際の伝達関数 $\boldsymbol {H}(k_ i)$
観測ノイズ $\boldsymbol {N}(k_ i)$
GHDSS は,下記を満たすように分離行列 $\boldsymbol {W}(k_ i)$ の推定を行う.
分離信号を高次無相関化
すなわち,分離音 $\boldsymbol {Y}(k_ i)$ の高次相関行列 $\boldsymbol {R}^{\phi (y)y}(k_ i) = E[\phi (\boldsymbol {Y}(k_ i))\boldsymbol { Y}^ H(k_ i)]$ の対角成分以外が0になるようにする.ここで$^ H$ 作用素はエルミート転置を,$E[]$は時間平均作用素を,$\phi ()$は非線形関数であり,本ノードでは下記で定義される双曲線正接関数を用いている.
$\displaystyle \phi (\boldsymbol {Y}) $ | $\displaystyle = $ | $\displaystyle [\phi (Y_1), \phi (Y_2), \dots , \phi (Y_ N)]^ T $ | (42) | ||
$\displaystyle \phi (Y_ k) $ | $\displaystyle = $ | $\displaystyle \tanh (\sigma |Y_ k|) \exp (j\angle (Y_ k)) $ | (43) |
ここで,$\sigma $ はスケーリングファクタ(SS_SCALに対応)である.
直接音成分は歪みなく分離される (幾何的制約)
分離行列 $\boldsymbol {W}(k_ i)$ と 直接音の伝達関数 $\boldsymbol {H}_ D(k_ i)$ の積が 単位行列になるようにする ($\boldsymbol {W}(k_ i)\boldsymbol {H}_ D(k_ i) = \boldsymbol {I}$).
上の2つの要素をあわせた評価関数は以下のようになる. 簡単のため,周波数ビン $k_ i$ は略す.
$\displaystyle J(\boldsymbol {W}) $ | $\displaystyle = $ | $\displaystyle \alpha J_1(\boldsymbol {W}) + \beta J_2(\boldsymbol {W}), \label{eq:evalFuncTotal} $ | (44) | ||
$\displaystyle J_1(\boldsymbol {W}) $ | $\displaystyle = $ | $\displaystyle \sum _{i \ne j}|R^{\phi (y)y}_{i, j}|^2, \label{eq:evalFunc1} $ | (45) | ||
$\displaystyle J_2(\boldsymbol {W}) $ | $\displaystyle = $ | $\displaystyle \| \boldsymbol {WH}_ D-\boldsymbol {I}\| ^2, \label{eq:evalFunc2} $ | (46) |
ただし,$\alpha $および$\beta $ は重み係数である. また行列のノルムは $\| \boldsymbol {M}\| ^2 = tr(\boldsymbol {MM}^ H) = \sum _{i, j}|m_{i, j}|^2$ として定義される.
式 (44) を最小化するための分離行列の更新式は,複素勾配演算$\frac{\partial }{\partial \boldsymbol {W}^*}$を利用した勾配法から,
$\displaystyle \boldsymbol {W}(k_ i, f+1) $ | $\displaystyle = $ | $\displaystyle \boldsymbol {W}(k_ i, f) - \mu \frac{\partial J}{\partial \boldsymbol {W}^*}(\boldsymbol {W}(k_ i, f)) \label{eq:updateSepMatStat} $ | (47) |
となる.ここで,$\mu $は分離行列の更新量を調節するステップサイズである. 通常,式 (47) の右辺にある複素勾配を求めると, $\boldsymbol {R}^{xx} = E[\boldsymbol {XX}^ H]$ や $\boldsymbol {R}^{yy} = E[\boldsymbol {YY}^ H]$ などの 期待値計算に複数のフレームの値を要する. GHDSS ノードでの計算は,自己相関行列を求めず,1つのフレームだけを用いた以下の更新式 (48) を用いる.
$\displaystyle \boldsymbol {W}(k_ i, f+1) $ | $\displaystyle = $ | $\displaystyle \boldsymbol {W}(k_ i, f) - \left[ \mu _{SS} \frac{\partial J_1}{\partial \boldsymbol {W}^*}(\boldsymbol {W}(k_ i, f)) + \mu _{LC} \frac{\partial J_2}{\partial \boldsymbol {W}^*}(\boldsymbol {W}(k_ i,f)) \right],\label{eq:updateSepMatInst} $ | (48) | ||
$\displaystyle \frac{\partial J_1}{\partial \boldsymbol {W}^*}(\boldsymbol {W}) $ | $\displaystyle = $ | $\displaystyle \left(\phi (\boldsymbol {Y})\boldsymbol {Y}^ H - \mathrm{diag}[\phi (\boldsymbol {Y})\boldsymbol {Y}^ H] \right)\tilde{\phi }({{\boldsymbol{W}}}\boldsymbol {X})\boldsymbol {X}^ H,\label{eq:J1} $ | (49) | ||
$\displaystyle \frac{\partial J_2}{\partial \boldsymbol {W}^*}(\boldsymbol {W}) $ | $\displaystyle = $ | $\displaystyle 2\left(\boldsymbol {W}\boldsymbol {H}_ D - \boldsymbol {I} \right)\boldsymbol {H}_ D^ H, \label{eq:J2} $ | (50) |
ここで,$\tilde{\phi }$は$\phi $の偏微分であり,下記で定義される.
$\displaystyle \tilde{\phi }(\boldsymbol {Y}) $ | $\displaystyle = $ | $\displaystyle [\tilde{\phi (Y_1)}, \tilde{\phi (Y_2)},\dots ,\tilde{\phi (Y_ N)}]^ T $ | (51) | ||
$\displaystyle \tilde{\phi }(Y_ k) $ | $\displaystyle = $ | $\displaystyle \phi (Y_ k) + Y_ k \frac{\partial \phi (Y_ k)}{\partial Y_ k} $ | (52) |
また,$\mu _{SS} = \mu \alpha $,$\mu _{LC} = \mu \beta $ であり,それぞれ高次無相関化および幾何制約に基づくステップサイズをあらわす. ステップサイズの調節を自動にした場合,ステップサイズは次式で計算される.
$\displaystyle \mu _{SS} $ | $\displaystyle = $ | $\displaystyle \frac{J_1(\boldsymbol {W})}{2 \| \frac{\partial J_1}{\partial \boldsymbol {W}}(\boldsymbol {W})\| ^2} $ | (53) | ||
$\displaystyle \mu _{LC} $ | $\displaystyle = $ | $\displaystyle \frac{J_2(\boldsymbol {W})}{2 \| \frac{\partial J_2}{\partial \boldsymbol {W}}(\boldsymbol {W})\| ^2} $ | (54) |
式 (49,50)では,各変数のインデックスを省略したが,いずれも $(k_ i, f)$である.
分離行列の初期値は次のようにして求める.
$\displaystyle \boldsymbol {W}(k_ i) $ | $\displaystyle = $ | $\displaystyle \boldsymbol {H}_ D^ H(k_ i) / M, \label{eq:initSepMat} $ | (55) |
ただし,$M$ はマイクロホン数である.
処理の流れ:
GHDSS ノードにおける,時間フレーム $f$ における主な処理を 図 6.51 に示す. より詳細には,以下のように固定ノイズに関する処理などが含まれる.
(直接音) 伝達関数の取得
分離行列 $\boldsymbol {W}$ 推定
式 (41) に従って音源分離処理を実行
分離行列の書き出し (EXPORT_W が trueのとき)
伝達関数の取得: パラメータ TF_CONJ_FILENAME で指定された伝達関数から,入力された音源定位結果の方向に最も近い位置にあるデータを検索する.
2フレーム以降については,以下の通りである.
パラメータ UPDATE_METHOD_TF_CONJ の値によって以下のように,前フレームの伝達関数を引き継ぐか,ファイルから読み込むかを決定する.
UPDATE_METHOD_TF_CONJ が ID
1フレーム前のIDと取得したIDを比較
同じ: 引き継ぐ
異なる: 読み込む
UPDATE_METHOD_TF_CONJ が POS
1フレーム前の音源方向と取得した方向を比較
誤差が UPDATE_ACCEPT_DISTANCE 未満: 引き継ぐ
誤差が UPDATE_ACCEPT_DISTANCE 以上: 読み込む
分離行列の推定: 分離行列の初期値は,パラメータ INITW_FILENAME に値を指定するかによって異なる.
パラメータ INITW_FILENAME が指定されていないときは,伝達関数 $\boldsymbol {H}_ D$ から分離行列 $\boldsymbol {W}$ を計算する.
パラメータ INITW_FILENAME が指定されているときは,指定された分離行列から,入力された音源定位結果の方向に最も近い位置にあるデータを検索する.
2フレーム以降については,以下の通りである.
分離行列を推定するまでの流れを図 6.52 に示す. ここでは,式 (48) に従って,前フレームの分離行列を更新するか, 式 (55) を用いて,伝達関数を利用して分離行列の初期値の導出が行われる.
前フレームの音源定位情報を参照して,消滅した音源がある場合,分離行列は初期化される.
音源数に変化がない場合,UPDATE_METHOD_W の値によって分岐する. 前フレームにおける,音源 ID,定位方向を,現在のフレームと比較して,分離行列を継続して使うか, 初期化するかを決定する.
[c]UPDATE_METHOD_W が ID
前フレーム ID と比較
同じ: $\boldsymbol {W}$ を更新
異なる: $\boldsymbol {W}$ を初期化
[c]UPDATE_METHOD_W が POS
前フレーム定位方向と比較
誤差が UPDATE_ACCEPT_DISTANCE 未満: $\boldsymbol {W}$ を更新
誤差が UPDATE_ACCEPT_DISTANCE 以上: $\boldsymbol {W}$ を初期化
[c]UPDATE_METHOD_W が ID_POS
前フレーム ID と比較
同じ: $\boldsymbol {W}$ を更新
IDが異なった場合,定位方向を比較
誤差が UPDATE_ACCEPT_DISTANCE 未満: $\boldsymbol {W}$ を更新
誤差が UPDATE_ACCEPT_DISTANCE 以上: $\boldsymbol {W}$ を初期化
分離行列の書き出し (EXPORT_W が trueのとき): EXPORT_W が trueのとき,収束した分離行列を EXPORT_W_FILENAMEで指定したファイルに出力する.
複数の音源が検出された場合,それらの分離行列は全て1つのファイルに出力される. 音源が消滅した時点で,その分離行列をファイルに書き出す.
ファイルに書き出す際は,既に保存されている音源の定位方向と比較して,既存音源を上書きするか,新たな音源として追加するかを決定する.
[c]音源が消滅
既に保存されている音源の定位方向と比較
誤差が UPDATE_ACCEPT_DISTANCE 未満: $\boldsymbol {W}$ を上書き保存
誤差が UPDATE_ACCEPT_DISTANCE 以上: $\boldsymbol {W}$ を追加保存