|     下附程序是测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+002120   3.0000e+001   1.4472e-004   1.0013e+000   6.0000e+002 
 结果儿乎全部相同, 表明x是一个fs=8000的近理想的600赫,初相30度余弦函数数据.
 
 
 
 [ 本帖最后由 zhwang554 于 2009-4-22 18:56 编辑 ]
 |