diff --git a/fft.py b/fft.py index f533312..acfc3e8 100644 --- a/fft.py +++ b/fft.py @@ -77,10 +77,11 @@ def real_fft( f,inv ): F1k = Fp[k] + Fp[N-k].conjugate() F2k = Fp[k] - Fp[N-k].conjugate() - F[k] = ( F1k + tw * F2k ) * .5 - + F2k *= tw + F[k] = ( F1k + F2k ) * .5 + F[N-k] = ( F1k - F2k ).conjugate() * .5 #F[N-k] = ( F1kp + e ** ( -j*pi*(.5+float(N-k)/N ) ) * F2kp ) * .5 - F[N-k] = ( F1k.conjugate() - tw.conjugate() * F2k.conjugate() ) * .5 + #F[N-k] = ( F1k.conjugate() - tw.conjugate() * F2k.conjugate() ) * .5 F[N] = complex( Fp[0].real - Fp[0].imag , 0 ) return F diff --git a/kiss_fftr.c b/kiss_fftr.c index c76cca7..b52539a 100644 --- a/kiss_fftr.c +++ b/kiss_fftr.c @@ -79,25 +79,30 @@ void kiss_fftr(const void * cfg,const kiss_fft_scalar *timedata,kiss_fft_cpx *fr freqdata[0].r = st->tmpbuf[0].r + st->tmpbuf[0].i; freqdata[0].i = 0; - for (k=1;ktmpbuf[k]; fpnk.r = st->tmpbuf[N-k].r; fpnk.i = -st->tmpbuf[N-k].i; C_ADD( f1k, fpk , fpnk ); - C_SUBFROM( fpk , fpnk ); - C_MUL( freqdata[k], fpk , st->super_twiddles[k] ); - C_ADDTO(freqdata[k],f1k); + C_SUB( f2k, fpk , fpnk ); + C_MUL( tw , f2k , st->super_twiddles[k]); + C_ADD( freqdata[k] , f1k ,tw); freqdata[k].r /= 2; freqdata[k].i /= 2; + + freqdata[N-k].r = f1k.r - tw.r; + freqdata[N-k].i = - (f1k.i - tw.i); + freqdata[N-k].r /= 2; + freqdata[N-k].i /= 2; } freqdata[N].r = st->tmpbuf[0].r - st->tmpbuf[0].i; freqdata[N].i = 0; } - + void kiss_fftri(const void * cfg,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata) { /* input buffer timedata is stored row-wise */ diff --git a/test/test_real.c b/test/test_real.c index 5ccf4d2..cf17a5e 100644 --- a/test/test_real.c +++ b/test/test_real.c @@ -34,9 +34,7 @@ double snr_compare( kiss_fft_cpx * vec1,kiss_fft_cpx * vec2, int n) printf( "\npoor snr, try a scaling factor %f\n" , scale ); return snr; } - #define RANDOM - #ifndef RANDOM #define NFFT 8 #else @@ -80,6 +78,22 @@ int main() kiss_fftr(kiss_fftr_state,sin,sout); printf( "nfft=%d, inverse=%d, snr=%g\n", NFFT,0, snr_compare(cout,sout,(NFFT/2)+1) ); +#ifdef RANDOM + ts = cputime(); + for (i=0;i