最近学习王兆华教授的全相位FFT方面的知识,对于全相位时移相位差法有点疑问,望高手们解答。
全相位时移相位差法的采样长度为3N-1,倘若将其分为三段:1~N、N+1~2N-1、2N~3N-1,来模拟一下实际采样中噪声干扰可能带来的偏差。
设定三段的频率、相位相同,但是幅值取不同值(保证了频谱的连续性),然后按照附录3的原理性程序做全相位FFT,并对最后的结果分析:
结果的频率和相位没什么好说的,主要是结果中幅值一项基本就等于前两段数据(1~N、N+1~2N-1)理论幅值的平均值,而第三段数据(2N~3N-1)幅值的变化对结果基本没什么大的影响。换句话说,全相位时移相位差法所得的结果基本等于前两段数据FFT的平均值,而几乎与第三段无关,这是为什么???而平常FFT做例如10个周波的FFT,那么结果一定等于各个周波FFT的平均值(已证明)。那么全相位第三段数据(2N~3N-1)的突然跳变会对全相位结果无太大的影响,求解释?!!
实验代码如下:
%附3 apFFT时移相位差法校正程序
close all;clear all;clc;
N=1024;
FSX=5;
fs=FSX*N;
t1=-N+1:0;
t2=1:N-1;
t3=N:2*N-1;
f=50;
ph=90;
A1=120;A2=60;A3=10000;%试图改变A1、A2、A3的值...
s1=A1*cos(2*pi*t1*f/fs+ph*pi/180);
s2=A2*cos(2*pi*t2*f/fs+ph*pi/180);
s3=A3*cos(2*pi*t3*f/fs+ph*pi/180);
ss=[s1,s2,s3];
win=hanning(N)';win1=hann(N)';
win2=conv(win,win1);
win2=win2/sum(win2);
w=pi*2;
s1=ss(1:2*N-1); %第1组(2N-1)个数据
y1=s1.*win2;
y1a=y1(N:end)+[0 y1(1:N-1)];
out1=fft(y1a,N);
a1=abs(out1);
p1=mod(phase(out1),2*pi);
s2=ss(1+N:3*N-1); %第2组(2N-1)个数据
y2=s2.*win2;
y2a=y2(N:end)+[0 y2(1:N-1)];
out2=fft(y2a,N);
a2=abs(out2);
p2=mod(phase(out2),2*pi);
rr=round(f/FSX);
dp=p2(rr+1)-p1(rr+1);
dph=mod(dp,2*pi); %由于频率较小,为减小噪声信号的干扰,作如下改进频率和幅值
if dph>pi %dph即为两序列谱峰线间的相位差,(0~2*pi)
dph=dph-2*pi;
elseif dph
dph=dph+2*pi;
end
g0=dph/pi/2;
if g0==0
h=2;
else h=2*pi*g0.*(1-g0.*g0)./sin(pi*g0);
end
AA=abs((h.^2).*a1)/2;
fff=(rr+g0)*FSX
aaa=AA(rr+1)
ppp=p1(rr+1)*180/pi
结果:fff = 50.0251 aaa = 90.0058 ppp = 89.5443
即幅值aaa为前两段数据幅值(120、60)的平均值,改变其他数据同理。我想知道,第三段数据干什么去了???