Colorful Wires

エンジニアリングの勉強の記録

相互相関関数を正規化する

概要

相互相関関数のスケールは、入力信号のスケールに依存します。 入力信号のスケールに依存しない、正規化された相互相関関数は、 入力信号をそれぞれ正規化してから相互相関関数を求めることで得られます。 このようにして得られたものは、正規化相互相関関数と呼びます。

詳細

相互相関関数は、以下の畳み込みの式に、一方の信号を逆向きにして入力することで求められます。


(f * g)(m) = \sum_{n} f(n) g(m-n)

相互相関関数は元の信号のスケールに依存しますが、どのようにスケールを正規化すればよいのでしょうか。

以下のリンクに相互相関関数の使用例が記載されていますが、値は 0 から 1 に正規化されていません。 bsd.neuroinf.jp

相互相関関数は、スケーリングされていなくてもいいようです。


C_{XY} (\tau) = \sum_{t=1}^{T} X(t) Y(t+\tau)

相互相関は、正規化すると、正規化相互相関係数という指標になるようです。

では具体的な正規化の手順を探してみます。

自己相関関数では、最大値が 1 になるようにすることを正規化と呼ぶらしいです。
http://www.slp.k.hosei.ac.jp/~itou/lecture/2011/DigitalData/06_text.pdf

正規化は、画像のレジストレーションでよく使われています。 レジストレーションとは、似た画像をピッタリ重ね合わせる位置や角度を見つけることです。 http://www.cfme.chiba-u.jp/~haneishi/class/digitalgazo/12Registration.pdf

正規化相互相関係数の定義は、上記の資料の 6 頁を参考にします。 以下に一部を引用します。

f:id:moge560:20210705165545p:plain
画像工学入門 - パターン認識:マッチング・レジストレーション - 6 頁

正規化相互相関は、元の波形から、平均値を引き、標準偏差で割った信号に対して相関の計算を行うことで可能です。 ただし NumPy の numpy.correlate は各要素の和を行うため、入力ベクトルの長さで除算することが必要です。

以下に正規化相互相関係数Python で求めるサンプルコードを記載します。

import numpy as np
# ベクトル a を正規化しておきます。
# ベクトル b を正規化しておきます。
assert len(a) == len(b)

# 高々 1 に正規化された相互相関は以下で得られます。
np.correlate(a, b) / len(a)