ピークを見つけようとする1次元信号があります。私はそれらを完全に見つけることを探しています。
私は現在やっています:
_import scipy.signal as signal
peaks = signal.find_peaks_cwt(data, np.arange(100,200))
_
以下は、find_peaks_cwt()
で検出されたピークの位置を示す赤いスポットのあるグラフです。
ご覧のとおり、計算されたピークは十分に正確ではありません。本当に重要なのは右側の3つです。
私の質問:これをより正確にするにはどうすればよいですか?
更新:データはこちら: http://Pastebin.com/KSBTRUmW
背景については、私がしようとしていることは、画像の指の間のスペースを見つけることです。プロットされるのは、手の周りの輪郭のx座標です。シアンの斑点=ピーク。より信頼性の高い/堅牢なアプローチがある場合は、コメントを残してください。
解決、解決:
最初にデータをフィルタリングします。
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を使用します。
結果:
この関数を使用すると、はるかに簡単な解決策があります: https://Gist.github.com/endolith/25086http://billauer.co.il/peakdet .html
あなたが提供したデータを試してみたところ、以下の結果が得られました。事前フィルタリングの必要はありません...
楽しい :-)
生データを取得した後に編集されます。
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]