%
%
% 1/5/94 Eric Jacobsen
%
% Interpolator comparison test simulator.
%
% This version compares the quadratic/parabolic and Quinn's
% interpolator across a bin with fractionally spaced samples.
%
% Variables NZ and NOISE must be intialized.
% NZ = 0/1 turns the noise generator off/on. NOISE, set
% to 1.0, 0.7071, and 0.5, provides -3, 0, and +3dB SNR.
%
%
% Last modified:
%
% 6/14/02 - eaj Added tests for Macleod's and Quinn's 2nd method.
% 1/28/99 - eaj Cleaned up a little for readability.
%
tstlen=64; % Effective length of test vector.
NZ=1; % Switch to enable (1) or disable (0) noise.
NOISE=0.5; % Set noise level.
ACW=1; % Amplitude of tone.
N=10000; % Number of trials in test.
%hw=Hanning(tstlen); % Hanning window for Grandke's method.
% Requires Signal Processing toolbox.
%bin=9.25; % Desired bin number of tone relative to long test length.
%fid = fopen('intdata.doc','w'); % Open file for results.
quinerr=zeros(size(1:N)); % Allocate vector for results.
quaderr=zeros(size(1:N)); % Allocate vector for results.
quin2err=zeros(size(1:N)); % Allocate vector for results.
maclderr=zeros(size(1:N)); % Allocate vector for results.
%jainerr=zeros(size(1:N)); % Allocate vector for results.
%granerr=zeros(size(1:N)); % Allocate vector for results.
quinest=zeros(size(1:N)); % Allocate vector for results.
quadest=zeros(size(1:N)); % Allocate vector for results.
quin2est=zeros(size(1:N)); % Allocate vector for results.
macldest=zeros(size(1:N)); % Allocate vector for results.
%jainest=zeros(size(1:N)); % Allocate vector for results.
%granest=zeros(size(1:N)); % Allocate vector for results.
SNR=zeros(size(1:N)); % Allocate vector for results.
K=10; % Number of bins to test.
quinr=zeros(size(1:K)); % Allocate vector for results.
quadr=zeros(size(1:K)); % Allocate vector for results.
quin2r=zeros(size(1:K)); % Allocate vector for results.
macldr=zeros(size(1:K)); % Allocate vector for results.
%jainr=zeros(size(1:K)); % Allocate vector for results.
%granr=zeros(size(1:K)); % Allocate vector for results.
quinvar=zeros(size(1:K)); % Allocate vector for results.
quadvar=zeros(size(1:K)); % Allocate vector for results.
quin2var=zeros(size(1:K)); % Allocate vector for results.
macldvar=zeros(size(1:K)); % Allocate vector for results.
%jainvar=zeros(size(1:K)); % Allocate vector for results.
%granvar=zeros(size(1:K)); % Allocate vector for results.
quinbias=zeros(size(1:K)); % Allocate vector for results.
quadbias=zeros(size(1:K)); % Allocate vector for results.
quin2bias=zeros(size(1:K)); % Allocate vector for results.
macldbias=zeros(size(1:K)); % Allocate vector for results.
%jainbias=zeros(size(1:K)); % Allocate vector for results.
%granbias=zeros(size(1:K)); % Allocate vector for results.
targ=zeros(size(1:K)); % Allocate vector for results.
M=0; % Current test number.
binstrt = 9.0; % Starting bin number.
binstep = 0.1; % Bin delta step size.
binend = 9.9; % Ending bin number.
for bin = binstrt: binstep: binend,
M=M+1; % Current test number.
target=bin; % Calculate desired target result for comparison.
targ(M)=bin;
%fprintf(fid,'Target is %f.\n',target);
%fprintf(fid,'N = %f.\n',N);
fprintf('Peak is at %f.\n',bin);
%for C = 1.0: -0.25: 0.25, % Run these tests for NZ.
%NOISE=C;
for I = 1:N, % Run trials.
phz=2*pi*rand(1);
cw=ACW*exp(j*((2*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.
dftshrt(1:tstlen)=fft(cwn(1:tstlen)); % DFT.
magshrt(1:tstlen)=abs(dftshrt); % DFT magnitude.
[rawmag,rawind]=max(magshrt); % Find raw peak magnitude and location.
pk3vect(1:3)=dftshrt(rawind-1:rawind+1); % Isolated 3 samples around peak.
quinest(I)=rawind-1+quin(pk3vect); % Do Quinn's first estimation.
quinerr(I)=target-quinest(I); % Calculate and save error.
quadest(I)=rawind-1+quadterp(pk3vect); % Do modified quadratic estimation.
quaderr(I)=target-quadest(I); % Calculate and save error.
quin2est(I)=rawind-1+quin2(pk3vect); % Do Quinn's second estimation.
quin2err(I)=target-quin2est(I); % Calculate and save error.
macldest(I)=rawind-1+macleod(pk3vect); % Do Macleod's estimation.
maclderr(I)=target-macldest(I); % Calculate and save error.
% The following is Jain's method.
% if(pk3vect(1)>pk3vect(3)) % Find which adjacent bin is greatest.
% alpha=abs(pk3vect(2))/abs(pk3vect(1));
% delta=alpha/(1+alpha);
% jainest(I)=rawind-2+delta; % Jain's method.
% else
% alpha=abs(pk3vect(3))/abs(pk3vect(2));
% jainest(I)=rawind-1+delta;
% end
% jainerr(I)=target-jainest(I); % Calculate and save error.
% The following is Grandke's method.
% hcwn=cwn.*hw'; % Apply Hanning window to DFT input.
% gdftshrt(1:tstlen)=fft(hcwn(1:tstlen)); % Weighted DFT.
% gmagshrt(1:tstlen)=abs(gdftshrt); % Weighted DFT magnitude.
% [grawmag,grawind]=max(gmagshrt); % Find raw peak magnitude and location.
% gpk3vect(1:3)=gdftshrt(grawind-1:grawind+1); % Isolated 3 samples around peak.
% if(gpk3vect(1)>gpk3vect(3)) % Find which adjacent bin is greatest.
% alpha=abs(gpk3vect(2))/abs(gpk3vect(1));
% delta=(2*alpha-1)/(alpha+1);
% grandkest(I)=grawind-2+delta; % Grandke's method.
% else
% alpha=abs(gpk3vect(3))/abs(gpk3vect(2));
% delta=(2*alpha-1)/(alpha+1);
% grandkest(I)=grawind-1+delta;
% end
% granerr(I)=target-grandkest(I); % Calculate and save error.
end % End inner for loop.
quinvar(M)=sqrt(mean(quinerr.^2)); % Calculate result rms error.
quadvar(M)=sqrt(mean(quaderr.^2)); % Calculate result rms error.
quin2var(M)=sqrt(mean(quin2err.^2)); % Calculate result rms error.
macldvar(M)=sqrt(mean(maclderr.^2)); % Calculate result rms error.
%jainvar(M)=sqrt(mean(jainerr.^2)); % Calculate result rms error.
%granvar(M)=sqrt(mean(granerr.^2)); % Calculate result rms error.
SNRmn=mean(SNR); % Calculate result mean.
quinbias(M)=mean(quinerr); % Calculate bias.
quadbias(M)=mean(quaderr); % Calculate bias.
quin2bias(M)=mean(quin2err); % Calculate bias.
macldbias(M)=mean(maclderr); % Calculate bias.
%jainbias(M)=mean(jainerr); % Calculate bias.
%granbias(M)=mean(granerr); % Calculate bias.
quinr(M)=mean(quinest); % Calculate average result.
quadr(M)=mean(quadest); % Calculate average result.
quin2r(M)=mean(quin2est); % Calculate average result.
macldr(M)=mean(macldest); % Calculate average result.
%jainr(M)=mean(jainest); % Calculate average result.
%granr(M)=mean(grandkest); % Calculate average result.
%end; % End outer for loop.
end; % End bin loop.
%fclose(fid);
xs(1:M)=binstrt+(((1:M)-1)*binstep); % Generate scale for plot horizontal axis.
figure(1);
plot(xs(1:M),targ(1:M),'r-',xs(1:M),quadr(1:M),'mo',xs(1:M),quinr(1:M),'gs',xs(1:M),quin2r(1:M),'k+',xs(1:M),macldr(1:M),'bx');
title('Average Peak Location Estimates (bin) vs Bin Number');
figure(2);
plot(xs(1:M),quadvar(1:M),'mo:',xs(1:M),quinvar(1:M),'gs:',xs(1:M),quin2var(1:M),'k+:',xs(1:M),macldvar(1:M),'bx:');
title('Estimator Variance vs Bin Number');
figure(3);
plot(xs(1:M),quadbias(1:M),'mo:',xs(1:M),quinbias(1:M),'gs:',xs(1:M),quin2bias(1:M),'k+:',xs(1:M),macldbias(1:M),'bx:');
title('Estimator Bias vs Bin Number');
%end;
%