% PPH para IP de grado 3. 
%       preliipvpphultim(xx,ff,nivells)
%       Entradas:
%           xx      = nodos de la funcion inicial
%           ff      = f(xx)
%           grau    = grado del polinomio interpolador (r)
%           nivells = niveles de multiresolucion 
%       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 preliipvppphultim(xx,ff,nivells)
grau=3; %grado utilizado
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);

%BAJANDO NIVELES POR VP
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=3:ultim-1
        fr(k,2*i-2)=(1/2)*(fr(k-1,i-1)+fr(k-1,i))-(1/8)*armonica(fr(k-1,i-2)-2*fr(k-1,i-1)+fr(k-1,i),fr(k-1,i-1)-2*fr(k-1,i)+fr(k-1,i+1));
        fr(k,2*i-1)=fr(k-1,i);
    end
    %fronteras
    fr(k,1)=fr(k-1,1);
    fr(k,2*2-2)=interpola(x(k-1,1:grau+1),fr(k-1,1:grau+1),x(k,2*2-2));  
    fr(k,2*2-1)=fr(k-1,2);
    fr(k,2*ultim-2)=interpola(x(k-1,ultim-grau:ultim),fr(k-1,ultim-grau:ultim),x(k,2*ultim-2)); 
    fr(k,2*ultim-1)=fr(k-1,ultim);
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





