【Python】ゼロ交差点の検出:Zero Crossing

  • URLをコピーしました!
目次

Zero Crossing

前回、SciPyを使ったピーク検出の方法(find_peaks)を紹介しました。

今回はゼロ交差というY値がゼロになる点を検出する方法(Zero Crossing)を紹介します。

このゼロ交差する点(ゼロ交差点)は値の符号が変わる位置であるため、信号解析で結構有用な値だったりします。

それでは始めていきましょう。

ゼロ交差点

今回もsin波を使って解説していきましょう。

また話を単純化するため、ノイズもない綺麗なsin波を使っていきます。

ということでこんな感じ。

import matplotlib.pyplot as plt
import numpy as np

n = 5

x = range(0, 360)
y = [np.sin(i*np.pi/180*n) for i in x]

plt.plot(x,y)

plt.grid()

plt.show()

実行結果

今回検出するのはこのsin波のなかでy=0となる点です。

綺麗なグラフやグラフ上の点の数が多い場合、ピッタリy=0となるX値を取得することもできるでしょう。

しかし実験等で取得したデータの場合、綺麗にy=0となる点が存在しないことも多々あります。

そのためゼロ点を通る2点を取得します。

そしてどのような時がゼロ点を通る2点になるかというと、Y値がプラスの値からマイナスの値になる時、もしくはマイナスの値からプラスの値になる時です。

つまり連続した2点を掛け算した時にマイナスの値となるものを抽出すれば、必ずゼロ点を通っていることになります。

そのためゼロ交差点を取得するには「y=0となる点」と「連続した2点をかけてマイナスになる点」の2種類を検出すればいいわけです。

ということでこんな感じです。

import matplotlib.pyplot as plt
import numpy as np

n = 5

x = range(0, 360)
y = [np.sin(i*np.pi/180*n) for i in x]

zero_cross_point = []
for i in range(len(y)-1):
    if y[i] * y[i+1] < 0 or y[i] == 0:
        zero_cross_point.append([i, 0])
        
plt.plot(x, y)

for point in zero_cross_point:
    plt.scatter(point[0], point[1], marker="x", color="Red", s=100)
    
plt.grid()

plt.show()

赤い×がゼロ交差点です。

プラスからマイナスかマイナスからプラスか

ゼロ交差点の取得の方法は分かりましたが、先ほどの説明でゼロ交差点は「プラスからマイナスか」、「マイナスからプラスか」という2種類あることをお話ししました。

それならばその情報も取得しておくことに越したことはないでしょう。

先ほどの「y=0となる点」と「連続した2点をかけてマイナスになる点」という条件分岐の他に、「次の点がプラス」、「次の点がマイナス」という2つの条件分岐を追加します。

これにより次の点がプラスに向かっているのかマイナスに向かっているのかが分かります。

import matplotlib.pyplot as plt
import numpy as np

n = 5

x = range(0, 360)
y = [np.sin(i*np.pi/180*n) for i in x]

zero_cross_A = []
zero_cross_B = []
for i in range(len(y)-1):
    if y[i] * y[i+1] < 0 or y[i] == 0:
        if y[i+1] > 0:
            zero_cross_A.append([i, 0])
        elif y[i+1] < 0:
            zero_cross_B.append([i, 0])
        
plt.plot(x, y)

for point in zero_cross_A:
    plt.scatter(point[0], point[1], marker="x", color="Red", s=100)
    
for point in zero_cross_B:
    plt.scatter(point[0], point[1], marker="x", color="Blue", s=100)
    
plt.grid()

plt.show()

と言うことで今回はゼロ交差点に関して解説しました。

次回はリストの要素を飛び飛びに取得する方法を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次