交互に正負反転して現れるパターンの一方のみを残したい(削除したい)
7 views (last 30 days)
Show older comments
[Matlab初心者です]
「順回転→静止→逆回転」を繰り返す振り子の順回転時の加速度データのみ得ようと試みています.
データは図(上)のように,逆方向へのスパイクに続いて回転方向への加速度が現れるパターンとなっています(縦軸:加速度,横軸:時間).
スパイクを含めて,順(正)方向への回転時の加速度のみのデータ図(下)にする良い方法があればご教示願いたいです.
直近で,自身で下述の方法
⓪加速度±5を0に置き換え,静止時を0にする
①findpeaksで順回転時のピークサーチ,peak Widthを取得
②ピークの平均的な間隔(avet (s))の取得
③ピークから avet / 2 前タイミング(delRef)を取得
④ delRefから± peak Width (s)を0に置き換える
を試したのですが,ディテクトされるピークの位置が山ごとに違うので,どうしても削除しきれなかったり削り過ぎてしまったりします.
浅慮かもしれませんが,今後似たようなデータを多量に取得する予定なので,なにか良い方法をご存じな方がいましたらご教示ください.
2 Comments
Hernia Baby
on 17 Jun 2022
Edited: Hernia Baby
on 17 Jun 2022
すみません。数点教えてください。
①findpeaksで順回転時のピークサーチ,peak Widthを取得
順回転は負の方向ですか?
peaks Widthとは何でしょうか?
②ピークの平均的な間隔(avet (s))の取得
これはピーク間の横軸距離の平均という意味ですね
③ピークから avet / 2 前タイミング(delRef)を取得
④ delRefから± peak Width (s)を0に置き換える
xを横軸とすると各ピークに対して±Δ(x/2)だけ0に変更するであってますか?
Answers (2)
Hernia Baby
on 17 Jun 2022
■データの準備
勝手ながら画像からデータを作成しました。
なのでこの工程は無視してください。
clear,clc;
load data.mat;
x = Data(:,1)';
y = Data(:,2)';
figure
hold on
plot(x,y,'o-','Color', [.4,.4,.4]);
x1 = linspace(0,x(end),1e3)';
y1 = interp1(x,y,x1);
plot(x1,y1,'r:')
hold off
■加速度±5を0に置き換え,静止時を0にする
加速度が大きい気もしますが、5を閾値とします
y1(abs(y1)<=5) = 0;
figure
hold on
plot(x,y)
plot(x1,y1)
hold off
■findpeaksで順回転時のピークサーチ,peak Widthを取得
値が20以上のものからピークサーチします
[pks,locs,w,p] = findpeaks(y,x,'MinPeakHeight',20);
% 確認用
figure
findpeaks(y1,x1,'MinPeakHeight',20,'Annotate','extents')
■ピークの平均的な間隔(avet (s))の取得
w_mean = mean(w)
■ピークから avet / 2 前タイミング(delRef)を取得
論理値をとります
for ii = 1: length(locs)
idx(:,ii) = double((x1(:) <= locs(ii) + w_mean/2) & (x1(:) >= locs(ii) - w_mean/2));
end
idx_any = any(idx,2);
■ delRefから± peak Width (s)を0に置き換える
y2 = y1;
y2(~idx_any) = 0;
■確認
figure
plot(x,y,'-','Color',[.6 .6 .6]);
hold on
plot(x1,y2,'r')
hold off
3 Comments
Atsushi Ueno
on 17 Jun 2022
fs = 100; f = 1; w = 2 * pi * f; t = 0:1/fs:4; % サンプルデータの時刻t[sec]
y = (sin(w*t) > 0.7) * 50 - (sin(w*t) < -0.7) * 50 + (rand(size(t)) - 0.5) * 20;
y(12:fs:end) = -30 - rand(size(y(12:fs:end))) * 30; % サンプルデータのy座標
plot(t,y); % サンプルデータ。ちょっとキレイ過ぎるかな
y2 = y;
y2(abs(y-mean(y2)) < 0.5*std(y2)) = 0; % 変化の小さい数値を0にする
[posw,posinicrs,posfincrs] = pulsewidth(max(0,y2),fs); % 順方向(0以上の正極性)パルス幅
[negw,neginicrs,negfincrs] = pulsewidth(y2,fs,'Polarity','negative'); % 逆方向とスパイク(負極性)パルス幅
posfincrs = floor(posfincrs(posw > 0.1) * fs); % 順方向パルスの最終遷移時刻を得る
neginicrs = floor(neginicrs(negw < 0.05) * fs); % スパイクの初回遷移時刻を得る
mask = zeros(size(y2)); % スパイクの初回遷移時刻⇒順方向パルスの最終遷移時刻のマスクを作成
for i = 1:numel(posfincrs)
mask(1,neginicrs(i):posfincrs(i)) = 1;
end
figure
plot(t,y,'-','Color',[.6 .6 .6]);
hold on
plot(t,y.*mask,'r','LineWidth',2)
hold off
See Also
Categories
Find more on スペクトル測定 in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!