23int main(
int argc, 
char **argv)
 
   36    JParser<> zap(
"Auxiliary program to run fast Fourier transformation (FFT).");
 
   38    zap[
'f'] = 
make_field(inputFile,  
"input file (containing 1D array of values)");
 
   40    zap[
'B'] = 
make_field(binWidth,   
"bin width of input array (if zero, use index)") = 0.0;
 
   41    zap[
'F'] = 
make_field(precision,  
"number of decimals if output format")           = 9;
 
   46  catch(
const exception& error) {
 
   47    FATAL(error.what() << endl);
 
   54  istream* in = open<istream>(inputFile);
 
   57    FATAL(
"Invalid file " << inputFile << endl);
 
   60  for (
double x; *in >> x; ) {
 
   66  const size_t N  = data.size(); 
 
   69    FATAL(
"Number of points: " << N << endl);
 
   74  const size_t  NS     = N/2 + 1;
 
   75  double*       input  = (
double*) malloc(
sizeof(
double) *  N);
 
   76  fftw_complex* output = (fftw_complex*) fftw_malloc(
sizeof(fftw_complex) * NS);
 
   77  fftw_plan     plan   = fftw_plan_dft_r2c_1d(N, input, output, FFTW_MEASURE);
 
   79  for (
size_t i = 0; i != N; ++i) {
 
   89  fftw_destroy_plan(plan);
 
   93  const double xmin  = (binWidth != 0.0 ? 1.0 / (N * binWidth) : 0.0);
 
   94  const double xmax  = (binWidth != 0.0 ? 1.0 / (binWidth)     : 0.0);
 
   96  const int    width = precision + 7;
 
   98  ostream* out = open<ostream>(
outputFile.c_str());
 
  100  for (
size_t i = 0; i != NS; ++i) {
 
  102    const double real  = output[i][0];
 
  103    const double imag  = output[i][1];
 
  104    const double power = sqrt(real*real + imag*imag);
 
  107      *out << 
SCIENTIFIC(width,precision) << xmin + (double) i * (xmax - xmin) / (double) (N - 1);
 
  112    *out << 
SCIENTIFIC(width,precision) << power << endl;