GCC-PHATを理解する

に公開

「GCC-PHAT」と調べても日本語の入門的な説明がないので自分で理解する。

お気持ち程度に理解できればそれで十分。

だんだん理解が進んできたら、そのたびに編集する予定(予定!)。

やりたいこと

複数マイクの入力(Nch音声信号)から、音源がどの方向にあるのかを特定する。

  • 入力
    • Nチャンネルマイク信号(N \geq 3)
  • 出力
    • 角度情報(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