32
#if defined DRM && !defined DRM_1024
34
#include "kiss_fft/kiss_fft.h"
35
#include "kiss_fft/kiss_fftr.h"
37
static const int logm_to_nfft[] =
47
void fft_initialize( FFT_Tables *fft_tables )
49
memset( fft_tables->cfg, 0, sizeof( fft_tables->cfg ) );
51
void fft_terminate( FFT_Tables *fft_tables )
54
for ( i = 0; i < sizeof( fft_tables->cfg ) / sizeof( fft_tables->cfg[0] ); i++ )
56
if ( fft_tables->cfg[i][0] )
58
free( fft_tables->cfg[i][0] );
59
fft_tables->cfg[i][0] = NULL;
61
if ( fft_tables->cfg[i][1] )
63
free( fft_tables->cfg[i][1] );
64
fft_tables->cfg[i][1] = NULL;
69
void rfft( FFT_Tables *fft_tables, double *x, int logm )
72
/* sur: do not use real-only optimized FFT */
73
double xi[1 << MAXLOGR];
79
fprintf(stderr, "rfft size too big\n");
83
nfft = logm_to_nfft[logm];
88
//for ( i = 0; i < nfft; i++ )
92
memset( xi, 0, nfft * sizeof( xi[0] ) );
94
fft( fft_tables, x, xi, logm );
96
memcpy( x + nfft / 2, xi, ( nfft / 2 ) * sizeof(x[0]) );
100
fprintf( stderr, "bad config for logm = %d\n", logm);
105
/* sur: use real-only optimized FFT */
109
kiss_fft_scalar fin[1 << MAXLOGR];
110
kiss_fft_cpx fout[1 << MAXLOGR];
112
if ( logm > MAXLOGR )
114
fprintf(stderr, "fft size too big\n");
118
nfft = logm_to_nfft[logm];
120
if ( fft_tables->cfg[logm][0] == NULL )
124
fft_tables->cfg[logm][0] = kiss_fftr_alloc( nfft, 0, NULL, NULL );
128
fprintf(stderr, "bad logm = %d\n", logm);
133
if ( fft_tables->cfg[logm][0] )
137
for ( i = 0; i < nfft; i++ )
142
kiss_fftr( (kiss_fftr_cfg)fft_tables->cfg[logm][0], fin, fout );
144
for ( i = 0; i < nfft / 2; i++ )
147
x[i + nfft / 2] = fout[i].i;
152
fprintf( stderr, "bad config for logm = %d\n", logm);
158
void fft( FFT_Tables *fft_tables, double *xr, double *xi, int logm )
162
kiss_fft_cpx fin[1 << MAXLOGM];
163
kiss_fft_cpx fout[1 << MAXLOGM];
165
if ( logm > MAXLOGM )
167
fprintf(stderr, "fft size too big\n");
171
nfft = logm_to_nfft[logm];
173
if ( fft_tables->cfg[logm][0] == NULL )
177
fft_tables->cfg[logm][0] = kiss_fft_alloc( nfft, 0, NULL, NULL );
181
fprintf(stderr, "bad logm = %d\n", logm);
186
if ( fft_tables->cfg[logm][0] )
190
for ( i = 0; i < nfft; i++ )
196
kiss_fft( (kiss_fft_cfg)fft_tables->cfg[logm][0], fin, fout );
198
for ( i = 0; i < nfft; i++ )
206
fprintf( stderr, "bad config for logm = %d\n", logm);
211
void ffti( FFT_Tables *fft_tables, double *xr, double *xi, int logm )
215
kiss_fft_cpx fin[1 << MAXLOGM];
216
kiss_fft_cpx fout[1 << MAXLOGM];
218
if ( logm > MAXLOGM )
220
fprintf(stderr, "fft size too big\n");
224
nfft = logm_to_nfft[logm];
226
if ( fft_tables->cfg[logm][1] == NULL )
230
fft_tables->cfg[logm][1] = kiss_fft_alloc( nfft, 1, NULL, NULL );
234
fprintf(stderr, "bad logm = %d\n", logm);
239
if ( fft_tables->cfg[logm][1] )
242
double fac = 1.0 / (double)nfft;
244
for ( i = 0; i < nfft; i++ )
250
kiss_fft( (kiss_fft_cfg)fft_tables->cfg[logm][1], fin, fout );
252
for ( i = 0; i < nfft; i++ )
254
xr[i] = fout[i].r * fac;
255
xi[i] = fout[i].i * fac;
260
fprintf( stderr, "bad config for logm = %d\n", logm);
265
/* sur: Trying to use cfft from libfaad2 -- it does not work 'from scratch' */
267
//#include "cfft/common.h"
269
//void fft_initialize( FFT_Tables *fft_tables )
271
// memset( fft_tables->cfft, 0, sizeof( fft_tables->cfft ) );
273
//void fft_terminate( FFT_Tables *fft_tables )
276
// for ( i = 0; i < sizeof( fft_tables->cfft ) / sizeof( fft_tables->cfft[0] ); i++ )
278
// if ( fft_tables->cfft[i] )
280
// cfftu( fft_tables->cfft[i] );
281
// fft_tables->cfft[i] = NULL;
286
//void rfft( FFT_Tables *fft_tables, double *x, int logm )
288
// double xi[1 << MAXLOGR];
292
// if ( logm > MAXLOGR )
294
// fprintf(stderr, "rfft size too big\n");
298
// nfft = logm_to_nfft[logm];
304
// for ( i = 0; i < nfft; i++ )
308
// //memset( xi, 0, nfft * sizeof( xi[0] ) );
310
// fft( fft_tables, x, xi, logm );
312
// memcpy( x + nfft / 2, xi, ( nfft / 2 ) * sizeof(x[0]) );
314
//#ifdef SUR_DEBUG_FFT
316
// FILE* f = fopen( "fft.log", "at" );
318
// fprintf( f, "RFFT(%d)\n", nfft );
320
// for ( i = 0; i < nfft; i++ )
322
// fprintf( f, ";%d;%g;%g\n", i, x[i], xi[i] );
331
// fprintf( stderr, "bad config for logm = %d\n", logm);
336
//void fft( FFT_Tables *fft_tables, double *xr, double *xi, int logm )
340
// complex_t c[1 << MAXLOGM];
342
// if ( logm > MAXLOGM )
344
// fprintf(stderr, "fft size too big\n");
348
// nfft = logm_to_nfft[logm];
350
// if ( fft_tables->cfft[logm] == NULL )
354
// fft_tables->cfft[logm] = cffti( nfft );
358
// fprintf(stderr, "bad logm = %d\n", logm);
363
// if ( fft_tables->cfft[logm] )
367
// for ( i = 0; i < nfft; i++ )
369
// RE( c[i] ) = xr[i];
370
// IM( c[i] ) = xi[i];
373
// cfftf( fft_tables->cfft[logm], c );
375
// for ( i = 0; i < nfft; i++ )
377
// xr[i] = RE( c[i] );
378
// xi[i] = IM( c[i] );
381
//#ifdef SUR_DEBUG_FFT
383
// FILE* f = fopen( "fft.log", "at" );
385
// fprintf( f, "FFT(%d)\n", nfft );
387
// for ( i = 0; i < nfft; i++ )
389
// fprintf( f, ";%d;%g;%g\n", i, xr[i], xi[i] );
398
// fprintf( stderr, "bad config for logm = %d\n", logm);
403
//void ffti( FFT_Tables *fft_tables, double *xr, double *xi, int logm )
407
// complex_t c[1 << MAXLOGM];
409
// if ( logm > MAXLOGM )
411
// fprintf(stderr, "fft size too big\n");
415
// nfft = logm_to_nfft[logm];
417
// if ( fft_tables->cfft[logm] == NULL )
421
// fft_tables->cfft[logm] = cffti( nfft );
425
// fprintf(stderr, "bad logm = %d\n", logm);
430
// if ( fft_tables->cfft[logm] )
434
// for ( i = 0; i < nfft; i++ )
436
// RE( c[i] ) = xr[i];
437
// IM( c[i] ) = xi[i];
440
// cfftb( fft_tables->cfft[logm], c );
442
// for ( i = 0; i < nfft; i++ )
444
// xr[i] = RE( c[i] );
445
// xi[i] = IM( c[i] );
448
//#ifdef SUR_DEBUG_FFT
450
// FILE* f = fopen( "fft.log", "at" );
452
// fprintf( f, "FFTI(%d)\n", nfft );
454
// for ( i = 0; i < nfft; i++ )
456
// fprintf( f, ";%d;%g;%g\n", i, xr[i], xi[i] );
465
// fprintf( stderr, "bad config for logm = %d\n", logm);
470
#else /* !defined DRM || defined DRM_1024 */
32
472
void fft_initialize( FFT_Tables *fft_tables )