[H8-ML(3583)] Re: A/D 信号のピーク検出手法
From: "Sakurai Kiyoshi" <sakura@xxxxxxxxxxxx>
Date: 2003年07月08日(火)18時02分42秒
櫻井です
 わさびぃ様 ありがとうございます。
> (★A)
> Data(i-3) < Data(i) &&
> Data(i-2) < Data(i)  &&
> Data(i-1) < Data(i)  &&
> Data(i+1) - Data(i) < 0.05;//0.05っていうのは、ちっちゃい数の意味です
> (★B)
> Data(i-1) - Data(i) < 0.05 &&;//=ある程度以下ちっちゃいの意味です.適
> 宜加工してください
> Data(i+1) < Data(i)  &&
> Data(i+2) < Data(i)  &&
> Data(i+3) < Data(i)
入力値がA/Dの値ですのでData(i+x) == Data(i) または Data(i-x) == Data(i)
の時があると思うのですが、これは上記の判定に入らない。??
すみません。どうも理解が出来ませんでした。

> 櫻井さんの場合には、(★A)と(★B)を常に使うということになりませんか?
> ご検討ください。
リアルタイムなので常に判定はおこなっています。

> これを、エクセルに読み込んで、VBAで簡単な条件を出して
> どうしたらピークなり平らな箇所のエッジがとれるかを
> 黙々と探し出しました。
事後処理ですとmacさんのスプライン関数などでキチッとした値が出そうですね。

恥ずかしいのですが、現在までに考えたプログラムを記載します。

uint	l_peek;   //ピーク値 のバッファ
uint	l_pk_tm1;  //最初のピーク時刻のバッファ
uint	l_pk_tm2;  //最後のピーク時刻のバッファ
uint	on_counter ;  //1ms刻みの時刻(常にカウントアップしています。)

/*------------------------------------------------------------------
/*  ピーク値のレベル比較
/*------------------------------------------------------------------
char level_comp(uint a2 )   //a2は現在A/Dから取り込んだ値です。
{
	if( l_peek < a2 ){   //この判定内は常に昇りのピーク値を更新しています。
		l_pk_tm1=on_counter;   //ピーク値ならバッファに時刻を残します。
		l_pk_tm2=on_counter;
		l_peek = a2;       //ピーク値も残します。
	}else{
		if(l_peek == a2 ) l_pk_tm2=on_counter; //ピークが平らと判定します
                                   //その時最後のピーク時刻を残します。これも
連続なら更新。
		if( (l_peek - 5) >= a2 ){  //ピーク判定の終わりです。
			l_peek_time = (l_pk_tm2+l_pk_tm1)/2;
                                                       //平らなピークの中点
を計算します。
			return( ON );
		}
	}
	return( OFF );
}
今後、これにmacさんの数値微分の考え方を入れて、中点ではないピーク時刻を
計算したものを入れていこうと思います。

ご評価いただければ幸いです。ありがとうございました。

スレッド概略
[3523(R)](起点)
 └[3573(U)]
   └[表示中]
     └[3600(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]