首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >利用Matlab中的FFT计算自相关

利用Matlab中的FFT计算自相关
EN

Stack Overflow用户
提问于 2010-10-16 22:41:55
回答 2查看 71.9K关注 0票数 23

我读过一些关于如何使用信号的fft更有效地计算自相关的解释,将实数部分乘以复共轭(傅立叶域),然后使用逆fft,但我在Matlab中实现这一点有困难,因为在细节层面上。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-17 04:02:55

就像你说的,取快速傅立叶变换,然后逐点乘以它的复数共轭,然后使用逆快速傅立叶变换(或者在两个信号互相关的情况下:Corr(x,y) <=> FFT(x)FFT(y)*)

代码语言:javascript
复制
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的代码,这正是它正在做的事情(只是它必须处理填充、规范化、向量/矩阵输入等所有情况)。

票数 32
EN

Stack Overflow用户

发布于 2010-10-17 03:23:30

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

当涉及到离散傅立叶变换(即使用FFT)时,实际上得到的是循环自相关。为了获得适当的(线性)自相关,在进行傅立叶变换之前,必须将原始数据零填充到其原始长度的两倍。所以就像这样:

代码语言:javascript
复制
x = [ ... ];
x_pad = [x zeros(size(x))];
X     = fft(x_pad);
X_psd = abs(X).^2;
r_xx = ifft(X_psd);
票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3949324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档