質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

1417閲覧

ガウス関数同士の相互相関関数を計算する際に、np.correlateの計算における関数の平均を0であることは必要か?

keshigomu

総合スコア23

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/11/27 03:59

編集2022/11/28 06:56

前提

pythonで相互相関関数を計算するために、numpyのcorrelateを使って二つの関数の時系列的なズレを計算しようとしています。

「時系列データのタイムラグを検知したい!!(相互相関関数)」https://qiita.com/katsuki104/items/d0d2a38efb91557e031c を参考にして計算をしました。
この記事では、np.correlateを使う際には、関数の平均を0にする必要があるとのことです。

ガウス関数のような山の形をしたもの同士の時系列のズレを計算しようとしたのですが、ガウス関数の平均を0とした場合としない場合で計算結果が異なってしまいました。
また、用意した関数のずれと対応した結果となったのは、平均を0としない場合でした。

この違いとなる原因、もしくは、この山形の場合はどちらの結果が正しいと言えるのか教えていただけませんでしょうか?

ちなみに、ノイズのような関数同士の計算では、平均を0にしないとうまくいかないことは確認済みです。

該当のソースコード

Python

1import numpy as np 2import matplotlib.pyplot as plt 3import random 4 5num = 0.01 6low = -10 7high = 5 8sigma1 = 1 9sigma2 = 1 10 11#ガウス関数を二つ用意、理論的には'5'のずれが検出されるはず 12x1 = np.arange(low,high,num) 13y1 = [] 14for i in range(len(x1)): 15 y1.append(np.exp(-x1[i]**2 / 2*(sigma1 **2)) * (1+random.uniform(-0.1,0.1))) 16 17x2 = np.arange(low,high,num) 18y2 = [] 19for i in range(len(x2)): 20 y2.append(np.exp(-(x2[i]+5)**2 / 2*(sigma2 **2)) * (1+random.uniform(-0.1,0.1))) 21 22#平均を0にする操作 23#y1 = [y1[l] - np.mean(y1) for l in range(len(y1))] 24#y2 = [y2[l] - np.mean(y2) for l in range(len(y2))] 25 26#二つのガウス関数のズレを相互相関関数で計算 27corr = np.correlate(y1, y2, "full") 28print(corr.tolist().index(max(corr))) 29estimated_delay = (corr.argmax() - (len(y2) - 1)) * num 30print("estimated delay is " + str(estimated_delay)) 31 32plt.plot(x1,y1,color='red') 33plt.plot(x2,y2,color='blue') 34 35plt.show() 36

補足情報(FW/ツールのバージョンなど)

python 3.7.9
numpy 1.12.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2022/11/28 01:34

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください または、 https://teratail.storage.googleapis.com/uploads/contributed_images/56957fe805d9d7befa7dba6a98676d2b.gif を見て、そのようにしてみてください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
keshigomu

2022/11/28 06:57

ありがとうございます。 コード部分に追加いたしました。
guest

回答1

0

ガウス関数のような形状の信号の場合は,信号成分の大きな時刻が分布の中央,つまり
ごく限られた時間に集中しています。
平均をとるとこの分布の中央部分の値が小さくなり,信号成分がほとんどない両サイドの
部分の値が大きくなります。
これが相互相関関数を取った時に誤差になります。

といっても,もしどちらの信号成分もガウス関数の形状を取ることが分かっているのであれば,
それぞれの分布の中央(時刻)を探して,それを比較することで差が求まります。

例えばyの絶対値をyの総和で割ったものを重みとして,それに対応するxにかけあわせ
和をとることで,その分布の中央を概算できます。
それ差を取れば時刻のズレも容易に計算できると思います。

一応計算例を次に示します。

python

1w1 = np.abs(y1) / np.sum(np.abs(y1)) 2w2 = np.abs(y2) / np.sum(np.abs(y2)) 3 4x1_center = np.sum(x1 * w1) 5x2_center = np.sum(x2 * w2) 6print("x1_center=" + str(x1_center)) 7print("x2_center=" + str(x2_center)) 8
x1_center=-0.0019174038189932654 x2_center=-5.001906100514978

投稿2023/07/04 13:11

ujimushi_sradjp

総合スコア2091

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問