櫻井です
わさびぃ様 ありがとうございます。
> (★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さんの数値微分の考え方を入れて、中点ではないピーク時刻を
計算したものを入れていこうと思います。
ご評価いただければ幸いです。ありがとうございました。