66 #include <lal/LALStdlib.h>
67 #include <lal/LALgetopt.h>
68 #include <lal/LALConstants.h>
69 #include <lal/SeqFactories.h>
70 #include <lal/RealFFT.h>
71 #include <lal/VectorOps.h>
75 #define CODES(x) CODES_(x)
88 TestStatus(
LALStatus *
status,
const char *expectedCodes,
int exitCode );
90 void LALForwardRealDFT(
96 int main(
int argc,
char *argv[] )
158 TestStatus( &
status, CODES( 0 ), 1 );
160 TestStatus( &
status, CODES( 0 ), 1 );
162 TestStatus( &
status, CODES( 0 ), 1 );
164 TestStatus( &
status, CODES( 0 ), 1 );
166 TestStatus( &
status, CODES( 0 ), 1 );
169 TestStatus( &
status, CODES( 0 ), 1 );
176 for ( i = 0; i <
m; ++i )
191 for ( j = 0; j < n; ++j )
193 dat->
data[j] = 20.0 * rand() / (
REAL4)( RAND_MAX + 1.0 ) - 10.0;
197 lbn = log( n ) / log( 2 );
198 var = 2.5 * lbn *
eps *
eps * ssq / n;
199 tol = 5 * sqrt( var );
210 fp ?
fprintf(
fp,
"rfft()\t\trfft(rfft())\trfft(rfft())\n\n" ) : 0;
211 for ( j = 0; j < n; ++j )
218 LALForwardRealDFT( &
status, dft, dat );
219 TestStatus( &
status, CODES( 0 ), 1 );
228 for ( k = 0; k <= n / 2; ++k )
234 REAL8 errre = fabs( dftre - fftre );
235 REAL8 errim = fabs( dftim - fftim );
236 REAL8 avere = fabs( dftre + fftre ) / 2 +
eps;
237 REAL8 aveim = fabs( dftim + fftim ) / 2 +
eps;
238 REAL8 ferre = errre / avere;
239 REAL8 ferim = errim / aveim;
244 if ( ferre >
eps && errre > tol )
246 fputs(
"FAIL: Incorrect result from forward transform\n", stderr );
247 fprintf( stderr,
"\tdifference = %e\n", errre );
248 fprintf( stderr,
"\ttolerance = %e\n", tol );
249 fprintf( stderr,
"\tfrac error = %e\n", ferre );
253 if ( ferim >
eps && errim > tol )
255 fputs(
"FAIL: Incorrect result from forward transform\n", stderr );
256 fprintf( stderr,
"\tdifference = %e\n", errim );
257 fprintf( stderr,
"\ttolerance = %e\n", tol );
258 fprintf( stderr,
"\tfrac error = %e\n", ferim );
271 TestStatus( &
status, CODES( 0 ), 1 );
272 fp ?
fprintf(
fp,
"\ndat->data[j]\tans->data[j] / n\n" ) : 0;
273 for ( j = 0; j < n; ++j )
277 REAL8 fer = err / ave;
280 if ( fer >
eps && err > tol )
282 fputs(
"FAIL: Incorrect result after reverse transform\n", stderr );
283 fprintf( stderr,
"\tdifference = %e\n", err );
284 fprintf( stderr,
"\ttolerance = %e\n", tol );
285 fprintf( stderr,
"\tfrac error = %e\n", fer );
293 TestStatus( &
status, CODES( 0 ), 1 );
295 TestStatus( &
status, CODES( 0 ), 1 );
297 TestStatus( &
status, CODES( 0 ), 1 );
299 TestStatus( &
status, CODES( 0 ), 1 );
301 TestStatus( &
status, CODES( 0 ), 1 );
311 TestStatus( &
status, CODES( 0 ), 1 );
337 if ( strncpy( str, ignored,
sizeof( str ) ) )
339 if ( (tok = strtok( str,
" " ) ) )
343 if (
status->statusCode == atoi( tok ) )
348 while ( ( tok = strtok( NULL,
" " ) ) );
352 if (
status->statusCode == atoi( str ) )
359 fprintf( stderr,
"\nExiting to system with code %d\n", exitcode );
374 fprintf( stderr,
"Options:\n" );
375 fprintf( stderr,
" -h print this message\n" );
376 fprintf( stderr,
" -q quiet: run silently\n" );
377 fprintf( stderr,
" -v verbose: print extra information\n" );
378 fprintf( stderr,
" -d level set lalDebugLevel to level\n" );
379 fprintf( stderr,
" -m trials set number of random trials\n" );
380 fprintf( stderr,
" -n size set size of FFTs\n" );
400 c =
LALgetopt( argc, argv,
"hqvd:m:n:" );
424 fp = freopen(
"/dev/null",
"w", stderr );
427 fprintf(stderr,
"Error: Unable to open /dev/null\n");
430 fp = freopen(
"/dev/null",
"w", stdout );
433 fprintf(stderr,
"Error: Unable to open /dev/null\n");
473 for ( k = 0; k < n; ++k )
477 for ( j = 0; j < n; ++j )
480 REAL8 c = cos( phi );
481 REAL8 s = sin( phi );
484 sre += c * re - s * im;
485 sim += c * im + s * re;
488 output->data[k] += I * sim;
494 void LALForwardRealDFT(
514 for ( j = 0; j < n; ++j )
515 a->data[j] = input->
data[j];
519 for ( k = 0; k <= n / 2; ++k )
void REPORTSTATUS(LALStatus *status)
void LALCheckMemoryLeaks(void)
#define TRY(func, statusptr)
#define ATTATCHSTATUSPTR(statusptr)
#define DETATCHSTATUSPTR(statusptr)
#define INITSTATUS(statusptr)
#define RETURN(statusptr)
int LALgetopt(int argc, char *const *argv, const char *optstring)
static void Usage(const char *program, int exitcode)
static void ParseOptions(int argc, char *argv[])
int main(int argc, char *argv[])
#define LAL_TWOPI
2*pi is circumference of a circle divided by its radius
double REAL8
Double precision real floating-point number (8 bytes).
uint32_t UINT4
Four-byte unsigned integer.
int32_t INT4
Four-byte signed integer.
float REAL4
Single precision real floating-point number (4 bytes).
REAL4FFTPlan * XLALCreateReverseREAL4FFTPlan(UINT4 size, int measurelvl)
Returns a new REAL4FFTPlan for a reverse transform.
REAL4FFTPlan * XLALCreateForwardREAL4FFTPlan(UINT4 size, int measurelvl)
Returns a new REAL4FFTPlan for a forward transform.
void XLALDestroyREAL4FFTPlan(REAL4FFTPlan *plan)
Destroys a REAL4FFTPlan.
int XLALREAL4VectorFFT(REAL4Vector *_LAL_RESTRICT_ output, const REAL4Vector *_LAL_RESTRICT_ input, const REAL4FFTPlan *plan)
Perform a REAL4Vector to REAL4Vector FFT.
int XLALREAL4ReverseFFT(REAL4Vector *output, const COMPLEX8Vector *input, const REAL4FFTPlan *plan)
Performs a reverse FFT of REAL4 data.
int XLALREAL4ForwardFFT(COMPLEX8Vector *output, const REAL4Vector *input, const REAL4FFTPlan *plan)
Performs a forward FFT of REAL4 data.
void LALCCreateVector(LALStatus *, COMPLEX8Vector **, UINT4)
void LALCDestroyVector(LALStatus *, COMPLEX8Vector **)
void LALSDestroyVector(LALStatus *, REAL4Vector **)
void LALSCreateVector(LALStatus *, REAL4Vector **, UINT4)
Vector of type COMPLEX8, see DATATYPE-Vector types for more details.
COMPLEX8 * data
Pointer to the data array.
LAL status structure, see The LALStatus structure for more details.
Vector of type REAL4, see DATATYPE-Vector types for more details.
REAL4 * data
Pointer to the data array.
UINT4 length
Number of elements in array.
void output(int gps_sec, int output_type)