By transforming both your signal and kernel tensors into frequency space, [a convolution becomes a single element-wise multiplication][1], with no shifting or repeating. So you can convert your data and kernel into frequencies using FFT, multiply them *once* then convert back with an inverse FFT. There are some fiddly details about aligning your data first, and correcting for gain caused by the conversion. If you have a good FFT library, this can be very efficient, but there is overhead cost for running the Fourier transform and its inverse, so your convolution needs to be relatively large before it is worth looking at FFT. I have explored this a while ago in a [Ruby gem called convolver.][2] You can see some of the code for [an FFT-based convolution here][3] and the project includes unit tests that prove that direct convolution gets same numerical results as FFT-based convolution. There is also code that attempts to estimate when it would be more efficient to calculate convolutions directly by repeated multiplications or use FFT-based solution (that is rough and ready guesswork though, and implementation-dependent). [1]: https://en.wikipedia.org/wiki/Convolution_theorem [2]: https://github.com/neilslater/convolver [3]: https://github.com/neilslater/convolver/blob/master/lib/convolver.rb#L44-L59