function [Wt,Wtr,T]=PMotionID(N,M,tol)
% Programador: Fredy Vides
% Proyecto: ACRPkG/CICC-UNAH 2020
% Example:
% [Wt,Wtr,T]=PMotionID(33,200,1e-11);

% Generación datos para identificación de movimiento periódico

% Particionamiento de intervalo de tiempo

t=0:2/(N-1):2;

% Generación de geometría discreta

x=-1:2/(M-1):1;

z=@(t)cos(2*pi*t).*(1-x.^2).^3;

% Cómputo de imágenes de identificación

for k=1:N
	plot(x,z(t(k)),'linewidth',5,[-1 1],[0 0],'r.','markersize',20);
	axis ([-1 1 -1 1]);
	axis square;
	axis off;
	print("-dpng",['wave-',num2str(k),'.png']);
end

% Lectura de imágenes para identificación de movimiento periódico

W=double(imread (['wave-1.png']));
imshow(uint8(W));
pause(.1);

% Algoritmo topológico/geométrico elemental de visión computarizada que permite 
% a la computadora "visualizar el movimiento"

R=sparse(size(W,1),size(W,2));
W=W(:,:,1);
DW =del2(W);
f=find(DW);	
Wr=R;
Wr(f)=W(f);
Wt=Wr(:);

for k=2:N
	W=double(imread (['wave-',num2str(k),'.png']));
	imshow(uint8(W));
	pause(.1);
	W=W(:,:,1);
	DW =del2(W);
	f=find(DW);
	Wr=R;
	Wr(f)=W(f);
	Wt=[Wt Wr(:)];
end

% Algoritmo topológico de identificación del movimiento visualizado
% por la computadora

[u,s,~]=svd(Wt,0);

s=diag(s)';

% Reducción topológica de orden de la información visualizada por la 
% computadora

f=find(s>=tol);

Wtr=u(:,f)'*Wt;

% Indentificación de bucle elemental F en S¹ que se utilizará para
% aproximar el periodo del movimiento identificado

wt=abs(fft(Wtr(1,:)))/sqrt(N);

Th=min(wt);

f=find(wt>=Th);

F=@(z)(z.^(floor(N/f(2))))/sqrt(N);

% Aplicación del índice en la aproximación del periodo del 
% movimiento periódico observado
 
T=NGiros(F,0,N);

end
