% Reconstrucción IC con ENO 
%       preliipmcenogenu(xx,ff,nivells,grau)
%       Entradas:
%           xx       = nodos de la funcion inicial
%           ff       = f(x)
%           nivells  = niveles de multiresolucion 
%           grau     = grado del polinomio interpolador para F (grau-1 para f)
%       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 preliipmcenogenu(xx,ff,nivells,grau)

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);
r=grau;
r1=r-1; %ver el pdf ya que lo tengo como el grado del poli es r+1 y de ahi este r1

%%%%%%%%%%%%%%BAJO 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))); %fr es la reconstruccion

%%%%%%%%%%%%%SUBO NIVELES%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for k=2:nivells   
   ultim=2^(n-(nivells-k+1));
   
   %ENO PARA MC%%%%%%%%%%%%%%%%%%%%%%
   for i=r+1:ultim-r+1
    for l=i-r+1:i
       dd=difdiv(x(k-1,l:l+r-1),fr(k-1,l:l+r-1),r);
       dif(l)=abs(dd(r,r));
     end
     [minim,pos]=min(dif(i-r+1:i));
     is(i)=i+pos-r;
   end
   % FIN ENO %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   
   %fronteras (se puede ajustar más, pero lo dejamos asi)
   for i=1:r
      is(i)=i;
   end
   for i=ultim-r+2:ultim
      is(i)=i-r1;
   end   
   %fin fronteras   
  
   for i=1:ultim 
      nl=is(i)-i;
      b=coeficientesipmc(nl,r1);
      fr(k,2*i-1)=b*fr(k-1,is(i):is(i)+r1)';
      fr(k,2*i)=2*fr(k-1,i)-fr(k,2*i-1);
   end
   
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