How to perform 2 dimensional circular convolution

24 Ansichten (letzte 30 Tage)
Palguna Gopireddy
Palguna Gopireddy am 7 Mär. 2022
Bearbeitet: Matt J am 6 Jan. 2025
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.

Akzeptierte Antwort

Matt J
Matt J am 7 Mär. 2022
Bearbeitet: Matt J am 6 Jan. 2025
function z=cyconv(x,y)
%Non-Fourier domain cyclic convolution.
%
% z=cyconv(x,y)
%
%Note: y can be shorter in any of its dimensions than x and will be
%zero-padded implicitly.
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');

Weitere Antworten (1)

Matt J
Matt J am 7 Mär. 2022
Bearbeitet: Matt J am 7 Mär. 2022
Using FFTs
out = ifft2(fft2(A).*fft2(B));
  2 Kommentare
Ahmed
Ahmed am 5 Jan. 2025
this is better
Matt J
Matt J am 6 Jan. 2025
Bearbeitet: Matt J am 6 Jan. 2025
@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;
Elapsed time is 0.786392 seconds.
tic;
out2 = cyconv(A,B);
toc;
Elapsed time is 0.284089 seconds.
percentDifference=norm(out1-out2,'inf')/norm(out1,'inf')*100
percentDifference = 8.2314e-14
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

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by