解析区間の指定方法について

下に解析対象のサンプルデータをお示しします.
ある物体の加速度を示しており,
加速後,だいたい一定の速度でしばらく進み,減速するような波形となっています.
速度がほぼ一定の区間を指定する為に,
開始点:最大の加速度の20%の加速度となった点
終了点:最小の加速度(減速時)の20%に達した点
の条件でデータの範囲を指定したいと思っております.
だいたい下記の赤線グラフの水色線で示した範囲になります.
方法ご教授いただければ幸いです.よろしくお願いいたします.
load('data.mat');
plot(a)

 Respuesta aceptada

Kojiro Saito
Kojiro Saito el 1 de Mayo de 2023

1 voto

いくつかやり方はありますが、find関数でfind(x, n)である条件のn番目の点を見つけられるので、これを使ってみたら簡単かと思います。
load('data.mat')
plot(a)
% 加速度の最大値の20%以下の最初の点 (n=1)
xStart = find(a <= max(a)*0.2, 1)
xStart = 41
% 加速度の最小値の20%以下の最初の点 (n=1)
xEnd = find(a <= min(a)*0.2, 1)
xEnd = 337
% 開始点と終了点の線を描画
xline([xStart xEnd], 'r')
% 開始点と終了点のデータを抽出
b = a(xStart:xEnd);
plot(b)

5 comentarios

Sho
Sho el 1 de Mayo de 2023
Editada: Kojiro Saito el 2 de Mayo de 2023
ご回答いただきありがとうございます.
今回示したものと同じようなデータは複数あり,なかには開始時の加速度が
20%を下回っているものも含まれます.
次に示すのはそのような例になります.
load('data2.mat')
plot(b)
% 加速度の最大値の20%以下の最初の点 (n=1)
xStart = find(b <= max(b)*0.2, 1)
xStart = 1
% 加速度の最小値の20%以下の最初の点 (n=1)
xEnd = find(b <= min(b)*0.2, 1)
xEnd = 372
% 開始点と終了点の線を描画
xline(xStart, 'r')
xline(xEnd, 'r')
上記のように開始点が0フレームとなってしまい,望んだ解析区間となりません.
先述のデータや今回のデータを含む解析を行う際に,一つのコードで同じような解析区間を指定することは可能でございますでしょうか?
Kojiro Saito
Kojiro Saito el 2 de Mayo de 2023
隣接データの差分を取るdiff関数を使って、最大値・最小値の20%以下かどうかの判定フラグ(1 or 0)が切り替わる点を見つければ実現できそうです。
load('data.mat')
plot(a)
xStart = find(diff(a <= max(a)*0.2), 1)
xStart = 40
xEnd = find(diff(a <= min(a)*0.2), 1)
xEnd = 336
xline([xStart xEnd], 'r')
data2.matの場合も正しい点を見つけられています。
load('data2.mat')
plot(b)
xStart = find(diff(b <= max(b)*0.2), 1)
xStart = 62
xEnd = find(diff(b <= min(b)*0.2), 1)
xEnd = 371
xline([xStart xEnd], 'r')
Sho
Sho el 2 de Mayo de 2023
ご回答いただき誠にありがとうございます.
たびたび申し訳ありません.
解析区間を加速度変化のない範囲で指定したいと思っておりまして,
具体的には開始点を下図の太青線あたりになるように指定したく思っております.
diff(b <= max(b)*0.2)での出力結果を見ますと,0から1に切り替わる点(1から0の点ではなく)
のみfind関数で発見できれば,上記の指定ができそうかと思ったのですが,
そのようなことは可能でしたでしょうか?
また,理解が追いついておらず大変申し訳ありませんが,
diff関数を使います次のフレームとの差分で計算する関係から,1フレームずれが生じると思うのですが,
いかがでしょうか?
フレームをあわせるとすると
xEnd = find(diff(b <= min(b)*0.2), 1) + 1
とすればよいでしょうか?
細かい点,恐れ入りますがご教授いただければ幸いです.
よろしくお願いいたします.
Kojiro Saito
Kojiro Saito el 2 de Mayo de 2023
Editada: Kojiro Saito el 2 de Mayo de 2023
>diff(b <= max(b)*0.2)での出力結果を見ますと,0から1に切り替わる点(1から0の点ではなく)のみfind関数で発見できれば,上記の指定ができそうかと思ったのですが,そのようなことは可能でしたでしょうか?
diffの結果をプロットしてみると
plot(diff(b <= max(b)*0.2))
加速度が最大値の20%より大きいところから20%以下になるところで-1、20%以下から20%より大きくなるところで+1の結果になっています。この+1を見つける方法で検出できませんか。
なお、diff関数は要素2マイナス要素1が要素1に格納されるので、おっしゃるとおり1フレームずれるので+1をする必要がありました。
xStart = find(diff(b <= max(b)*0.2) == 1, 1) +1
Sho
Sho el 2 de Mayo de 2023
無事に行いたいことが達成できました.
どうもありがとうございます!

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre MATLAB en Centro de ayuda y File Exchange.

Productos

Versión

R2020b

Etiquetas

Preguntada:

Sho
el 1 de Mayo de 2023

Comentada:

Sho
el 2 de Mayo de 2023

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!