在matlab中使用FFT计算自相关

时间:2010-10-16 14:41:55

标签: matlab signal-processing fft correlation

我已经阅读了一些解释,说明如何使用信号的fft更有效地计算自相关,将实部乘以复共轭(傅里叶域),然后使用反fft,但我无法实现这在matlab中,因为在详细程度上,我真的不知道我在做什么。 :o)那里有什么样的灵魂都在乎分享一些代码和智慧?

谢谢!

2 个答案:

答案 0 :(得分:28)

就像你说的那样,取fft并用它的复共轭逐点乘,然后使用逆fft(或者在两个信号的互相关的情况下:Corr(x,y) <=> FFT(x)FFT(y)*

x = rand(100,1);
len = length(x);

%# autocorrelation
nfft = 2^nextpow2(2*len-1);
r = ifft( fft(x,nfft) .* conj(fft(x,nfft)) );

%# rearrange and keep values corresponding to lags: -(len-1):+(len-1)
r = [r(end-len+2:end) ; r(1:len)];

%# compare with MATLAB's XCORR output
all( (xcorr(x)-r) < 1e-10 )

事实上,如果你看一下xcorr.m的代码,那就是它正在做的事情(只有它必须处理填充,规范化,向量/矩阵输入等的所有情况......)< / p>

答案 1 :(得分:26)

通过Wiener–Khinchin theorem,函数的功率谱密度(PSD)是自相关的傅里​​叶变换。对于确定性信号,PSD只是傅立叶变换的幅度平方。另请参阅convolution theorem

当谈到离散傅立叶变换(即使用FFT)时,实际上你得到了循环自相关。为了获得正确的(线性)自相关,您必须在进行傅立叶变换之前将原始数据零填充到其原始长度的两倍。如下所示:

x = [ ... ];
x_pad = [x zeros(size(x))];
X     = fft(x_pad);
X_psd = abs(X).^2;
r_xx = ifft(X_psd);