% Multirresolución mediante reconstrucción AC sin utilizar ningun tipo de adaptacion, sólo en las fronteras.
%    capiamincmccentradou(xx,ff,nl,nr,grau,nivells)
%    Entradas:
%           xx       = nodos de la funcion inicial
%           ff       = f(xx)
%           nl       = numero de nodos a la izquierda de f^{k}_{2i-1} donde aproximamos
%           nl       = numero de nodos a la derecha de f^{k}_{2i-1} donde aproximamos          
%           grau     = grado del polinomio interpolador para F (r-1 para f)
%           nivells  = niveles de multiresolucion
%    Salida:
%           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 capiamincmccentradou(xx,ff,nl,nr,grau,nivells)
grau=grau-1; %Por consonancia pon el PDF
nivells=nivells+1;
[xn,xm]=size(xx);
n=log(xm)/log(2);
f=zeros(nivells,xm);
x=zeros(nivells,xm);
f(nivells,1:xm)=ff(1:xm);
x(nivells,1:xm)=xx(1:xm);
hold on

%BAJANDO NIVELES
for k=nivells:-1:2
   for i=1:2^(n-(nivells-k+1))
      f(k-1,i)=(1/2)*(f(k,2*i-1)+f(k,2*i));
      x(k-1,i)=(x(k,2*i)+x(k,2*i-1))/2;
   end 
end    
  fr=zeros(nivells,xm);
  fr(1,1:2^(n-(nivells-1)))=f(1,1:2^(n-(nivells-1)));

%SUBIENDO NIVELES
for k=2:nivells
     ultim=2^(n-(nivells-k+1));
     for i=nl+1:ultim-nr
        fr(k,2*i-1)=capiamincmccoefisolu(nl,nr,grau)*fr(k-1,i-nl:i+nr)';  
        fr(k,2*i)=2*fr(k-1,i)-fr(k,2*i-1);
     end

     %FRONTERAS
     %Por la izquierda     
     for i=1:nl
        if(i-nl<=0)
            nl2=i-1;
        else   
           nl2=nl;
        end   
        nr2=nl+nr-nl2+1;
        fr(k,2*i-1)=capiamincmccoefisolu(nl2,nr2,grau)*fr(k-1,i-nl2:i+nr2)';  
        fr(k,2*i)=2*fr(k-1,i)-fr(k,2*i-1);
     end
     %Por la derecha
     for i=ultim-nr+1:ultim
        if(i+nr>ultim)      
         nr2=ultim-i;
        else   
           nr2=nr;
        end   
        nl2=nl+nr-nr2;
        fr(k,2*i-1)=capiamincmccoefisolu(nl2,nr2,grau)*[fr(k-1,i-nl2:i+nr2)]';  
        fr(k,2*i)=2*fr(k-1,i)-fr(k,2*i-1);
     end
     %FIN FRONTERAS 
     
end   

[xor,yor]=funtesi(256,0); 

hold on
plot(xor, yor,'--k','LineWidth',2)                                            %original discretizada con 256 pts 
plot(x(1,1:2^(n-(nivells-2+1))),f(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
    
