From 4552a14801c69af9b4ebe4a50ba7a864fc269f58 Mon Sep 17 00:00:00 2001 From: Mark Borgerding Date: Mon, 29 Dec 2003 18:50:13 +0000 Subject: [PATCH] added stride to fft input -- should simplify multi-dimensional FFTs --- _kiss_fft_guts.h | 1 + kiss_fft.c | 49 +++++++++++++++++++++++++++++++++++++++++------- kiss_fft.h | 1 + test/Makefile | 5 +++-- test/benchkiss.c | 1 - test/selftest.c | 4 +++- tools/Makefile | 5 +++-- tools/fftutil.c | 8 ++++++++ 8 files changed, 61 insertions(+), 13 deletions(-) diff --git a/_kiss_fft_guts.h b/_kiss_fft_guts.h index df61c2d..b17c159 100644 --- a/_kiss_fft_guts.h +++ b/_kiss_fft_guts.h @@ -88,6 +88,7 @@ void kf_work( kiss_fft_cpx * Fout, const kiss_fft_cpx * f, int fstride, + int in_skip, int * factors, const kiss_fft_state * st ); diff --git a/kiss_fft.c b/kiss_fft.c index 121c872..9894e73 100644 --- a/kiss_fft.c +++ b/kiss_fft.c @@ -244,6 +244,7 @@ void kf_work( kiss_fft_cpx * Fout, const kiss_fft_cpx * f, int fstride, + int in_stride, int * factors, const kiss_fft_state * st ) @@ -256,8 +257,8 @@ void kf_work( if (m==1) Fout[q] = *f; else - kf_work( Fout + m*q, f, fstride*p,factors,st); - f += fstride; + kf_work( Fout + m*q, f, fstride*p, in_stride, factors,st); + f += fstride*in_stride; } switch (p) { @@ -341,7 +342,7 @@ void * kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem ) return st; } -void kiss_fft(const void * cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) +void kiss_fft_stride(const void * cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int in_stride) { const kiss_fft_state * st = cfg; if (st->nfft < 0) { @@ -350,9 +351,43 @@ void kiss_fft(const void * cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) } if (fin == fout) { - memcpy(st->tmpbuf,fin,sizeof(kiss_fft_cpx)*st->nfft); - fin = st->tmpbuf; + kf_work(st->tmpbuf,fin,1,in_stride, st->factors,st); + memcpy(fout,st->tmpbuf,sizeof(kiss_fft_cpx)*st->nfft); + }else{ + kf_work( fout, fin, 1,in_stride, st->factors,st ); + } +} + +void kiss_fft(const void * cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) +{ + kiss_fft_stride(cfg,fin,fout,1); +} + +void test_stride() +{ +#define SKIP_FACTOR 7 +#define FFT_SIZE 1800 + void *cfg; + kiss_fft_cpx buf1in[FFT_SIZE],buf1out[FFT_SIZE]; + kiss_fft_cpx buf2in[SKIP_FACTOR*FFT_SIZE],buf2out[FFT_SIZE]; + int i; + memset(buf2in,0,sizeof(buf2in)); + for (i=0;i