- ベストアンサー
ピークの検出方法
ある離散時系列データf(x)があったとき、単純に考えれば f'(x)=f(x+1)-f(x)<0.0001,f''(x)=f'(x+1)-f'(x)<0 となるxを求めればピークのxが検出できると思いますが、 f(x)が滑らかでない場合はどんな方法でピークが検出できますでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>f'(x)=f(x+1)-f(x)<0.0001, f''(x)=f'(x+1)-f'(x)<0 .... 基本はこれでOKなので、「f(x)が滑らかでない場合」に引っかかりそうなケースを考えてみましょう。 [誤検出しそうな例] (1) サンプリングしたデータでは、ピークでの増分が 0.0001 未満とは限らない。(つまり、とんがり気味のピークは検出できない) (2) 真のピークではなく、裾野の細かいうねりまで検出するおそれがある。 [対策例] (1) 単純に、f'(x)が正から負へ極性反転したらピークとみなす。 (2) #1 さんの「平滑化」処理を適用する。 (2)' あるいは、f'(x)が正から負へ極性反転したピークの高さに閾値を設定しておく。(つまり、細かなピークは無視する) ピーク検出には、適用分野に応じたノウハウが多数あるようです。
その他の回答 (2)
- inara
- ベストアンサー率72% (293/404)
私が学生時代のとき(ずいぶん前)、分光スペクトルの1階微分(オージェスペクトル)や2階微分スペクトル(ピークが強調される)を取るためにこの手法を使いました。カーブフィッティングするにはピーク位置を知る必要があるのでこの方法が有用です(最近は測定装置にソフトが組み込まれているので実際に計算することはないでしょうが)。これは微分係数を求めるものなので、ピーク位置の検出では、微分値=0となる x を求めるアルゴリズムが別途必要です。 >これをそのまま使えばノイズが取れるのでしょうか? はい。Excelでちょっと実験してみましたが、普通の数値微分ではむちゃくちゃになるノイズ重畳データでも、割ときれいな微分データが得られました。これは Savitsky-Golay filter あるいは Savitsky-Golay smoothing と呼ばれるものです。 >係数やhという値がありますが、どういう原理でこの値が出てきたのでしょうか? h は x の刻み (x[i+1]-x[i])ですが、詳しくは参考資料 [1],[2] を見てください(私はちゃんと理解していませんので)。 データ点 x[i] を何点とるかで、いろいろなパターンがあります。[3] は微分でなく、平滑化の係数です。微分処理前や微分後に使うと、ノイズが取れると思います。 >一つ思ったのが、この方法はノイズの周波数を自在にこちらで決めて係数を設定したりできるのでしょうか? 周波数ドメインの処理はデジタルフィルターを使うのがいいのではないでしょうか。 [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
お礼
回答ありがとうございます。 >はい。Excelでちょっと実験してみましたが、普通の数値微分ではむちゃくちゃになるノイズ重畳データでも、割ときれいな微分データが得ら >れました。これはSavitsky-Golay filterあるいはSavitsky-Golay smoothingと呼ばれるものです。 こちらでも試してみましたが、実際にきれいな微分データが得られました。一方、N点の近似微分公式では、局所的な微分データが出ているようで、元データを大局的に見たときの綺麗な微分データは得られないようでした。Savitsky-Golayのアルゴリズムがかなり有効であることが分かりました。
- inara
- ベストアンサー率72% (293/404)
平滑化数値微分というのがあります[1]。これでもノイズが取れないときは、この数値微分の前に、生データの移動平均処理を行って、ある程度データを滑らかにしてやればいいでしょう。そのとき、移動平均のデータ数を変えて最適な値を探すのが良い思います。 [1] PDFファイルの52ページ http://teils.eng.shizuoka.ac.jp/di2.pdf
お礼
回答ありがとうございます。平滑化数値微分のページを拝見させて頂きました。これをそのまま使えばノイズが取れるのでしょうか?係数やhという値がありますが、どういう原理でこの値が出てきたのでしょうか?一つ思ったのが、この方法はノイズの周波数を自在にこちらで決めて係数を設定したりできるのでしょうか?
お礼
回答ありがとうございます。私の質問内容に誤りがありましたので訂正させて頂きます。正しくはabs(f'(x))=abs(f(x+1)-f(x))<0.0001です。 (1)f'(x)が正から負へ極性反転したらピーク←これはabs(f'(x))<0.0001の条件を使わずにf''(x)<0だけを使うという条件と等価でしょうか? (2)'閾値をピークの高さに設定しておく←これは有効そうですね。データの性質を観測して、f(x)を一番最初に極性反転した位置の何%かに設定しておいて、あとはこの設定値を使うみたいな感じにすればできそうですね。
補足
(1)f'(x)が正から負へ極性反転したらピーク←これはabs(f'(x))<0.0001の条件を使わずにf''(x)<0だけを使うという条件と等価でしょうか? お礼の内容訂正させて頂きます。よく考えてみると等価のはずがありません。傾きの変化が小さくなっただけでもf''(x)<0ですから。 「f'(x+1) < 0 AND f'(x) > 0」の条件になったときのxをピークとみなすということですね!