プログラミング

【MATLAB】midcross関数で立ち上がり時だけをとらえる方法

更新日:

こんにちは。

整形外科医師ブロガーのボククボです。

今回は、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));
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で得た時刻をそのまま利用できます。

図示すると

midcross

っていう感じで、意図通りになっています。

まとめ

いかがでしょうか。

個人的には、方法1で十分かなと思いましたが、

用途によって、使い分けてください。

rising_midcross(なんかカッコいい)
なんてていう、自作関数にしてもいいかもしれません。

下降時のみ検出するには、コード中の’>0’を
’<0’に書き換えるだけですね。

もっと良い方法があれば教えてください。

-プログラミング
-, , , , , ,

Copyright© ボククボのブログ , 2020 All Rights Reserved Powered by STINGER.