mirror of
https://github.com/mborgerding/kissfft.git
synced 2025-05-27 21:20:27 -04:00
Fixed generic mixed radix butterfly
'make test' output: ### testing SNR for 1024 point FFTs #### DOUBLE snr_t2f = 296.95 snr_f2t = 317.25 #### FLOAT snr_t2f = 147.96 snr_f2t = 145.14 #### SHORT snr_t2f = 52.414 snr_f2t = 22.438 #### timing 10000 x 1024 point FFTs #### DOUBLE Elapsed:0:03.56 user:2.63 sys:0.19 #### FLOAT Elapsed:0:01.35 user:1.07 sys:0.10 #### SHORT Elapsed:0:01.70 user:1.37 sys:0.06
This commit is contained in:
parent
0424734e9d
commit
9504aa79c1
49
kiss_fft.c
49
kiss_fft.c
@ -37,14 +37,6 @@ typedef struct {
|
|||||||
}kiss_fft_state;
|
}kiss_fft_state;
|
||||||
|
|
||||||
#ifdef FIXED_POINT
|
#ifdef FIXED_POINT
|
||||||
/*
|
|
||||||
#define C_SUB( res, a,b)\
|
|
||||||
do { (res).r=((a).r-b.r+1)>>1; (res).i=((a).i-b.i+1)>>1; }while(0)
|
|
||||||
#define C_ADDTO( res , a)\
|
|
||||||
do { (res).r=((res).r+(a).r+1)>>1; (res).i=((res).i+(a).i+1)>>1; }while(0)
|
|
||||||
#define C_SUBFROM( res , a)\
|
|
||||||
do { (res).r=((res).r-(a).r+1)>>1; (res).i=((res).i-(a).i+1)>>1; }while(0)
|
|
||||||
*/
|
|
||||||
/* We don't have to worry about overflow from multiplying by twiddle factors since they
|
/* We don't have to worry about overflow from multiplying by twiddle factors since they
|
||||||
* all have unity magnitude. Still need to shift away fractional bits after adding 1/2 for
|
* all have unity magnitude. Still need to shift away fractional bits after adding 1/2 for
|
||||||
* rounding. */
|
* rounding. */
|
||||||
@ -84,32 +76,6 @@ void printcpx(const char * desc,kiss_fft_cpx c)
|
|||||||
{
|
{
|
||||||
printf("%s = (%e,%e)\n",desc,(double)c.r,(double)c.i);
|
printf("%s = (%e,%e)\n",desc,(double)c.r,(double)c.i);
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
|
||||||
inline
|
|
||||||
kiss_fft_cpx crot(kiss_fft_cpx c, int numquads)
|
|
||||||
{
|
|
||||||
kiss_fft_cpx out;
|
|
||||||
switch (numquads&3) {
|
|
||||||
case 0:
|
|
||||||
out.r = c.r;
|
|
||||||
out.i = c.i;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
out.r = c.i;
|
|
||||||
out.i = -c.r;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
out.r = -c.r;
|
|
||||||
out.i = -c.i;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
out.r = -c.i;
|
|
||||||
out.i = c.r;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define C_ROTADDTO(sum,c,q) \
|
#define C_ROTADDTO(sum,c,q) \
|
||||||
do{\
|
do{\
|
||||||
@ -133,7 +99,6 @@ kiss_fft_cpx crot(kiss_fft_cpx c, int numquads)
|
|||||||
}\
|
}\
|
||||||
}while(0)
|
}while(0)
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
void fft_work(
|
void fft_work(
|
||||||
kiss_fft_cpx * Fout,
|
kiss_fft_cpx * Fout,
|
||||||
@ -278,13 +243,11 @@ void fft_work(
|
|||||||
kiss_fft_cpx t;
|
kiss_fft_cpx t;
|
||||||
kiss_fft_cpx * scratch = st->scratch;
|
kiss_fft_cpx * scratch = st->scratch;
|
||||||
kiss_fft_cpx * twiddles = st->twiddles;
|
kiss_fft_cpx * twiddles = st->twiddles;
|
||||||
|
#if 1
|
||||||
#if 1
|
|
||||||
switch (*factors) {
|
switch (*factors) {
|
||||||
case 4: fft4work(Fout,f,fstride,factors,st); return;
|
case 4: fft4work(Fout,f,fstride,factors,st); return;
|
||||||
case 2: fft2work(Fout,f,fstride,factors,st); return;
|
case 2: fft2work(Fout,f,fstride,factors,st); return;
|
||||||
default:
|
default: break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
p=*factors++;
|
p=*factors++;
|
||||||
@ -295,7 +258,7 @@ void fft_work(
|
|||||||
Fout[q] = *f;
|
Fout[q] = *f;
|
||||||
else
|
else
|
||||||
fft_work( Fout + m*q, f, fstride*p,factors,st);
|
fft_work( Fout + m*q, f, fstride*p,factors,st);
|
||||||
f+= fstride;
|
f += fstride;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( u=0; u<m; ++u ) {
|
for ( u=0; u<m; ++u ) {
|
||||||
@ -303,15 +266,15 @@ void fft_work(
|
|||||||
for ( q1=0 ; q1<p ; ++q1 ) {
|
for ( q1=0 ; q1<p ; ++q1 ) {
|
||||||
scratch[q1] = Fout[ k ];
|
scratch[q1] = Fout[ k ];
|
||||||
#ifdef FIXED_POINT
|
#ifdef FIXED_POINT
|
||||||
scratch[q1].r >>= 1;
|
scratch[q1].r /= p;
|
||||||
scratch[q1].i >>= 1;
|
scratch[q1].i /= p;
|
||||||
#endif
|
#endif
|
||||||
k += m;
|
k += m;
|
||||||
}
|
}
|
||||||
|
|
||||||
k=u;
|
k=u;
|
||||||
for ( q1=0 ; q1<p ; ++q1 ) {
|
for ( q1=0 ; q1<p ; ++q1 ) {
|
||||||
int twidx=3;
|
int twidx=0;
|
||||||
Fout[ k ] = scratch[0];
|
Fout[ k ] = scratch[0];
|
||||||
for (q=1;q<p;++q ) {
|
for (q=1;q<p;++q ) {
|
||||||
int Norig = st->nfft;
|
int Norig = st->nfft;
|
||||||
|
Loading…
Reference in New Issue
Block a user