'make snr' now tests 2d ffts

This commit is contained in:
Mark Borgerding
2003-12-04 04:08:52 +00:00
parent f3c4a9e9ca
commit 39d2974fe3
6 changed files with 59 additions and 28 deletions

View File

@ -4,6 +4,8 @@ endif
ifeq "$(NUMFFTS)" ""
NUMFFTS=10000
endif
NROWS=30
ifeq "$(DATATYPE)" ""
DATATYPE=float
endif
@ -51,8 +53,8 @@ mtime: all $(BENCHFFTW)
done
snr: all
@echo "### testing SNR for $(NFFT) point $(DATATYPE) FFTs"
@echo "testkiss( $(NFFT) , '$(DATATYPE)' );" | octave -q
@echo "testkiss( $(NFFT) , 1, '$(DATATYPE)' );" | octave -q
@echo "testkiss( $(NFFT) , $(NROWS), '$(DATATYPE)' );" | octave -q
test: snr time fftw

View File

@ -1,12 +1,19 @@
function data = fileload( fname , prec , iscomplex )
function data = fileload( fname , prec , iscomplex ,nrows )
f = fopen(fname,"r", "native");
data = fread(f,Inf,prec)';
len=length(data);
data = fread(f,Inf,prec);
fclose(f);
len = length(data);
if iscomplex,
data = (data(1:2:len) + j*data(2:2:len) );
endif
len = len/2;
endif
tdata = zeros(len/nrows,nrows);
tdata(:) = data;
data = tdata .';
endfunction

View File

@ -1,10 +1,14 @@
function filesave( fname , prec , data )
# kiss fft stores data by rows
data = vec(data.');
len = length(data);
f = fopen(fname,"w", "native");
len=length(data);
if is_complex(data),
flat=zeros(1,2*len);
flat=zeros( 1,2*len);
flat(1:2:2*len) = real(data);
flat(2:2:2*len) = imag(data);
data = flat;

View File

@ -1,27 +1,35 @@
function snr= testkiss( nfft , prec )
function snr= testkiss( nfft , nrows, prec )
printf('### testing SNR for %d x %d point %s FFTs\n' , nfft,nrows,prec);
if strcmp( prec ,'short')
scale_t2f=nfft;
scale_f2t=nfft;
scale_t2f=nfft*nrows;
scale_f2t=nfft*nrows;
else
scale_t2f=1;
scale_f2t=1/nfft;
scale_f2t=1/(nfft*nrows);
endif
kfft= sprintf('./fftutil_%s',prec);
siglen = nfft;
sig=floor(32767*rand(1,siglen)) + j*floor(32767*rand(1,siglen));
sig=floor(32767*rand(nrows,nfft)) + j*floor(32767*rand(nrows,nfft));
filesave('time.dat',prec,sig);
cmd = sprintf('%s -n %d time.dat freq.dat',kfft,nfft);
if nrows > 1
cmd = sprintf('%s -r %d -n %d time.dat freq.dat',kfft,nrows,nfft);
else
cmd = sprintf('%s -n %d time.dat freq.dat',kfft,nfft);
endif
system(cmd);
Fsigcomp=fileload('freq.dat',prec,1) * scale_t2f;
Fsig=fft(sig);
Fsigcomp=fileload('freq.dat',prec,1,nrows ) * scale_t2f;
if nrows == 1,
Fsig=fft(sig);
else
Fsig=fft2(sig);
endif
%x=linspace(0,2*pi*(nfft-1)/nfft,nfft);
%plot(x,abs(Fsig),'r',x,abs(Fsigcomp),'g')
diff = Fsig - Fsigcomp;
noise_pow = sum( conj(diff).*diff );
sig_pow = sum( conj(Fsig).*Fsig );
@ -29,10 +37,14 @@ Fsig=fft(sig);
avg_scale = mean( abs(Fsig) ./ abs(Fsigcomp) );
var_scale = var( abs(Fsig) ./ abs(Fsigcomp) );
cmd = sprintf('%s -i -n %d freq.dat time2.dat',kfft,nfft);
if nrows > 1
cmd = sprintf('%s -r %d -i -n %d freq.dat time2.dat',kfft,nrows,nfft);
else
cmd = sprintf('%s -i -n %d freq.dat time2.dat',kfft,nfft);
endif
system(cmd);
sigcomp=fileload('time2.dat',prec,1) * scale_f2t;
%sig=ifft(Fsigcomp);
sigcomp=fileload('time2.dat',prec,1,nrows) * scale_f2t;
diff = sig - sigcomp;
noise_pow = sum( conj(diff).*diff );
@ -41,6 +53,6 @@ sigcomp=fileload('time2.dat',prec,1) * scale_f2t;
avg_scale = mean( abs(sig) ./ abs(sigcomp) );
var_scale = var( abs(sig) ./ abs(sigcomp) );
snr=[snr_t2f snr_f2t];
snr=[snr_t2f snr_f2t];
endfunction