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... .

7 views (last 30 days)

Show older comments

youjarr
on 9 Jul 2019

Commented: Julia Gionet-Gonzales
on 19 Jun 2024

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.

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

David Sanchez
on 9 Jul 2019

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')

Roberto Rubino
on 21 Oct 2022

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')

Julia Gionet-Gonzales
on 19 Jun 2024

Your code is still only finding the positive zero crossing. This edit will allow you to find both.

zero_crossings_pos = find(abs(diff(Signx)) == 2);

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

Start Hunting!