FLOAT_TYPE *rdf_fft( int N, FLOAT_TYPE *rdf) { fftw_plan p; FLOAT_TYPE *data = Init_array( N, 2*sizeof(FLOAT_TYPE)); p = fftw_plan_dft_1d( N, (fftw_complex *)data, (fftw_complex *)data, FFTW_FORWARD, FFTW_PATIENT); memset(data, 0, 2*N*sizeof(FLOAT_TYPE)); for(int i=0; i<N; i++) data[2*i] = rdf[2*i+1]; FFTW_EXECUTE(p); return data; }
inline void backward_fft ( data_t *d ) { FFTW_EXECUTE ( d->backward_plan[0] ); }
int gen(int type, int sz) { float_prec *a, *b; FFTW_PLAN p; int i, tp; a = FFTW_MALLOC(sizeof(*a) * sz); if (a == NULL) { fprintf(stderr, "failure\n"); exit(EXIT_FAILURE); } b = FFTW_MALLOC(sizeof(*b) * sz); if (b == NULL) { fprintf(stderr, "failure\n"); exit(EXIT_FAILURE); } switch(type) { case DCT_I: tp = FFTW_REDFT00; break; case DCT_II: tp = FFTW_REDFT10; break; case DCT_III: tp = FFTW_REDFT01; break; case DCT_IV: tp = FFTW_REDFT11; break; case DST_I: tp = FFTW_RODFT00; break; case DST_II: tp = FFTW_RODFT10; break; case DST_III: tp = FFTW_RODFT01; break; case DST_IV: tp = FFTW_RODFT11; break; default: fprintf(stderr, "unknown type\n"); exit(EXIT_FAILURE); } switch(type) { case DCT_I: case DCT_II: case DCT_III: case DCT_IV: for(i=0; i < sz; ++i) { a[i] = i; } break; case DST_I: case DST_II: case DST_III: case DST_IV: /* TODO: what should we do for dst's?*/ for(i=0; i < sz; ++i) { a[i] = i; } break; default: fprintf(stderr, "unknown type\n"); exit(EXIT_FAILURE); } p = FFTW_PLAN_CREATE(sz, a, b, tp, FFTW_ESTIMATE); FFTW_EXECUTE(p); FFTW_DESTROY_PLAN(p); for(i=0; i < sz; ++i) { printf(PF"\n", b[i]); } FFTW_FREE(b); FFTW_FREE(a); return 0; }
inline void forward_fft ( data_t *d ) { FFTW_EXECUTE ( d->forward_plan[0] ); }
inline void backward_fft ( data_t *d ) { int i; for ( i=0;i<3;i++ ) FFTW_EXECUTE ( d->backward_plan[i] ); }