#!/usr/bin/python -Wall # ---------------------------------------------------------------- # John Kerl # kerl.john.r@gmail.com # 2005-01-11 # (Ported to Python 2006-03-06) # # This is a radix-2 fast Fourier transform. Example: # # bash$ cat a.txt # 1 0.02 # 2 0.04 # 3 0.06 # 4 0.08 # 5 0.10 # 6 0.12 # 7 0.14 # 8 0.16 # bash$ pyfft a.txt # 12.72792206136 0.25455844123 # -1.48249783362 3.38592929113 # -1.44249783362 1.38592929113 # -1.42592929113 0.55750216638 # -1.41421356237 -0.02828427125 # -1.40249783362 -0.61407070887 # -1.38592929113 -1.44249783362 # -1.34592929113 -3.44249783362 # bash$ pyfft a.txt | pyfft -rev # 1.00000000000 0.02000000001 # 2.00000000000 0.04000000000 # 3.00000000000 0.06000000000 # 4.00000000000 0.08000000000 # 5.00000000000 0.10000000000 # 6.00000000000 0.12000000000 # 7.00000000001 0.13999999999 # 8.00000000000 0.16000000000 # # This file contains the I/O wrapper. The library routine is in pyfft_m.py. # ---------------------------------------------------------------- # This software is released under the terms of the GNU GPL. # Please see LICENSE.txt in the same directory as this file. # ================================================================ from __future__ import division # 1/2 = 0.5, not 0. import sys import pyfft_m import pyrcio_m # ---------------------------------------------------------------- def usage(): print >> sys.stderr, "Usage:", sys.argv[0], "[options] [file name]" print >> sys.stderr, "If the file name is omitted, input is taken from standard input." print >> sys.stderr, "Format is in whitespace-delimited decimal rectangular, e.g." print >> sys.stderr, " 1.0 0.0" print >> sys.stderr, " 2.0 0.0" print >> sys.stderr, " 3.0 0.0" print >> sys.stderr, " 4.0 0.0" print >> sys.stderr, "Options:" print >> sys.stderr, " -fi: input folding" print >> sys.stderr, " -nfi: no input folding" print >> sys.stderr, " -fo: output folding" print >> sys.stderr, " -nfo: no output folding" print >> sys.stderr, " -fwd: forward FFT (exp(-i 2 pi k/N) kernel)" print >> sys.stderr, " -rev: reverse FFT (exp( i 2 pi k/N) kernel)" print >> sys.stderr, " -s: scaling" print >> sys.stderr, " -ns: no scaling" print >> sys.stderr, " -dft: Use DFT. Allows N not to be a power of 2." sys.exit(1) # ================================================================ # Start of program fold_in = 0 fold_out = 0 forward = 1 scale = 1 use_dft = 0 file_name = "-" argc = len(sys.argv) argi = 1 while (argi < argc): arg = sys.argv[argi] if (arg[0] != '-'): break if (arg == "-fi"): fold_in = 1 elif (arg == "-nfi"): fold_in = 0 elif (arg == "-fo"): fold_out = 1 elif (arg == "-nfo"): fold_out = 0 elif (arg == "-fwd"): forward = 1 elif (arg == "-rev"): forward = 0 elif (arg == "-s"): scale = 1 elif (arg == "-ns"): scale = 0 elif (arg == "-dft"): use_dft = 1 elif (arg == "-ndft"): use_dft = 0 else: usage() argi += 1 if ((argc - argi) == 1): file_name = sys.argv[argi] elif ((argc - argi) == 0): file_name = "-" else: usage() u = pyrcio_m.read_complex_column_vector(file_name) if (use_dft): v = pyfft_m.dft(u, fold_in, fold_out, forward, scale) else: v = pyfft_m.fft(u, fold_in, fold_out, forward, scale) pyrcio_m.print_complex_column_vector(v)