SciPy で離散データのピークを検出
離散データのピークを検出する SciPy の関数の使い方をメモ。 argrelmax で極大値、argrelmin で極小値のインデックスが取得できます。自分で微分とかしなくていいので簡単です。 argrelextrema は上記二つの関数を一般化したもので、comparator に numpy.greater を指定すると極大値、numpy.less を指定すると極小値のインデックスを返します。
import numpy as np from scipy import signal from scipy.fftpack import fft, fftshift import matplotlib.pyplot as plt N = 51 w = signal.hann(N) A = fft(w, 2048) / (len(w)/2.0) freq = np.linspace(-0.5, 0.5, len(A)) response = 20 * np.log10(np.abs(fftshift(A / abs(A).max()))) # 極大値のインデックスを取得 maxId = signal.argrelmax(response) # maxId = signal.argrelextrema(response, np.greater) # 極小値のインデックスを取得 minId = signal.argrelmin(response) # minId = signal.argrelextrema(response, np.less) plt.plot(freq, response) plt.plot(freq[maxId], response[maxId], "ro") plt.plot(freq[minId], response[minId], "bo") plt.axis("tight") plt.show()
