Cut Sinusoidal signal in a integer number of periods

9 visualizaciones (últimos 30 días)
youjarr
youjarr el 9 de Jul. de 2019
Respondida: Roberto Rubino el 21 de Oct. de 2022
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 comentarios
youjarr
youjarr el 9 de Jul. de 2019
Editada: youjarr el 9 de Jul. de 2019
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 el 9 de Jul. de 2019
Editada: youjarr el 9 de Jul. de 2019
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?

Iniciar sesión para comentar.

Respuesta aceptada

David Sanchez
David Sanchez el 9 de Jul. de 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')
  1 comentario
youjarr
youjarr el 9 de Jul. de 2019
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.

Iniciar sesión para comentar.

Más respuestas (1)

Roberto Rubino
Roberto Rubino el 21 de Oct. de 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')

Productos


Versión

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by