function [ x_post, P_prior, NP_prior ] = stimTV( lambda, tau, LB, A, C, Q, R, y, x0_, P0 )

T = length(y);
[outs,states] = size(C);

x_post = zeros(states,T);                           % stima
P_prior = zeros(states,states,T);                   % varianza a priori
NP_prior = zeros(1,T);                              % traccia varianza a priori 

for t=1:LB+1                                        % ciclo da 0 a N nel paper  
    
    P = P0;                                         % inizializzazione ad ogni ciclo
    x = x0_ + gamma_tk(t,1,tau(1))*...              % da x0 a priori a x0 a posteriori
        P0*C'*pinv(C*P0*C' + R)*( y(:,1) - C*x0_ ); %
    
    for k=2:t
        g = gamma_tk(t,k-1,tau(k-1));
        P = A*P*A'+Q-g*A*P*C'*inv(C*P*C'+R)*C*P*A';
        x = A*x+g*P*C'*pinv(C*P*C'+R)*(y(:,k-1)-C*A*x);
    end
    
    P_prior(:,:,t)=P;                               % assegnazione a fine ciclo
    NP_prior(t)=trace(P);                           %
    x_post(:,t)=x;                                  %
end

for t=LB+2:T
    P1 = P_prior(:,:,t-LB-1);                       % inizializzazione ad ogni ciclo
    x1 = x_post(:,t-LB-1);                          %
    
    for k=0:LB-1
        g = gamma_tk(t,t-LB+k,tau(t-LB+k));
        P1 = A*P1*A'+Q-g*A*P1*C'*inv(C*P1*C'+R)*C*P1*A';
        x1=A*x1+g*P*C'*pinv(C*P*C'+R)*(y(:,t-LB+k)-C*A*x1);
    end
    
    P_prior(:,:,t)=P1;                              % assegnazione a fine ciclo
    NP_prior(t)=trace(P1);                          %
    x_post(:,t)=x1;                                 %
end


