以下のコードを使用して、時系列のサンプルウィンドウの自己相関を計算しようとしています。そのウィンドウにFFTを適用してから、実数部と虚数部の大きさを計算し、虚数部をゼロに設定し、最後に逆変換して自己相関を取得します。
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;
最初の質問は次のとおりです。相関は-1から1の間であると想定されていますが、このコードは自己相関の結果を[0,1]
範囲にマッピングします。もちろん、結果を[-1,1]
範囲にマッピングするのは簡単ですが、このマッピングかどうかはわかりません。正しい。autocorr
結果の配列の値をどのように解釈できますか?
次に、このコードを使用すると、いくつかの周期的な系列で良好な結果が得られます。つまり、信号の周期に応じて、特定の自己相関インデックスの値が高くなります。ただし、非周期信号に適用すると、結果がおかしくなります。autocorr
配列内のすべての値が1に非常に近いように見えます。その理由は何ですか。