what is the difference between the normxcorr2 and the below processing?

11 visualizaciones (últimos 30 días)
N Saf
N Saf el 8 de Ag. de 2023
Respondida: vidyesh el 27 de Dic. de 2023
I am trying to calculate the correlation coeffcients in MATLAB, I have tried two ways:
1- using normxcorr2 function
2- using this: % Compute FFT of the current signal1D_slice
fft_signal1D_slice = fft(signal1D_slice);
% Compute cross-correlation using inverse FFT of element-wise multiplication of FFTs
crossCorr_fft = ifft(fft_signal1D .* conj(fft_signal1D_slice));
The output of my correlation matrix is different for the same data set, is there a difference on how these two ways processthe data and calculate the correlation coefficients? if yes, what is the difference ..... what could be the reason for havig completly different results, knowing that the second method seems to better show the correlation in where I am expecting.

Respuestas (1)

vidyesh
vidyesh el 27 de Dic. de 2023
Hello N Saf,
I see that you're interested in calculating correlation coefficients in MATLAB. You can accomplish this in a couple of ways:
1. Using the `xcorr` function: This MATLAB function computes the cross-correlation or autocorrelation of two input sequences. For example, if you have a random sequence `x` of length `n`, you can calculate the autocorrelation coefficients as follows:
n = 16;
x = randn(1, n);
coeffs1 = xcorr(x);
2. Using the IFFT of the product of FFTs: This method involves zero-padding the signal and using the Fast Fourier Transform (FFT). To get the autocorrelation coefficients, you should:
- Zero-pad the signal to avoid circular correlation.
- Compute the FFT of the zero-padded signal.
- Multiply the FFT of the signal by its complex conjugate to get the power spectrum.
- Apply the Inverse FFT (IFFT) to the power spectrum to obtain the autocorrelation coefficients.
Here's how you can implement it:
x_pad = [x, zeros(1, n - 1)];
F_x = fft(x_pad);
coeffs2 = ifft(F_x .* conj(F_x));
coeffs2 = fftshift(coeffs2); % This centers the peak at the middle of the array
Note that when comparing the results from these two methods, you should consider using a tolerance due to the precision of floating-point arithmetic:
tolerance = 1e-8;
disp(abs(coeffs2 - coeffs1) < tolerance);
Please note that 'normxcorr2' computes the normalized cross-correlation of the matrices.
For more detailed information on the `xcorr` function, you can refer to the MATLAB documentation page:
Hope this answer helps.

Categorías

Más información sobre Spectral Measurements en Help Center y File Exchange.

Productos


Versión

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by