🎵

Pythonでゼロ交差数を求める

2023/06/01に公開

はじめに

ゼロ交差数は、信号の振幅の正負が何回入れ替わるかを表す値です。
信号の周波数が大きいデータや雑音が多いデータだと大きくなります。

ゼロ交差数の求め方

pythonのfor文は用いずにnumpyで計算します。
信号データの形式が1次元配列の場合は、以下のように記述すればゼロ交差数を求められます。

import numpy as np

x = [1,-1,-2,1,2,3,0]  #信号データ
x = np.array(x) #numpyの配列へ
sign_count = np.where(x * np.roll(x, shift=1) < 0, 1, 0)[1:] 
zero_count = sign_count.sum() 
zero_count #2

処理のポイントはx * np.roll(x, shift=1)であり、np.rollで配列の要素を右に1個ずらして掛け算を行います。

(np.rollの仕様上、)x * np.roll(x, shift=1)の計算結果の一番最初の要素は、配列xの一番最初の要素と最後の要素の掛け算となっているので除外します。([1:])

x * np.roll(x, shift=1)の1つの要素が負であれば、振幅の正負が1回入れ替わるということを意味するので、x * np.roll(x, shift=1)の和を取ることでゼロ交差数を求めることができます。


余談ですが、信号が複数あり、データの形式が2次元配列の場合は、以下のように記述すればゼロ交差数を求められます。

import numpy as np

x = [[1,-1,-2,1,2,3,0] ,[1,-1,-2,1,2,3,-2]]
x = np.array(x) 
sign_count = np.where(x * np.roll(x, shift=1, axis=1) < 0, 1, 0)[:,1:]
zero_count = sign_count.sum(axis=1)
zero_count #array([2, 3])

1次元配列での処理の差分は、(1)numpyの処理をどのaxis方向に行うか指定すること(ex.np.roll(x, shift=1, axis=1))(2)スライシングの際にどのaxisをスプライシングするか記述すること(ex.[:,1:])です。

Discussion