这是用FFT的方法求互相关函数。其中的机理不是很容易说明白,建议LZ看一下书,在“数字时间序列分析一书”中有一节“利用快速傅里叶变换的相关函数”,详细说明了这种方法。 首先要知道为什么在FFT变换时就补了0,如果不补0的话也可以求相关函数,但求出的是循环相关函数。 rm=real(ifft(conj(xk).*yk)); 求了互功率谱,再反变换就是互相关系数 rm=[rm(k+2:2*k) rm(1:k)]; 由于补0的安排,要把序列以k+1为中心点,左右换置,相当于执行ifftshift函数。但是我发现这语句中把rm(k+1)丢失了,似乎有点问题 m=(-k+1):(k-1); 互相关函数对应的延迟量 我把程序改一下,得下图: x=[1 3 2 6 2 1 -2 0 1 5 3 2 -3 0 1 2 0 3 1]; y=[0 0 0 1 3 2 6 2 1 -2 0 1 5 3 2 -3 0 1 2 0 3 1]; k=length(y); e=randn(1,k); y=y+e; xk=fft(x,2*k); yk=fft(y,2*k); rm=real(ifft(conj(xk).*yk));%作用? %rm=[rm(k+2:2*k) rm(1:k)];%作用?? rm=ifftshift(rm); m=-k:k-1;%作用?? stem(m,rm) xlabel('m'); ylabel('幅度'); title('x与y的互相关函数'); |
|