From 8460f1f8f54e6fc8c46cb416929ec9f46d580cdd Mon Sep 17 00:00:00 2001 From: Mark Borgerding Date: Tue, 14 Oct 2003 00:38:58 +0000 Subject: [PATCH] added optimization for radix 2 ### testing SNR for 1024 point FFTs #### DOUBLE snr_t2f = 296.29 snr_f2t = 314.48 #### FLOAT snr_t2f = 146.48 snr_f2t = 143.03 #### SHORT snr_t2f = -30.269 snr_f2t = -60.442 #### timing 10000 x 1024 point FFTs #### DOUBLE Elapsed:0:02.77 user:2.22 sys:0.13 #### FLOAT Elapsed:0:01.65 user:1.35 sys:0.07 #### SHORT Elapsed:0:02.44 user:2.00 sys:0.06 --- kiss_fft.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 5 deletions(-) diff --git a/kiss_fft.c b/kiss_fft.c index 297e627..9f29c87 100644 --- a/kiss_fft.c +++ b/kiss_fft.c @@ -64,7 +64,49 @@ kiss_fft_cpx cexp(double phase) return x; } +static +void fft_work( + kiss_fft_cpx * Fout, + const kiss_fft_cpx * f, + int fstride, + int * factors, + const kiss_fft_state * st + ); + // the heart of the fft +static +void fft2work( + kiss_fft_cpx * Fout, + const kiss_fft_cpx * f, + int fstride, + int * factors, + const kiss_fft_state * st, + int m + ) +{ + int u; + kiss_fft_cpx t; + //kiss_fft_cpx * scratch = st->scratch; + kiss_fft_cpx * twiddles = st->twiddles; + //int Norig = st->nfft; + + if (m==1) { + Fout[0] = f[0]; + Fout[1] = f[fstride]; + } else { + fft_work( Fout , f, fstride*2,factors,st); + fft_work( Fout + m, f+fstride, fstride*2,factors,st); + } + + for ( u=0; uscratch; kiss_fft_cpx * twiddles = st->twiddles; int Norig = st->nfft; p=*factors++; - m=*factors++;//m = n/p; + m=*factors++; + +#if 1 + switch (*factors) { + case 2: + fft2work(Fout,f,fstride,factors,st,m); + return; + default: + break; + } +#endif for (q=0;qfactors[2*nstages] = p; nfft /= p;