inttst2
% <PRE>
%
% 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 1/28/99 - eaj Cleaned up a little for readability.
%
% $Id: Inttst2.m,v 1.1 1999/02/21 12:27:45 PeterK Exp PeterK $
tstlen=64; % Effective length of test vector.
NZ=1; % Switch to enable (1) or disable (0) noise.
NOISE=0.7071; % Set noise level.
ACW=1; % Amplitude of tone.
N=1000; % 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.
%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.
%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.
%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.
%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.
%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.
for bin = 9.0: 0.1: 9.9,
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 estimation.
quinerr(I)=target-quinest(I); % Calculate and save error.
quadest(I)=rawind-1+real(quadterp(pk3vect)); % Do quadratic estimation.
quaderr(I)=target-quadest(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.
%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.
%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.
%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);
figure(1);
plot((1:M),targ(1:M),'r+',(1:M),quadr(1:M),'yo',(1:M),quinr(1:M),'g-');
title('Average Peak Location Estimates (bin) vs Trial Number');
figure(2);
plot((1:M),quadvar(1:M),'yx',(1:M),quinvar(1:M),'g-');
title('Estimator Variance vs Trial Number');
figure(3);
plot((1:M),quadbias(1:M),'yx',(1:M),quinbias(1:M),'g-');
title('Estimator Bias vs Trial Number');
end;
% </PRE>