我已经阅读了一些有关如何使用信号的fft更有效地计算自相关的解释,该方法是先将信号的实部与其复共轭相乘(傅里叶域),然后再使用逆fft,但由于细节问题,我在Matlab中无法实现它。
我已经阅读了一些有关如何使用信号的fft更有效地计算自相关的解释,该方法是先将信号的实部与其复共轭相乘(傅里叶域),然后再使用逆fft,但由于细节问题,我在Matlab中无法实现它。
就像你所说的那样,进行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
的代码,那正是它正在做的(只不过它必须处理所有填充、归一化、向量/矩阵输入等情况...)
2^nextpow2(2*len-1)
而不是 2^nextpow2(len)
? - Mariushelp ifft
的话:“ifft测试X以查看沿着活动维度的向量是否共轭对称。如果是这样,计算速度更快,输出是实数。一个N元素向量x是共轭对称的,如果对于x的每个元素,都有x(i) = conj(x(mod(N-i+1,N)+1))
。” - Amro
xcorr
是信号处理工具箱的一部分。 - Oliver Charlesworth