web-dev-qa-db-ja.com

scipy信号find_peaks_cwtはピークを正確に検出していませんか?

ピークを見つけようとする1次元信号があります。私はそれらを完全に見つけることを探しています。

私は現在やっています:

_import scipy.signal as signal
peaks = signal.find_peaks_cwt(data, np.arange(100,200))
_

以下は、find_peaks_cwt()で検出されたピークの位置を示す赤いスポットのあるグラフです。

Signal + Peaks

ご覧のとおり、計算されたピークは十分に正確ではありません。本当に重要なのは右側の3つです。

私の質問:これをより正確にするにはどうすればよいですか?

更新:データはこちら: http://Pastebin.com/KSBTRUmW

背景については、私がしようとしていることは、画像の指の間のスペースを見つけることです。プロットされるのは、手の周りの輪郭のx座標です。シアンの斑点=ピーク。より信頼性の高い/堅牢なアプローチがある場合は、コメントを残してください。

enter image description here

20
cjm2671

解決、解決:

最初にデータをフィルタリングします。

  window = signal.general_gaussian(51, p=0.5, sig=20)
  filtered = signal.fftconvolve(window, data)
  filtered = (np.average(data) / np.average(filtered)) * filtered
  filtered = np.roll(filtered, -25)

次に、ラペルピーの答えに従ってangrelextremaを使用します。

結果:

enter image description here

17
cjm2671

この関数を使用すると、はるかに簡単な解決策があります: https://Gist.github.com/endolith/25086http://billauer.co.il/peakdet .html

あなたが提供したデータを試してみたところ、以下の結果が得られました。事前フィルタリングの必要はありません...

楽しい :-)

peak detection

14
sweetdream

生データを取得した後に編集されます。

argelmaxとarglextrmaは競合していません。

曲線は非常にノイズが多いため、ピーク幅を(pv。で述べたように)小さくしてノイズを再生する必要があります。

私が見つけた最高のものはあまり良くありません。

import numpy as np
import scipy.signal as signal

peakidx = signal.find_peaks_cwt(y_array, np.arange(10,15), noise_perc=0.1)
print peakidx

[10, 100, 132, 187, 287, 351, 523, 597, 800, 1157, 1451, 1673, 1742, 1836]

enter image description here

3
rapelpy