TODO: implement different kernels, read TODO.m