关于相位跳跃问题
本帖最后由 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 编辑 ] 本帖最后由 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;
得到如下的图,红线是解缠绕之前的,蓝线是解缠绕之之后的,可以很放便地求出相位/距离的斜率。 跳跃的原因是由于反正切函数其值域在(-pi,pi),所以当值域大于这个范围时,会重新回到这个范围。这就是突然下调的原因。 本帖最后由 wdhd 于 2016-9-12 14:16 编辑
原帖由 songzy41 于 2008-8-21 18:35 发表
楼主是通过布一个线性阵来测量相位。
1,我认为线性阵的尺度,最大延迟的相位应在(-π π)之间,大于或小于这个区间,会对后续的计算带来麻烦,就是要判断是否大于或小于这个区间,进行校正;
2,楼主主要从下 ...
非常感谢 我觉得我对解卷绕还不太了解,多谢你的帮助!!
页:
[1]