In my StackExchange Signal Processing Q38542 GitHub RepositoryStackExchange Signal Processing Q38542 GitHub Repository (Look at the SignalProcessing\Q38542
folder) you will be able to see a code which implements 2D Circular Convolution both in Spatial and Frequency Domain.
Pay attention to the function CircularExtension2D()
.
This function align the axis origin between the image and the kernel before working in the Frequency Domain.
Remember that for Discrete Signals the implicit assumption on signals, In frequency Domain analysis, is being periodic (Circular).
In the discrete case one could indeed apply Circular Convolution by element wise multiplication in the Frequency Domain.
With proper padding one could apply linear convolution using circular convolution hence Linear Convolution can also be achieved using multiplication in the Frequency Domain.
See:
In depth description can be found in FFT Based 2D Cyclic Convolution.
Regarding your questions:
- The filter is just an array of numbers. As long as you are after 2D Circular Convolution there is no constraints on the Filter. If it is valid for 2D Spatial Circular Convolution it is valid for Frequency Domain Circular Convolution.
- Up to Floating Point Quantization errors both are mathematically equivalent (See Convolution Theorem).
- If the Convolution Kernel is similar in its size to the image and both are large enough Frequency Domain Convolution becomes more efficient than Spatial Domain.