vectest
%
% % 8/15/94 Eric Jacobsen % % Interpolator comparison test simulator. % % This one takes statistics on the EF Data vector interpolator. % % $Id: Vectst.m,v 1.1 1999/02/21 12:27:45 PeterK Exp PeterK $ NZ=1; % Noise switch, 1/0 = on/off. M=genivect(3,4,8); % Generate EF Data interpolation vector. tstlen=128; % Effective length of test vector. shtlen=tstlen/2; % Length of short DFT to be interpolated. ACW=1; % Amplitude of tone. N=1000; % Number of trials in test. %bin=9.25; % Desired bin number of tone relative to long test length. fid = fopen('vecdata.doc','w'); % Open file for results. LDFTerr=zeros(size(1:N)); % Allocate vector for results. SDFTerr=zeros(size(1:N)); % Allocate vector for results. ZPerr=zeros(size(1:N)); % Allocate vector for results. EFerr=zeros(size(1:N)); % Allocate vector for results. LDFTmag=zeros(size(1:N)); % Allocate vector for results. SDFTmag=zeros(size(1:N)); % Allocate vector for results. ZPmag=zeros(size(1:N)); % Allocate vector for results. EFmag=zeros(size(1:N)); % Allocate vector for results. SNR=zeros(size(1:N)); % Allocate vector for results. for bin = 9.0: 0.125: 9.625, target=bin; % Calculate desired target result for comparison. fprintf(fid,'Target is %f.\n',target); fprintf(fid,'N = %f.\n',N); fprintf('\nPeak is at %f.\n',bin); for C = 1.125: -0.125: 0.25, % Run these tests for NZ. NOISE=C; for I = 1:N, % Run trials. phz=2*pi*rand(1); % Random phase. cw=ACW*exp(j*((4*pi*(1:tstlen)*bin/tstlen)+phz)); % Generate signal. sigp=sum(abs(cw(1:tstlen).^2)); % Calculate signal power. cwn=cw; if(NZ==1) % Generate channel noise. % Set signal level and add noise (noise variance=1 on I and on Q) nzi=NOISE*randn(1,tstlen); nzq=NOISE*randn(1,tstlen); nzv=nzi+j*nzq; nzp=sum(abs(nzv(1:tstlen).^2)); if(nzp>0) SNR(I)=10*log10(sigp/nzp); % Calculate SNR=CNR. else SNR(I)=100.0; % Use this for no noise. end cwn=cw+nzv; end % End channel noise. dftlong(1:tstlen)=fft(cwn(1:tstlen)); % Long (reference) DFT. maglong(1:tstlen)=abs(dftlong); % Long DFT magnitude. [longmag,longind]=max(maglong); maxlong=dftlong(longind); LDFTerr(I)=target-((longind-1)/2); LDFTmag(I)=longmag; %fprintf('Long Reference: Mag = %f, Phase = %f radians at %f.\n', longmag, angle(maxlong), (longind-1)/2); dftshrt(1:shtlen)=fft(cwn(1:shtlen)); % Short DFT. magshrt(1:shtlen)=abs(dftshrt); % Short DFT magnitude. [rawmag,rawind]=max(magshrt); % Find raw peak magnitude and location. if(rawind>62) % Correct for bogus case. magshrt(rawind)=0; [rawmag,rawind]=max(magshrt); % Find raw peak magnitude and location. end if(rawind<3) % Correct for bogus case. magshrt(rawind)=0; [rawmag,rawind]=max(magshrt); % Find raw peak magnitude and location. end maxshrt=dftshrt(rawind); SDFTerr(I)=target-(rawind-1); SDFTmag(I)=rawmag; %fprintf('Raw peak is %f at bin number %d.\n', rawmag, rawind-1); %fprintf('Short Reference: Mag = %f, Phase = %f radians at %f.\n', rawmag, angle(maxshrt), rawind-1); invshrt=ifft(dftshrt); % Inverse transform short DFT. zpdftshrt=zeros(size(dftlong)); % Create zero padding vector for dftshort. zpdftshrt(1:shtlen)=invshrt(1:shtlen); zidftshrt=fft(zpdftshrt); % Forward transform zero padded vector. magzi(1:tstlen)=abs(zidftshrt); % Zero padded DFT magnitude. [zpmag,zpind]=max(magzi); maxzi=zidftshrt(zpind); ZPerr(I)=target-((zpind-1)/2); ZPmag(I)=zpmag; %fprintf('Zero padded: Mag = %f, Phase = %f radians.\n', abs(maxzi), angle(maxzi)); %fprintf('Zero Padded: Mag = %f, Phase = %f radians at %f.\n', zpmag, angle(maxzi), (zpind-1)/2); if(magshrt(rawind+1)>magshrt(rawind-1)) % Which side of raw peak to interpolate. pkvect(1:4)=dftshrt(rawind-1:rawind+2); % Isolated 4 samples around peak. % fprintf('Interpolating high side of bin %d.\n', rawind-1); efint=sum(pkvect.*M); % Calculate our interpolation method. efimag=1.2*abs(efint); if(efimag>rawmag) % Make freq estimate. efind=rawind+0.5; else efind=rawind; efimag=rawmag; end else pkvect(1:4)=dftshrt(rawind-2:rawind+1); % Isolated 4 samples around peak. % fprintf('Interpolating low side of bin %d.\n', rawind-1); efint=sum(pkvect.*M); % Calculate our interpolation method. efimag=1.2*abs(efint); if(efimag>rawmag) % Make freq estimate. efind=rawind-0.5; else efind=rawind; efimag=rawmag; end end EFerr(I)=target-(efind-1); EFmag(I)=efimag; % fprintf('EF Interpolated: Mag = %f, Phase = %f radians.\n', abs(efint), angle(efint)); end % End inner for loop. LDFTmn=sqrt(mean(LDFTerr.^2)); % Calculate result rms error. SDFTmn=sqrt(mean(SDFTerr.^2)); % Calculate result rms error. ZPmn=sqrt(mean(ZPerr.^2)); % Calculate result rms error. EFmn=sqrt(mean(EFerr.^2)); % Calculate result rms error. LDMmn=mean(LDFTmag); % Calculate result mean magnitude. SDMmn=mean(SDFTmag); % Calculate result mean magnitude. ZPMmn=mean(ZPmag); % Calculate result mean magnitude. EFMmn=mean(EFmag); % Calculate result mean magnitude. SNRmn=mean(SNR); % Calculate test mean SNR. fprintf('\nTest case noise variance = %d.\n\n',C); fprintf('Bin number rms error from target.\n'); fprintf('LDFT rms=%f\n',LDFTmn); fprintf('SDFT rms=%f\n',SDFTmn); fprintf('ZP rms=%f\n',ZPmn); fprintf('EF rms=%f\n',EFmn); fprintf('Result mean peak magnitude estimates.\n'); %fprintf('LDM rms=%f\n',LDMmn); fprintf('SDM =%f\n',SDMmn); fprintf('ZPM =%f\n',ZPMmn); fprintf('EFM =%f\n',EFMmn); fprintf('SNR X=%f\n',SNRmn); fprintf(fid,'\nTest case %d.\n',C); fprintf(fid,'Bin number rms error from target.\n'); fprintf(fid,'LDFT rms=%f\n',LDFTmn); fprintf(fid,'SDFT rms=%f\n',SDFTmn); fprintf(fid,'ZP rms=%f\n',ZPmn); fprintf(fid,'EF rms=%f\n',EFmn); fprintf(fid,'Result mean peak magnitude estimates.\n'); %fprintf(fid,'LDM rms=%f\n',LDMmn); fprintf(fid,'SDM rms=%f\n',SDMmn); fprintf(fid,'ZPM rms=%f\n',ZPMmn); fprintf(fid,'EFM rms=%f\n',EFMmn); fprintf(fid,'SNR X=%f\n',SNRmn); end; % End outer for loop. end; % End bin loop. fclose(fid); end; %