% Reconstrucción IP centrada para r=2s-1. Sin filtros, con cualquier grado para el polinomio interpolador. Tomamos s nodos a la izquierda de x^k_{2i-1} y s a la derecha. 
% Se eliminan todos los coeficicentes de escala.
%       preliipvpcentradogenultim(xx,ff,grau,nivells)
%       Entradas:
%           xx      = nodos de la funcion inicial
%           ff      = f(xx)
%           grau    = grado del polinomio interpolador (r)
%           nivells = niveles de multirresolucion 
%       Salidas:
%           Plot de la reconstruccion(-), funcion en el nivel mas grosero(o), funcion original con mas nodos (--), diferencia original y aproximacion(:) 
%
% Autor: José Jaime Noguera. +INFO: www.uv.es/anims/noguera

function preliipvpcentradogenultim(xx,ff,grau,nivells)

nivells=nivells+1;
[xn,xm]=size(xx);
n=log(xm-1)/log(2); %1+2^n es el tamaño de la entrada
f=zeros(nivells,xm);
x=zeros(nivells,xm);
f(nivells,1:xm)=ff(1:xm);
x(nivells,1:xm)=xx(1:xm);
s=(grau+1)/2; %s son los nodos a la izquierda (y derecha) de x(k,2i-2) en el caso centrado
%BAJANDO NIVELES
for k=nivells:-1:2
   for i=1:1+2^(n-nivells+k-1)
      f(k-1,i)=f(k,2*i-1);
      x(k-1,i)=x(k,2*i-1);
   end 
end
fr=zeros(nivells,xm); %fr significa la reconstruccion
fr(1,1:2^(n-nivells+1)+1)=f(1,1:2^(n-nivells+1)+1); %trabajamos con fr y asi nos aseguramos que ningun dato proviene de f

%SUBIENDO NIVELES
for k=2:nivells   
    ultim=1+2^(n-nivells+k-1); 
    for i=s+1:ultim-s+1
        fr(k,2*i-2)=interpola(x(k-1,i-s:i+s-1),fr(k-1,i-s:i+s-1),x(k,2*i-2));  %Centrado
        fr(k,2*i-1)=fr(k-1,i);
    end

     %fronteras
     fr(k,1)=fr(k-1,1);
     for i=2:s   
          fr(k,2*i-2)=interpola(x(k-1,1:grau+1),fr(k-1,1:grau+1),x(k,2*i-2));  
          fr(k,2*i-1)=fr(k-1,i);
     end
     for i=ultim-s+2:ultim   
         fr(k,2*i-2)=interpola(x(k-1,ultim-grau:ultim),fr(k-1,ultim-grau:ultim),x(k,2*i-2)); 
         fr(k,2*i-1)=fr(k-1,i);
     end   
         
end

[xor,yor]=funtreballtesi(257,0); 

hold on
plot(xor, yor,'--k','LineWidth',2)                                                        %original discretizada con 257 pts 
plot(x(1,1:1+2^(n-(nivells-2+1))),f(1,1:1+2^(n-(nivells-2+1))),'ko')                      %original en el nivel mas grosero
plot(xx,(ff-fr(nivells,1:xm))-(0.1)*ones(1,xm),':k','LineWidth',3)                        %original-reconstruccion
plot(xx,fr(nivells,1:xm),'-k','LineWidth',3)                                              %reconstruccion
axis([0 1 -0.2 1.1 ]);
set(gca,'Xtick',[0 .5 1], 'FontSize',15)
set(gca,'Ytick',[0 .5 1], 'FontSize',15)

box
hold off





