下附程序是测y数据的频率,振幅和相位.是书中附录2,fft/apfft校正程序.这个方法可参看书中 笫4.3.4节 FFT/apFFT 综合相位差校正法.
这样在告之fs(发送端取样时保证数据中点相位是初相位)下,接收端用N任意值都可测y的3个参数.接收端不必有x数据,认为是600赫,初相位30度,振幅1的余弦信号. 结果和下: N y相位 y相位误差 y振幅 y频率
1024 2.9770e+001 -2.2972e-001 9.8828e-001 6.0005e+002
512 3.0006e+001 5.6848e-003 9.9935e-001 6.0001e+002
256 2.9956e+001 -4.4074e-002 9.9608e-001 6.0001e+002
128 3.0396e+001 3.9584e-001 9.8667e-001 6.0085e+002
240 2.9981e+001 -1.9458e-002 9.9465e-001 5.9999e+002 480 2.9855e+001 -1.4516e-001 9.9463e-001 6.0003e+002
close all;clc;clear all;
fs=8000;
f1=600;
A=16384;
ph1=30;
load x1.mat
load y1.mat
N=256 ;
middle=1200;%x1.mat,y1.mat数据时求第1200点的相位
start=middle;
stop=middle+N-1;
y1 =y(start:stop);%取N数据为FFT的输入数据
y1=y1/max(y1);
start=middle-N+1;
stop=middle+N-1;
y2=y(start:stop);%取2N-1个数据为apFFT的输入数据
y2=y2/max(y2);
win = hanning(N)';
win1 = win/sum(win);%窗归1
y11= y1.*win1;
y11_fft = fft(y11,N);
a1 = abs(y11_fft);%FFT振幅谱
p1 = mod(phase(y11_fft)*180/pi,360);;%FFT相位谱
win = hanning(N)';;
winn = conv(win,win);%apFFT须要卷积窗
win2 = winn/sum(winn);%窗归1
y22= y2.*win2;
y222=y22(N:end)+[0 y22(1:N-1)];%构成长N的apFFT输入数据
y2_fft = fft(y222,N);;
a2 = abs(y2_fft);%apFFT振幅谱
p2=mod( phase(y2_fft)*180/pi,360);%apFFT相位谱
ee=mod((p1-p2)/180/(1-1/N),1);%频率偏离校正值
aa=(a1.^2)./a2*2;%振幅校正值
r=round(f1/fs*N)+1;%谱峰值所处的谱线
r1=floor(f1/fs*N)+1;%计频率值用
pppx=p1(r);
pppy=p2(r) ;
d_p=p2(r)-30 ;
aaa=aa(r);
df=mod(ee(r),1);%频偏值
fff=(r1-1+df)*fs/N;
%fff1=(r1-2+df)*fs/N%(N=240);
[N,pppy, d_p,aaa,fff]
上程序中当N=240等整数值取样时, 有时计算频率要减1.即用fff式, 有时计算频率要减2.即用fff1式, 还没能统一为一个式子. 这个问题和你一开始测初相位零时发生0和360度跳变一样, 当理论频偏值为0的信号, 用附录2的程序统一公式正确, 但像y实测数据, 频偏可能是0.9999或0.0001, 所以有时要多减1. 要加一个判断语句即可.
现用的y数据除了N=120,240要用fff1, 其它N=360,480等用用fff. 其它N值(不管df是>0.5或<0.5)都用fff.
上程序将y改为x也可测x的3个参数,结果为(N任何值时频率计算都用fff).
N x相位 x相位误差 x振幅 x频率
1024 3.0000e+001 1.4475e-004 1.0014e+000 6.0002e+002
512 3.0000e+001 1.4475e-004 1.0014e+000 6.0000e+002
256 3.0000e+001 1.4475e-004 1.0014e+000 6.0000e+002
360 3.0000e+001 1.4475e-004 1.0014e+000 6.0000e+002 240 3.0000e+001 1.4475e-004 1.0013e+000 6.0000e+002 120 3.0000e+001 1.4472e-004 1.0013e+000 6.0000e+002
结果儿乎全部相同, 表明x是一个fs=8000的近理想的600赫,初相30度余弦函数数据.
[ 本帖最后由 zhwang554 于 2009-4-22 18:56 编辑 ] |