我正在尝试使用以下代码计算时间序列中样本窗口的自相关性。 我将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;
首先,问题是:这段代码将自相关结果映射到[0,1]
范围内,虽然相关性应该在-1和1之间。当然,可以将结果映射到[-1,1]
范围内,但我不确定这种映射是否正确。我们如何解释结果中autocorr
数组中的值?
其次,使用此代码对某些周期性序列获得良好结果,即根据信号的周期性获得特定自相关指标的较高值。但是,当我将其应用于非周期性信号时,结果会变得奇怪:所有autocorr
数组中的值都非常接近于1。这是什么原因?
ifft.realInverse(ac, true);
之前,@Gene 在做类似计算功率谱的事情,但是公式不应该像这样:ac[i] = Math.sqrt(sqr(x[i]) + sqr(x[i+1]))
而不是没有Math.sqrt
。 - Yuriy Kravets