Discrepancy between xcorr2 and fft2

7 views (last 30 days)
Alessandro Masullo
Alessandro Masullo on 15 Oct 2015
Edited: Tapas Bar on 9 Oct 2020
Hello!
I want to implement an fft cross-correlation in my algorithm in order to replace the much slower xcorr2. In theory, direct cross-correlation (xcorr2) and product of fft transform should be exactly the same. In practice, results can be different if the matrix size is not a power of two, because of the zero padding.
I made this snippet of code for a comparison, where matrices are exactly 128. The strange thing is that the two methods are almost the same in the centre of the correlation, but they differ quite a lot in the edges. How is that possible?
a = randn(128);
b = randn(128);
% Subtract the mean
a = a - mean(a(:));
b = b - mean(b(:));
% Direct cross-correlation
dc = xcorr2(b,a);
% Select the central part
dc = dc(65:128+64,65:128+64);
% FFT cross-correlation
fa = fft2(rot90(a,2));
fb = fft2(b);
cf = fftshift(real(ifft2(fa.*fb)));
figure,imagesc(abs(cf-dc))

Answers (1)

Alessandro Masullo
Alessandro Masullo on 17 Oct 2015
I figured it out by myself, and I uploaded a script on the file exchange to get a numerically equivalent function of xcorr2 which uses FFT. http://www.mathworks.com/matlabcentral/fileexchange/53570-xcorr2-fft-a-b-
  1 Comment
Tapas Bar
Tapas Bar on 9 Oct 2020
Edited: Tapas Bar on 9 Oct 2020
Hello Mr. Masullo,
I also have the same problem. I could not understand your answer quite well regarding the difference in values (in two methods) at the edges. Please help !
Thanks

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!