How to perform 2 dimensional circular convolution
    19 Ansichten (letzte 30 Tage)
  
       Ältere Kommentare anzeigen
    
    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.
0 Kommentare
Akzeptierte Antwort
  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
      
      
 am 7 Mär. 2022
        
      Bearbeitet: Matt J
      
      
 am 7 Mär. 2022
  
      Using FFTs
out = ifft2(fft2(A).*fft2(B));
2 Kommentare
  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;
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
Siehe auch
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


