スポンサーリンク とりあえず検索 †平滑化数値微分というのがあります[1]。これでもノイズが取れないときは、この数値微分の前に、生データの移動平均処理を行って、ある程度データを滑らかにしてやればいいでしょう。そのとき、移動平均のデータ数を変えて最適な値を探すのが良い思います。 [1] PDFファイルの52ページ http://teils.eng.shizuoka.ac.jp/di2.pdf [対策例] (1) 単純に、f'(x)が正から負へ極性反転したらピークとみなす。 (2) #1 さんの「平滑化」処理を適用する。 (2)' あるいは、f'(x)が正から負へ極性反転したピークの高さに閾値を設定しておく。(つまり、細かなピークは無視する) [1] Savitzky-Golay アルゴリズム http://www.hulinks.co.jp/support/flexpro/v7/dataanalysis_SavitzkyGolay.html [2] 1階微分の5点以降の係数の求め方(ANo.1の回答) http://okwave.jp/qa1371554.html [3] 平滑化の係数表(PDF 79ページ:5〜25点) http://www.biochem.northwestern.edu/Keck/PDF%20documents/CD/Spectra%20Manager%20Software.pdf Savitsky-Golayのアルゴリズムがかなり有効であることが分かりました。 avitzky-Golayの平滑化/平滑化微分"として有名なもので、例えば下記のURL(pdf)に係数の例が載っています。ちなみに、5点の場合の係数は、ご質問にある「1,-8,0,8,-1」とは異なり、「-2,-1,0,1,2」のようになります。 参考URL:http://tribo.mech.tut.ac.jp/class/SurfaceAnalysis/SavitzkyGolay.pdf LabVIEW6にて、PeakDetecterでピーク位置を推定する機能を使っております。 Peak Detectorに関してのご質問についての回答です。 まず、配列の中にある連続した点を抽出します。 これは配列の最初から始めます。 例えば10点の点を抽出すると仮定します。 その10点の点を通る曲線に最も近い二次関数を計算し、その二次関数を微分します。 もしピークがなければ、 微分した式=0 の関係は成り立ちません。 ピークがあるときは必ず微分式=0となる解を持ちます。 その次は配列をひとつずらした10点を抽出し、また同じ作業を行います。 配列では整数xに対してのyの値を取りますが、ピークは小数部分まで計算されます。 配列をずらした後にもピークが確認される時は、その前までの計算結果によりさらに詳しい二次関数を作ることができ、結果の値もより詳しいものとなります。 データはノイズの乗っかったものになっているため、上の計算はノイズをスムーズ化してからなされます。 二次関数による近似値での算出とノイズにより、ピークの検出は必ずしも正しいものではありませんのでご了承ください。 数学的にピークを検出する一番簡単な方法はデータの中で1階微分値が0であり 2階微分値がマイナスであるデータ点がピークと判断できますので この方法をご利用いただくことをお勧めします。 Savitsky-Golay †
スポンサーリンク |