原创 用相关函数求时延

2011-6-14 17:47 2623 9 9 分类: 测试测量
 
 

请教用相关函数求时延的问题

两路信号求延时,估计功率谱我用的是pwelch函数,各参数
fs=2000,nfft=1024,window=hanning(256),noverlap=128。
得到互功率谱Pxy后用ifft求互相关函数,再取最大值代码是:

[y_max,t_max]=max(fftshift(ifft(Pz)))

得t_max=236。
再求自相关函数最大值得t_max=257,两者差为21,这个差值和时延有啥关系呢?还有为什么自相关函数最大值在(1+nfft/4)处?(其他nfft值也试过)各位弟兄请指教
------------------------------
在理论上说,自(互)相关函数与自(互)功率谱互为傅里叶变换对,但这里指的功率谱是复数,而不是用pwelch函数求出的实数。建议用cpsd函数计算,同时其中参数中要用 'twosided'。
------------------------------
 
 

请帮我看看广义互相关时延估计程序

用多个正弦产生仿真信号,两个阵元接受到信号后,估计两信号的延迟

SN1=20; %信噪比
nn=4096; %信号长度
tt=1:nn;
fs=1000;
S=3*sin(2*pi*17*tt/fs)+2.5*sin(2*pi*35*tt/fs)+1.5*sin(2*pi*51*tt/fs)+sin(2*pi*102*tt/fs); %采样频率为1000

Ps=S*S'/nn;
ps=diag(Ps);
refp=2*10.^(SN1/10);
tmp=sqrt(refp./ps);
SS=diag(tmp)*S;
%SS=SS+randn(size(SS)); 。。。。。。。。。1

for j=1:nn
S2(j+549)=1/dist(2)*SS(j); %传送到阵2的时候延迟了549个点
end
%S2=S2+randn(size(S2));。。。。。。。。。。2

for j=1:nn
S3(j+580)=1/dist(3)*SS(j); %信号传送到阵3为延迟了580个点
end%
%S3=S3+randn(size(S3));。。。。。。。。。。。。3

n=200; %取信号的长度不超过200ms
m=580-549;
SS2=[S2(tao(2)+1:tao(2)+1+n),zeros(1,m)];
SS3=[zeros(1,m),S3(tao(3)+1:tao(3)+1+n)]; %做相关的信号

SS2=[SS2,zeros(1,length(SS2))];
SS3=[zeros(1,length(SS3)),SS3];

fx2=fft(SS2);fx3=fft(SS3);
Pxy=fx2.*conj(fx3)./(abs(fx2).*abs(fx3)+eps); 。。。。。。4

R=ifft(Pxy);

R=real(R);
c=max(abs(R));
a=find(abs(R)==c) %找出最大点
m=(a-length(R)/2)*1/fs %换算出信号的延迟时间
figure(3)
plot(R)

信号2与3的时延为0。0306秒,我现在如果把噪声加在 1 处的时候m可以得比较接近的值,但是如果把噪声加在2 和 3 处就不行,而且每次估计的 m值差别变化很大,但我认为在 2 3 处加噪声比较符合逻辑,因为每个阵的噪声应该是不相关的 ,请问是什么原因? 噪声的影响能有这样大吗? 另外我的采样频率是否有问题?

另外 4 处求的是两信号的互功率谱,请问互功率谱和功率谱密度的区别,如果去掉 4 处的分母,可以吗?
---------------------------------------
songzy41
 
我对于dist函数不熟悉,用了它以后,在SS2和SS3中前500多个数都为0。我把这部分取消了,程序为
SN1=20; %信噪比
nn=4096; %信号长度
tt=1:nn;
fs=1000;
S=3*sin(2*pi*17*tt/fs)+2.5*sin(2*pi*35*tt/fs)+1.5*sin(2*pi*51*tt/fs)+sin(2*pi*102*tt/fs); %采样频率为1000
Ps=S*S'/nn;
ps=diag(Ps);
refp=2*10.^(SN1/10);
tmp=sqrt(refp./ps);
SS=diag(tmp)*S;
SS=SS+randn(size(SS)); %。。。。。。。。。1
S2=SS+randn(size(SS)); %。。。。。。。。。。2
S3=SS+randn(size(SS)); %。。。。。。。。。。。。3

n=200; %取信号的长度不超过200ms
m=580-549;
tao(2)=0; tao(3)=0;
SS2=[S2(tao(2)+1:tao(2)+1+n),zeros(1,m)];
SS3=[zeros(1,m),S3(tao(3)+1:tao(3)+1+n)]; %做相关的信号
SS2=[SS2,zeros(1,length(SS2)-1)];
SS3=[zeros(1,length(SS3)-1),SS3];
fx2=fft(SS2);fx3=fft(SS3);
Pxy=fx2.*conj(fx3)./(abs(fx2).*abs(fx3)+eps); %。。。。。。4
R=ifft(Pxy);
R=real(R);
c=max(abs(R));
a=find(abs(R)==c) %找出最大点
Rl2=fix(length(R)/2);
m=(a-(Rl2+2))/fs %换算出信号的延迟时间
figure(3);
time=(-Rl2:Rl2)/fs;
plot(time,R); grid;
对楼主谈到的,在1,2,3中都增加了噪声,一样能得到很好的峰值。见下图,延迟时间是-0.031
同时对4是这样的,若单独求互谱,应为
Pxy=fx2.*conj(fx3)
可楼主是用SCOT方法求广义相关,SCOT方法为
Rxy=Pxy./sqrt(Pxx.*Pyy)
楼主的关系4实际上是把上两式合并在一起。所以分母不能去掉,去掉了就不是求广义相关函数了。
 
 
59843_1251985822Hr0J.jpg
 
 
------------------------------------------

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /2 下一条