implemented convolution