FAQ
FAMOS
FAMOS全般top
└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_*