相互相関しようとしている 2 つのデータ セットがあります。それらは関数に似ているarctan
ので、信号処理を行う方法を理解するためのモデルとして使用しています。
x = linspace(-15, 15, 2**13)
f1 = arctan(x)
f2 = arctan(x + 2)
私が答える必要がある質問は、緑の信号を青の信号と (ほとんど) 重なるようにするには、どれだけシフトする必要があるかということです。f1
と の相互相関関数で最大値を見つけるのと同じくらい簡単だと思いf2
、次のアドバイスに大まかに従いました。. これは私が試してきたことです
c = correlate(f1, f2, 'full')
s = arange(1-2**13, 2**13)
dx = 30/2**13
shift = s[c.argmax()]*dx
shift
私は多かれ少なかれ正確に 2 に等しいと予想しますが、実際には0.234
. これは私には意味がありません。相互相関の最大値の x 座標を見つけました。これは、2 つの信号の最大の重なりがある場所で見つける必要があります。
この種の関数のこの量を計算する方法についてのアイデアはありますか?
編集:実際のデータについては、すべての値が0から1の間になることを追加する必要があります
EDIT EDIT: 次の関数は、実際には私の実際のデータに似ています。
x = linspace(-15, 15, 400)
f1 = (arctan(-x) + pi/2) / pi
f2 = (arctan(-x + 2) + pi/2) / pi
したがって、ここに示す式を使用して: http://paulbourke.net/miscellaneous/correlate/データをパディングして左に 1 を追加し、右に 0 を追加する相互相関関数を作成できます。
def xcorr(x, y);
mx = x.mean()
my = y.mean()
sx = x.std()
sy = y.std()
r = zeros(2*len(x))
for d in range(-len(x), len(x)):
csum = 0
for i in range(0, len(x):
yindx = i - d
if i - d < 0:
yval = 1
elif i - d >= len(x):
yval = 0
else:
yval = y[yindx]
csum += (x[i] - mx) * (yval - my)
r[d + len(x)] = csum / (sx * sy)
return r
この関数を使用すると、できるようになりました
c = xcorr(f1, f2)
s = arange(-400, 400)
dx = 30/400
shift = s[c.argmax()] * dx
これは 2.025 になり、この精度では 2 に限りなく近づきます。ジェイミーが正しかったようです。問題は、numpycorrelate
がシグナルのパディングを行う方法にあります。
したがって、明らかに私のxcorr
機能は現状では非常に遅いです。問題は、NumPy に同様のことをさせる方法はありますか、それとも C でアルゴリズムを記述し続ける必要があるかということctypes
です。