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()
15071601.png

コメント

Comments powered by Disqus
書籍更新情報
2017-04-18
Pythonによる科学技術計算 基礎編
固定版:1.5版、リフロー版:1.2版への更新が可能になりました。
サポートページはこちら
電子書籍