LZ的数据不是128,补零成256;而本身数据长256,补零成512。
又从2个实数序列构成1个复数序列,FFT后恢复出各自的DFT时,求出的F_x和F_y不正确,所以进一步计算也都错误的。给出程序如下,其中计算了时间域的互相关函数,把它与从频域求出的自相关函数进行比较。
reals=load('sin_data.txt');
reals=reals-mean(reals);
imagc=load('cos_data.txt');
imagc=imagc-mean(imagc);
x=reals'+i*imagc';
N=512;
N2=N/2;
subplot 211; plot(1:N2,reals,'r',1:N2,imagc,'g'); grid;
title('红线是reals,绿线是imagc')
% 时间域求互相关函数
[R,lags]=xcorr(reals,imagc);
subplot 212; line([lags],[R],'color','r','linewidth',3);
title('红线是时间域-黑线是频率域计算出的互相关函数')
hold on;
[V,K]=max(R);
delay_lag=lags(K);
fprintf('MaxV=%5.2f MaxK=%4d Delay_lag=%4d\n',V,K,delay_lag);
% 二个实数序列构成一个复数序列的FFT
C=fft(x,N);
C_conj=conj([C(1); C(N:-1:2)]);
F_x=(C+C_conj)/2;
F_y=(C-C_conj)/(2*j);
delay_1=ifft(F_x.*conj(F_y));
delay_1=real(ifftshift(delay_1(1:N-1)));
figure;%延时
subplot 211; plot(lags,delay_1,'r'); grid;
title('delay_1表示的互相关函数')
X=fft(reals,N);
Y=fft(imagc,N);
Pxy=X.*conj(Y);
Rxy=ifft(Pxy,N);
Rxy=real(ifftshift(Rxy(1:N-1)));
%figure;%基本方法求得的延时
subplot 212; plot(lags,Rxy,'b-'); grid;
title('Rxy表示的互相关函数')
figure(1); subplot 212; plot(lags,delay_1,'k')
画的图列在下面,可以看出从时域求出的互相关函数与频域求出的两者重合得很好。而延迟量并不是LZ所说的64,而为56,其原因LZ计算的互相关函数是有偏估算。
jn1151a.jpg
(30.01 KB, 下载次数: 0)
2013-7-28 16:20 上传