FAQ

FAMOS

OROS24ユーザーのための質問コーナー

ID.o008

Q. OROSのピーク検出方法について

A.


定義

ピーク検出方法は以下に従います。

(1)   中心のスペクトラムが各方向の2つのスペクトラムより大きいこと

(2)   中心のスペクトラムに対して1つ飛ばした値が予め指定したスレッショルドより小さいこと

これはデータの中心とその隣の2点を以下のように定義した場合、

Data[Z-2]・Data[Z-1]・Data[Z]・Data[Z+2]・Data[Z+2]

以下の条件を満たした場合をピークと判断します。

Data[Z-2] < Data[Z] - スレッショルド
Data[Z-1] < Data[Z]
Data[Z+1] < Data[Z]
Data[Z+2] < Data[Z] - スレッショルド

シーケンス

これらをシーケンスで表現します。

;***********************************************
;OROSピーク検出
;***********************************************

;Parametas -------------------------------------

_k_PeakThresh=5
;-----------------------------------------------
_k_i=1+2
_k_Peak = Leng(0,0)
While _k_i<=Leng?(Data)-2
_k_test=0
    ;---------------------------------------------------------
    ;条件1;中心のスペクトラムが各方向の2つのスペクトラムより大きいこと
    ;条件2;中心のスペクトラムに対して1つ飛ばした値が予め指定したスレッショルドより小さいこと
    ;---------------------------------------------------------

    If Data[_k_i-2]> Data[_k_i]-_k_PeakThresh
        _k_test=1
    End
    If Data[_k_i-1]> Data[_k_i]
        _k_test=1
    End
    If Data[_k_i+1]> Data[_k_i]
        _k_test=1
    End
    If Data[_k_i+2]> Data[_k_i]-_k_PeakThresh
        _k_test=1
    End
    ;--------------------
    If _k_test=0
        _k_Peak = Join(_k_Peak, _k_i)
    End
    _k_i=_k_i+1
End

_k_UnSortY = ValueIndex(data, _k_Peak)     ;Peakはピークを検出したインデックス番号(周波数に相当)
_k_TempX   = Sort(_k_UnSortY,4)            ;ピークのみのデータを大きい順に並べ、そのときのインデックスを取得
_k_TempX   = _k_TempX+1                    ;ソートした結果はX単位ですのでインデックスに変換します。
_k_PeakX   = ValueIndex(_k_Peak, _k_TempX) ;

;Result --------------------------------------------------------
PeakX = (_k_PeakX-1)*XDel?(Data)
PeakY = Sort(_k_UnSortY, 2)

;sweep variable-----------------------------------------
Delete _k_*

上記シーケンスの場合、WHILE文を使用して全データにアクセスしているため、実行時間がかかります。
そこで、FAMOSシーケンスの特徴を活かして以下のように変更します。

;***********************************************
;OROSピーク検出
;***********************************************

;Parametas -------------------------------------

_k_PeakThresh = 5

;-----------------------------------------------
_k_P2 = CutIndex(data, 1  , Leng?(data)-2-2)
_k_P1 = CutIndex(data, 1+1, Leng?(data)-2-1)
_k_P0 = CutIndex(data, 1+2, Leng?(data)-2-0)
_k_F1 = CutIndex(data, 1+3, Leng?(data)-2+1)
_k_F2 = CutIndex(data, 1+4, Leng?(data)-2+2)

_k_P2 = XOff(_k_P2,0)
_k_P1 = XOff(_k_P1,0)
_k_P0 = XOff(_k_P0,0)
_k_F1 = XOff(_k_F1,0)
_k_F2 = XOff(_k_F2,0)

_k_ResP2 = (STri(_k_P0-_k_P2-_k_PeakThresh, 0, 0)+1/2
_k_ResP1 = (STri(_k_P0-_k_P1, 0,0)+1)/2
_k_ResF1 = (STri(_k_P0-_k_F1, 0,0)+1)/2
_k_ResF2 = (STri(_k_P0-_k_F2-_k_PeakThresh, 0, 0)+1)/2
_k_Res   = _k_ResP2*_k_ResP1*_k_ResF1*_k_ResF2

_k_Res  = Join( Leng(0,2), _k_Res)
_k_Res  = Join( _k_Res, Leng(0,2))
_k_Res  = XDel( _k_Res, XDel?(Data))
_k_Res2 = SearchLevel(_k_Res, 2, 1, 0, 2, 0, 0, 1)

_k_PeakX = _k_Res2.X                   ;ピークを検出した周波数

;--------------------------------------
_k_UnSortY = Value(data, _k_PeakX)  ;検出したY値
_k_TempX   = Sort(_k_UnSortY, 4)    ;ピークのみのデータを大きい順に並べ、そのときのインデックスを取得
_k_TempX   = _k_TempX+1             ;ソートした結果はX単位ですのでインデックスに変換します。

;Result --------------------------------------------------------
PeakX = ValueIndex(_k_PeakX, _k_TempX) ;
PeakY = Sort(_k_UnSortY, 2)

;sweep variable-----------------------------------------
Delete _k_*


製品詳細はこちら

<< OROS24ユーザーのための質問コーナーに関するFAQ一覧へ戻る