Вычислить автокорреляцию с использованием FFT в Matlab

Я прочитал несколько объяснений того, как автокорреляция может быть более эффективно рассчитана с использованием fft сигнала, умножая действительную часть на комплексную сопряженную (фьюер-домен), а затем используя обратный fft, но у меня возникают проблемы с этим в matlab потому что на подробном уровне я действительно не знаю, что делаю. : o) Любые добрые души, которые могут поделиться каким-то кодом и мудростью?

Благодаря!

    Так же, как вы сказали, возьмите fft и умножьте поточе на его комплексное сопряжение, затем используйте обратный fft (или в случае взаимной корреляции двух сигналов: Corr(x,y) <=> FFT(x)FFT(y)* )

     x = rand(100,1); len = length(x); %# autocorrelation nfft = 2^nextpow2(2*len-1); r = ifft( fft(x,nfft) .* conj(fft(x,nfft)) ); %# rearrange and keep values corresponding to lags: -(len-1):+(len-1) r = [r(end-len+2:end) ; r(1:len)]; %# compare with MATLAB's XCORR output all( (xcorr(x)-r) < 1e-10 ) 

    Фактически, если вы посмотрите на код xcorr.m , это именно то, что он делает (только он должен иметь дело со всеми случаями заполнения, нормализации, ввода вектора / матрицы и т. Д.)

    По теореме Винера-Хинчина силовая спектральная плотность (PSD) функции представляет собой преобразование Фурье автокорреляции. Для детерминированных сигналов PSD представляет собой просто квадрат квадрата преобразования Фурье. См. Также теорему свертки .

    Когда дело доходит до дискретных преобразований Фурье (т. Е. Используя БПФ), вы фактически получаете циклическую автокорреляцию. Чтобы получить правильную (линейную) автокорреляцию, перед принятием преобразования Фурье необходимо выполнить нулевое размещение исходных данных в два раза по сравнению с их первоначальной длиной. Итак, что-то вроде:

     x = [ ... ]; x_pad = [x zeros(size(x))]; X = fft(x_pad); X_psd = abs(X).^2; r_xx = ifft(X_psd); 
    Давайте будем гением компьютера.