What's wrong with this Whittaker-Shannon-Kotel’nikov interpolation implementation?
Replace the line

y+=samples(k)*normalized_sinc((t-k*T_s)/T_s);

by

y+=samples(k)*normalized_sinc((t-(k-1)*T_s)/T_s);

because the indices inside the sinc function must start from $0$, not from $1$. The first sinc must have its peak at $t=0$, not at $t=T_s$.