Autokorelacja obliczeniowa za pomocą FFT przy użyciu biblioteki JTransforms

Próbuję obliczyć autokorelację przykładowych okien w szeregu czasowym za pomocą poniższego kodu. Stosuję FFT do tego okna, a następnie obliczam wielkości rzeczywistych i urojonych części i ustawiam część urojoną na zero, w końcu biorąc jej odwrotną transformację, aby uzyskać autokorelację:

DoubleFFT_1D fft = new DoubleFFT_1D(magCnt);
fft.realForward(magFFT);

magFFT[0] = (magFFT[0] * magFFT[0]);
for (int i = 1; i < (magCnt - (magCnt%2)) / 2; i++) {
    magFFT[2*i] = magFFT[2*i] * magFFT[2*i] + magFFT[2*i + 1] * magFFT[2*i + 1];
    magFFT[2*i + 1] = 0.0;
}

if (magCnt % 2 == 0) {
    magFFT[1] = (magFFT[1] * magFFT[1]);
} else {
    magFFT[magCnt/2] = (magFFT[magCnt-1] * magFFT[magCnt-1] + magFFT[1] * magFFT[1]);
}

autocorr = new double[magCnt];
System.arraycopy(magFFT, 0, autocorr, 0, magCnt);
DoubleFFT_1D ifft = new DoubleFFT_1D(magCnt);
ifft.realInverse(autocorr, false);

for (int i = 1; i < autocorr.length; i++)
    autocorr[i] /= autocorr[0];
autocorr[0] = 1.0;

Pierwsze pytanie brzmi: widać, że ten kod odwzorowuje wynik autokorelacji na[0,1] zakres, choć korelacja ma wynosić od -1 do 1. Oczywiście łatwo jest zmapować wyniki[-1,1] zasięg, ale nie jestem pewien, czy to mapowanie jest poprawne. Jak możemy interpretować wartości w wynikachautocorr szyk?

Po drugie, dzięki temu kodowi uzyskuję dobre wyniki dla niektórych serii okresowych, czyli otrzymuję wyższe wartości dla konkretnych wskaźników autokorelacji zgodnie z okresem sygnału. Jednak wynik jest dziwny, gdy zastosuję go do sygnałów nieokresowych: wszystkie wartości wautocorr tablica wydaje się być bardzo blisko 1. Jaka jest tego przyczyna?

questionAnswers(1)

yourAnswerToTheQuestion