Python での相互相関

Marion Paul Kenneth Mendoza 2023年10月10日
Python での相互相関

相互相関は、異なるラグを持つ 2つの信号間の類似性を分析するための重要な信号処理方法です。 2つの信号がどの程度一致しているかを把握できるだけでなく、2つの信号が最も類似している時点またはインデックスも取得できます。

この記事では、Python で相互相関を処理する複数の方法について説明します。

Python での相互相関

Python だけを使用して、2つの信号の相互相関を計算できます。 以下の式を使用して、Python スクリプトに変換できます。

方式:

R_{fg}(l) = \sum_{n=0}^{N} f(n)g(n+l)

コード例:

sig1 = [1, 2, 3, 2, 1, 2, 3]
sig2 = [1, 2, 3]

# Pre-allocate correlation array
corr = (len(sig1) - len(sig2) + 1) * [0]

# Go through lag components one-by-one
for l in range(len(corr)):
    corr[l] = sum([sig1[i + l] * sig2[i] for i in range(len(sig2))])
print(corr)

出力:

[14, 14, 10, 10, 14]

それでは、相互相関を関数として使用する複数の Python パッケージを見ていきましょう。

NumPy モジュールを使用する

数値計算用の標準 Python モジュールは NumPy と呼ばれます。 NumPy に相互相関手法が組み込まれていることは驚くべきことではありません。 NumPy がインストールされていない場合は、以下のコマンドでインストールできます。

pip install numpy

コード例:

import numpy as np

sig1 = [1, 2, 3, 2, 1, 2, 3]
sig2 = [1, 2, 3]

corr = np.correlate(a=sig1, v=sig2)

print(corr)

出力:

[14 14 10 10 14]

SciPy モジュールを使用する

NumPy が失敗した場合、SciPy が考慮すべき主なパッケージです。 これには、多数の工学および科学分野の実践的なテクニックが含まれています。

ただし、最初に、相互相関関連の信号処理ソフトウェアをインポートする必要があります。 次に、信号は SciPy 相互相関によって開始時と終了時に自動的にパディングされます。

その結果、純粋な Python コードと NumPy モジュールと比較して、相互相関に対してより広範な信号応答が提供されます。 したがって、これらのパディング コンポーネントを削除して、テスト ケースで結果が同等になるようにしました。

SciPy がインストールされていない場合は、以下のコマンドでインストールできます。

pip install scipy

コード例:

import scipy.signal

sig1 = [1, 2, 3, 2, 1, 2, 3]
sig2 = [1, 2, 3]

corr = scipy.signal.correlate(sig1, sig2)

# Removes padded Correlations
corr = corr[(len(sig1) - len(sig2) - 1) : len(corr) - ((len(sig1) - len(sig2) - 1))]

print(corr)

出力:

[14 10 10]
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn