Berechnen der Autokorrelation mit FFT mithilfe der JTransforms-Bibliothek

Ich versuche, die Autokorrelation von Beispielfenstern in einer Zeitreihe mithilfe des folgenden Codes zu berechnen. Ich wende FFT auf dieses Fenster an, berechne dann die Größen von Real- und Imaginärteilen und setze den Imaginärteil auf Null. Zuletzt nehme ich eine inverse Transformation davon, um eine Autokorrelation zu erhalten:

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;

Die erste Frage ist: Es ist zu sehen, dass dieser Code das Autokorrelationsergebnis zuordnet[0,1] Bereich, obwohl die Korrelation zwischen -1 und 1 liegen soll. Natürlich ist es einfach, die Ergebnisse zuzuordnen[-1,1] Bereich, aber ich bin nicht sicher, ob diese Zuordnung korrekt ist. Wie können wir die Werte im Ergebnis interpretieren?autocorr Array?

Zweitens erhalte ich mit diesem Code gute Ergebnisse für einige periodische Reihen, dh, ich erhalte höhere Werte für bestimmte Autokorrelationsindizes entsprechend der Signalperiode. Das Ergebnis wird jedoch merkwürdig, wenn ich es auf nichtperiodische Signale anwende: Alle Werte inautocorr Array scheint sehr nahe an 1 zu sein. Was ist der Grund dafür?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage