交互に正負反転して現れるパターンの一方のみを残したい(削除したい)
20 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
[Matlab初心者です]
「順回転→静止→逆回転」を繰り返す振り子の順回転時の加速度データのみ得ようと試みています.
データは図(上)のように,逆方向へのスパイクに続いて回転方向への加速度が現れるパターンとなっています(縦軸:加速度,横軸:時間).
スパイクを含めて,順(正)方向への回転時の加速度のみのデータ図(下)にする良い方法があればご教示願いたいです.
直近で,自身で下述の方法
⓪加速度±5を0に置き換え,静止時を0にする
①findpeaksで順回転時のピークサーチ,peak Widthを取得
②ピークの平均的な間隔(avet (s))の取得
③ピークから avet / 2 前タイミング(delRef)を取得
④ delRefから± peak Width (s)を0に置き換える
を試したのですが,ディテクトされるピークの位置が山ごとに違うので,どうしても削除しきれなかったり削り過ぎてしまったりします.
浅慮かもしれませんが,今後似たようなデータを多量に取得する予定なので,なにか良い方法をご存じな方がいましたらご教示ください.
2 comentarios
Hernia Baby
el 17 de Jun. de 2022
Editada: Hernia Baby
el 17 de Jun. de 2022
すみません。数点教えてください。
①findpeaksで順回転時のピークサーチ,peak Widthを取得
順回転は負の方向ですか?
peaks Widthとは何でしょうか?
②ピークの平均的な間隔(avet (s))の取得
これはピーク間の横軸距離の平均という意味ですね
③ピークから avet / 2 前タイミング(delRef)を取得
④ delRefから± peak Width (s)を0に置き換える
xを横軸とすると各ピークに対して±Δ(x/2)だけ0に変更するであってますか?
Respuestas (2)
Hernia Baby
el 17 de Jun. de 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 comentarios
Atsushi Ueno
el 17 de Jun. de 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
1 comentario
Ver también
Categorías
Más información sobre スペクトル測定 en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!