[SciPy-User] fast autocorrelation

Fabrice Silva silva@lma.cnrs-mrs...
Wed Feb 27 09:14:08 CST 2013

```Le mercredi 27 février 2013 à 09:02 -0500, Neal Becker a écrit :
> I'm trying to use fft to do fast auto-correlation.  (Actually, my real problem
> is slightly different, but I'll leave that detail out).
>
> The input sequence is complex, so a complex->complex FFT is used.  A length 2N
> FFT is used with 0-padding to perform linear correlation.
>
> If now in FFT output we take magnitude-squared, we have a real sequence.  A
> complex IFFT could be used to get the autocorrelation output, but that would be
> wasteful.
>
> My question is, is there a trick to more efficiently compute IFFT where the
> input is real?
>
> A couple of thoughts:
> 1. there is a nice trick for real->complex fft (not ifft)
> 2. an fft can be used to compute ifft as  ifft (x) = conj (fft (conj (x)))

For #1:
np.fft.rfft

For #2:
regarding your real PSD (after squaring the output of FFT), the inner
conj is trivial, and the normalization by the length of the sequence is
lacking:
if x real, ifft(x) = 1/n * conj(fft(x))

so may use for your purpose (just compute positive lag samples) :
1/n * np.fft.rfft(PSD).conj()

```