こんにちは。
整形外科医師ブロガーのボククボです。
今回は、MATLAB初心者向けの
ワンポイント情報です。
midcross関数は頻繁に使用される
基本関数ですが、
イマイチ、オプションが少ないですよね。
今回は、立ち上がり時(あるいは下降時)のみの
midcross時刻を検出する方法をご紹介します。
目次
midcross関数
下の画像は、とあるセンサの時系列データzです。
周期的に極大を取るようなデータです。
今回取り扱うデータが必要であれば、
下からExcelファイルをダウンロードしてください
さて、midcross関数を使ってみます。
midcross(z)
と入力すると下のグラフが得られます。
デフォルトのmidcross関数では、
極大値の50%をとるような
時刻、センサ値を得られます。
(正確な定義は、公式ドキュメントをご参照ください)
×印がmidcrossの点ですね。
ちなみに、‘50%’という値は
midcross(z,'MidPercentReferenceLevel','xx%')
と指定すると、xx%に変更することができます。
(コピペ必須なぐらい長いですね。。。)
midcrossはセンサのオン/オフ判定にも
使いやすいので、
立ち上がり時の時刻のみを検出したい
という場合があると思います。
というわけで、方法をご紹介します。
立ち上がり時のみの時刻を検出する
方法1.少し厳密性に欠けるが簡単
わかりやすいように1行ずつ分解して記載します。
%通常のmidcross crossingtime=midcross(z); %zを時間で微分 delta_z=diff(z); %zの時間微分が正の時刻を抽出 risingtime=find(delta_z>0); %zの時間微分が正、かつ、midcrossである時刻 rising_midcross=intersect(risingtime,crossingtime);
まあ、要するにzの時間微分が正の時刻(傾き>0)
との積集合をとっただけです。
一行で記載すれば、
rising_midcross=intersect(find(diff(z)>0),round(midcross(z)));
になりますね。
これで十分事足りると思いますが、
一応midcrossは小数点以下まで返すので、
これではもとのmidcrossと少しずれが生じます。
図示してみると
%%midcrossとrisingmidcrossを図示 midcross(z);hold on scatter(rising_midcross,z(rising_midcross));
まあ、センサであれば、サンプリング精度以下の話なので
これでいいと思います。
どうせ利用するときには、小数点以下切り捨てますし。
方法2.小数点以下も考慮
midcrossで検出された時刻をそのまま利用する方法です。
%midcross crossingtime=midcross(z); %zの時間微分 delta_z=diff(z); %spline補間によって、midcross時刻での微分係数をそれぞれ求める delta_z_at_crossing=... interp1([1:length(delta_z)],delta_z,crossingtime,'spline'); %midcross時刻の微分係数が正のcrossingtimeを検出 rising_midcross=crossingtime(delta_z_at_crossing>0);
これで、midcrossで得た時刻をそのまま利用できます。
図示すると
っていう感じで、意図通りになっています。
まとめ
いかがでしょうか。
個人的には、方法1で十分かなと思いましたが、
用途によって、使い分けてください。
rising_midcross(なんかカッコいい)
なんてていう、自作関数にしてもいいかもしれません。
下降時のみ検出するには、コード中の’>0’を
’<0’に書き換えるだけですね。
もっと良い方法があれば教えてください。