How to perform 2 dimensional circular convolution
Afficher commentaires plus anciens
We have 'conv' and 'conv2' functions in matlab to find 1-D and 2-D linear convolution.
But for circular convolution we have only 'cconv' for 1-D convolution. Is there 2-D circular convolution function in matlab or there is any way to acheive 2-D circular convolution in MATLAB.
I tried using 'conv2(A,B,'same'), but it is not same as 2-D circular convolution.
Réponse acceptée
Plus de réponses (1)
Using FFTs
out = ifft2(fft2(A).*fft2(B));
2 commentaires
Ahmed
le 5 Jan 2025
this is better
@Ahmed if by better, you mean faster, then that won't always be true. If you are convolving a large array with a short kernel, it is often faster to work in the non-Fourier domain. Example:
n=5000;
A=rand(n);
B=rand(5);
tic;
out1 = real(ifft2(fft2(A).*fft2(B,n,n)));
toc;
tic;
out2 = cyconv(A,B);
toc;
percentDifference=norm(out1-out2,'inf')/norm(out1,'inf')*100
function z=cyconv(x,y)
%Non-Fourier domain cyclic convolution
%
% z=cyconv(x,y)
xsiz=num2cell(size(x));
ysiz=num2cell(size(y));
subs=cellfun(@(n,m)[n-(m-2):n,1:n],xsiz, ysiz,'uni',0);
x=x(subs{:});
z=convn(x,y,'valid');
end
Catégories
En savoir plus sur Correlation and Convolution dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!