为了详细说明前面的答案,计算长度信号的自相关N导致大小的(采样)自相关2N−1. 嗯,实际上,它应该是无限的,但是外部的自相关[−(N−1),N−1]等于0反正。
现在,您希望使用离散傅里叶变换 (DFT) 来计算它,并且该公式确实是信号 DFT 平方幅度的逆 DFT。但是想一想:如果我们反过来计算自相关的 DFT,你最终会得到一个大小谱2N−1,如果您不想在途中丢失样品!因此,该频谱必须具有大小2N−1,这就是为什么您需要将时域信号补零的原因2N−1,计算 DFT(在2N−1点),然后继续。
另一种看待这一点的方法是分析如果你计算 DFT 会发生什么N要点:这相当于对您的(连续频率)离散时间傅里叶变换(DTFT)进行下采样。检索自相关,它应该是大小2N−1, 具有采样不足的大小谱N因此会导致时间混叠(循环性 pichenettes 正在谈论),这解释了为什么如果您的输出在“右手边”有这种对称图案。
实际上,Hilmar 提供的代码也可以,因为只要你零填充到超过N−1(在他的例子中,他计算了一个 FT 的大小N),你“过度采样”你的 FT,你仍然得到你的2N−1“有用”的样本(其他的应该是0s)。因此,为了提高效率,只需零填充即可2N−1,这就是您所需要的(好吧,也许您最好将零填充到 2 的下一个幂2N−1,如果您使用 FFT)。
简而言之:您应该这样做(以适应您的编程语言):
autocorr = ifft( complex( abs(fft(inputData, n=2*N-1))**2, 0 ) )
或者在 MATLAB 中:
autocorr = ifft(abs(fft(inputData, 2*N-1)).^2)