Cut Sinusoidal signal in a integer number of periods

5 ビュー (過去 30 日間)
youjarr
youjarr 2019 年 7 月 9 日
回答済み: Roberto Rubino 2022 年 10 月 21 日
Hey guys,
I have an measurement of three sinusoidal signals.
But it is enough to only work with one in this case.
The measurement doesn´t have an int number of periods and i need to cut for my further work.
To make it more clear here is an picutre:
In this case we have 4 periods.
2019-07-09_09-41-27.png
So i have to find the first negative to positive zero corssing and the last negative to positive zero crossing.
I found this code in the forum but it don´t work with my files but maby it can help u ?!
t = linspace(0,10*pi,200);
x = sin(t);
mcs = x .* circshift(x, [0 -1]);
zxix = find(mcs <= 0);
for k1 = 1:2:size(zxix,2)-1
zx(k1) = interp1(x(zxix(k1):zxix(k1)+1), t(zxix(k1):zxix(k1)+1), 0);
end
figure(1)
plot(t, x)
hold on
plot(zx, zeros(size(zx)), '+r', 'MarkerSize',10)
hold off
grid
I hope u can help me.
Thanks in advance
  2 件のコメント
youjarr
youjarr 2019 年 7 月 9 日
編集済み: youjarr 2019 年 7 月 9 日
Now I got this:
with this:
index1 = find(y > 0, 1, 'first');
index2 = find(y > 0, 1, 'last');
yCropped = y(index1:index2);
xCropped = x(index1:index2);
But I still need to remove one half period... .
youjarr
youjarr 2019 年 7 月 9 日
編集済み: youjarr 2019 年 7 月 9 日
With this:
index1 = find(y > 0, 1, 'first');
index2 = find(y > 0, 971, 'last');
yCropped = y(index1:index2);
xCropped = x(index1:index2);
I get what i want but how can i find this 971 automtically?

サインインしてコメントする。

採用された回答

David Sanchez
David Sanchez 2019 年 7 月 9 日
Hi,
bear in mind that the sampling of your curve might play an important role in the game.
The code below might help you out:
t = linspace(0,10*pi,200);
x = sin(t);
zero_crossings_pos = [];
for kind = 1:length(t)-1
if (x(kind) <= 0) && (x(kind+1) > 0)
zero_crossings_pos = [zero_crossings_pos kind];
end
end
figure,
plot(t,x,t,x,'o')
hold on
plot(t(zero_crossings_pos),x(zero_crossings_pos),'r*')
hold off
xlabel('x')
ylabel('sin(x)')
title('sin')
t_crop = t(zero_crossings_pos(2):zero_crossings_pos(5));
x_crop = x(zero_crossings_pos(2):zero_crossings_pos(5));
figure,
plot(t_crop,x_crop)
xlabel('x')
ylabel('sin(x)')
title('Cropped sin')
  1 件のコメント
youjarr
youjarr 2019 年 7 月 9 日
Thanks for your answer.
I tried the code and had to change a small thing but now it works:
t_crop = t(zero_crossings_pos(1,1):zero_crossings_pos(1,end));
x_crop = x(zero_crossings_pos(1,1):zero_crossings_pos(1,end));
Thank you very much.

サインインしてコメントする。

その他の回答 (1 件)

Roberto Rubino
Roberto Rubino 2022 年 10 月 21 日
Here is a solution equivalent to the one of @David Sanchez, but faster when dealing with large vectors:
t = linspace(0,14*pi,1e6);
x = sin(t+1);
% Find the negative-to-positive crossings ==========================
Signx = sign(x);
zero_crossings_pos = find(diff(Signx)>0);
% =========================================================
t_crop = t(zero_crossings_pos(1)+1:zero_crossings_pos(end));
x_crop = x(zero_crossings_pos(1)+1:zero_crossings_pos(end));
plot(t,x)
hold on
plot(t_crop,x_crop)
legend('non-cropped sine','cropped sine')
xlabel('x')
ylabel('sin(x)')
title('Cropped sin')

カテゴリ

Help Center および File ExchangeCorrelation and Convolution についてさらに検索

製品


リリース

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by