GCC-PHATを理解する
「GCC-PHAT」と調べても日本語の入門的な説明がないので自分で理解する。
お気持ち程度に理解できればそれで十分。
だんだん理解が進んできたら、そのたびに編集する予定(予定!)。
やりたいこと
複数マイクの入力(Nch音声信号)から、音源がどの方向にあるのかを特定する。
- 入力
- Nチャンネルマイク信号(
)N \geq 3
- Nチャンネルマイク信号(
- 出力
- 角度情報(
)0 \leq \theta \lt 2\pi
- 角度情報(
ざっくりとしたイメージ
音は波として伝わる。仮に以下の状況を想定する。
音源 → マイク1 マイク2
このときに、音は最初にマイク1に到達し、次にマイク2に到達する。このときに、マイク1が受信した音声信号とマイク2が受信した音声信号は基本的には同じである。
異なるのは音声が到来した時間であって、時間軸方向にその到来分ずらしてあげると、マイク1とマイク2の音声信号はピッタリ重なるはず。ということは逆に、最もピッタリと重なるずらし幅から、音源の方向を推測することができる。これを複数のマイクの組み合わせで行うことによって、音源の到来方向を推測することができる。
一方で、実際には反響やノイズ等によって、きれいにピッタリ重なることはないので、そこを色々マスクだったりで処理するのが「PHAT」の部分。
ある程度な理解
GCC-PHATは以下のステップに分割することができると考える。
- フレーミング
- FFT
- 相互スペクトル
- PHAT 正規化
- IFFT & ピーク探索
フレーミング
ざっくりとしたイメージ
→ 連続値である音声信号を離散値に変換する。
後段のFFTは量子化された離散信号を前提とする。そのため、連続値である音声信号を離散値に変換する必要がある。
典型的には20~40msの分解能で処理する。
→ここはあまり理解しなくても実装上は、多分勝手にやってくれているはず。
FFT
ざっくりとしたイメージ
→ 時間軸方向の信号を周波数方向にするもの
数学的なことは理解できていないので、ここではお気持ちだけ。
普通に音声信号を受け入れると、「時間の流れに沿った音の強さ」になる。
時間*大きさ
音響で主に扱いたいのは周波数信号であって、これでは情報が扱えない。そこで、フーリエ変換(FT)を使用して、
周波数*その周波数の強さ
に変換してあげる。
相互スペクトル
ざっくりとした理解
→ それぞれのマイクペアで位相の情報だけを取り出す。
各マイク信号をFFTすると、周波数ごとの複素数(大きさ+位相)の情報が得られる。これをそれぞれのマイクペアで掛け算をすると、位相情報がメインに残る。
位相とはズレぐわいなので、これから、音源の到来方向に関する情報を抽出することができる。
PHAT 正規化
ざっくりとした理解
→ 音の大きさは全部捨てて、位相だけを残す処理。
声が大きい人もいれば、声が小さい人もいる。したがって、周波数ごとの大きさは異なる。このまま相関をとると、大きな音の部分だけを拾ってしまい、正確なズレぐわいを特定する事ができない。
そのため、相互スペクトルの大きさで割ってあげることで、大きさをすべて整える。 p / p.max()と同じようなイメージ。
IFFT & ピーク探索
ざっくりとした理解
→ 位相を具体的に計算して到来方向を予測する。
PHAT正規化した相互スペクトルを逆FFTにかける。逆FFTとは高速フーリエ変換の逆。つまり、周波数情報から、時間軸情報に戻してあげる。
そうすることで、時間軸上の相関、つまり「少しずつずらしたときに、信号の似ている度合い」がわかる。
この中で最も似ているところが到来時間差(TDOA)を表す。これを複数のマイクペアで計算することで、いくつかの到来時間差が求まる。
この到来時間差をいい感じに満たすものを求めたものが、最終的なDOAの角度情報となる。
まとめ
GCC-PHATの流れをお気持ちレベルでざっくりと理解できたはず。はず、、、厳密な数式とか理論とかはわかりません。わかるようになったときでいいのです。
Discussion