antonylau 发表于 2008-8-21 09:47

关于相位跳跃问题

本帖最后由 wdhd 于 2016-9-12 14:16 编辑

  对于等间距的一系列麦克风,同时采集一组数据。由于状态随着距离在传播,这一系列麦克风采集到的数据具有相关性。只对其相关性分析,可以得到随距离和时间变化时的相关系数等值线分布,相关系数图中可以也看到有两个斜率存在,距离/时间可以得到相应的速度。
  现在想利用公式计算得到这个速度,U/X=w/phase;
  于是想根据互谱求得相位差,根据距离的关系得到速度。最主要的是求得相位/距离这个斜率。
  1.直接对数据进行分析时发现相位跳跃厉害,于是先自己生成信号,看斜率。
  2.代码为自己生成一系列信号,求得互谱相位差,画出相位差-距离的图像,发现在不跳跃的地方线性度还可以。应如何改进这个跳跃呢?
  dx=0.01;
  fs=1000;
  x=dx:dx:0.5;
  dt=1/1000;
  t=0:1/1000:5;
  c=20;
  %==============================signal generation==========================
  for i=1:length(x)
  signal(:,i)=sin(2*pi*100*(t-x(i)/c))+rand(1,length(t));
  signal1=sin(2*pi*100*t)+rand(1,length(t));
  nfftcpsd=2^nextpow2(2000);
  ff=0:fs/nfftcpsd:fs/2-fs/nfftcpsd;
  %==============direct cpsd method========================================
  =cpsd(signal1(2000:4000),signal(2000:4000,i),hann(2000),[],nfftcpsd);
  Pxy_absdir(:,i)=abs(Pxy);
  %find the phase
  Pxy_phasedir(:,i)=atan(imag(Pxy)./real(Pxy));
  % Pxy_phase(:,num)=angle(Pxy);
  Pxy_phaseunwrapdir(:,i)=unwrap(Pxy_phasedir(:,i));
  end
  %====================crosscorrelation and then fft=======================
  %========================correlation channel1 and channelother=============
  y1=[];
  y2=[];
  xcorrelation=[];
  nlags=1000;
  for j=1:length(x)
  y1=signal1(2000:4000);
  y2=signal(2000:4000,j);
  temp=crosscorr(y1,y2,nlags);
  xcorrelation(:,j)=temp;
  end
  %=========================fft================================================
  nfft=2^nextpow2(8000);
  f=0:fs/nfft:fs/2-fs/nfft;
  %=============find the index for two specific frequency=============
  =min(abs(100-f));
  =min(abs(170-f));
  %===================================================================
  for num=1:length(x);
  tempxcorr=xcorrelation(:,num);
  fftcorr=fft(tempxcorr,nfft);
  Pxy_abs(:,num)=abs(fftcorr);
  %find the phase
  Pxy_phase(:,num)=atan(imag(fftcorr)./real(fftcorr));
  % Pxy_phase(:,num)=phase(fftcorr);
  Pxy_phaseunwrap(:,num)=unwrap(Pxy_phase(:,num));
  Phase1result(num)=-Pxy_phaseunwrap(index1,num);
  Phase2resultunwrap(num)=-Pxy_phaseunwrap(index2,num);
  Phase2result(num)=Pxy_phase(index2,num);
  end
  %=====plot 100Hz==============
  plot(x,Phase1result)
  hold on;
  plot(x,Pxy_phaseunwrapdir(206,:),'r')



[ 本帖最后由 antonylau 于 2008-8-21 09:59 编辑 ]

songzy41 发表于 2008-8-21 18:35

本帖最后由 wdhd 于 2016-9-12 14:16 编辑

原帖由 antonylau 于 2008-8-21 09:47 发表
代码为自己生成一系列信号,求得互谱相位差,画出相位差-距离的图像,发现在不跳跃的地方线性度还可以。应如何改进这个跳跃呢?

楼主是通过布一个线性阵来测量相位。
1,我认为线性阵的尺度,最大延迟的相位应在(-π π)之间,大于或小于这个区间,会对后续的计算带来麻烦,就是要判断是否大于或小于这个区间,进行校正;
2,楼主主要从下说明后进行计算,前部分虽也计算了,但没有用到。
%====================crosscorrelation and then fft=======================
%========================correlation channel1 and channelother=============

用计算相关函数,再经FFT求出互谱,从中求出2通道之间的相位差。我认为在其中
a,没有必要进行解缠绕;
b,用angle替代atan,求相位差:
Pxy_phase(:,num)=angle(fftcorr);
c,求出在100处的相位差:
Phase2result(num)=Pxy_phase(index1,num);
d,由于笫1点的原因,楼主在空间上有缠绕,所以要解缠绕,在最后我增加了一段:
figure;
plot(x,Phase2result,'r'); hold on;
Phase2resultunwrap=unwrap(Phase2result);
plot(x,Phase2resultunwrap); hold off; grid;
得到如下的图,红线是解缠绕之前的,蓝线是解缠绕之之后的,可以很放便地求出相位/距离的斜率。

吃书的老虎 发表于 2008-8-22 09:19

跳跃的原因是由于反正切函数其值域在(-pi,pi),所以当值域大于这个范围时,会重新回到这个范围。这就是突然下调的原因。

antonylau 发表于 2008-8-22 10:56

本帖最后由 wdhd 于 2016-9-12 14:16 编辑

原帖由 songzy41 于 2008-8-21 18:35 发表

楼主是通过布一个线性阵来测量相位。
1,我认为线性阵的尺度,最大延迟的相位应在(-π π)之间,大于或小于这个区间,会对后续的计算带来麻烦,就是要判断是否大于或小于这个区间,进行校正;
2,楼主主要从下 ...
非常感谢 我觉得我对解卷绕还不太了解,多谢你的帮助!!
页: [1]
查看完整版本: 关于相位跳跃问题