mgomes / ruby-fftw3

Ruby wrapper around the FFTW library for performing Fast Fourier Transforms
http://ruby.gfd-dennou.org/products/ruby-fftw3
8 stars 2 forks source link

=module NumRu::FFTW3

Fast Fourier Transforms by using ((<FFTW|URL:http://www.fftw.org>)) Ver.3.

Takeshi Horinouchi

(C) Takeshi Horinouchi / GFD Dennou Club, 2003

NO WARRANTY

==Features

==Features yet to be introduced

==Installation

==How to use

See the following peice of code. (Install this library and copy and paste the following to the interactive shell irb).

require "narray" require "numru/fftw3" include NumRu

na = NArray.float(8,6) # float -> will be corced to complex na[1,1]=1

<example 1>

fc = FFTW3.fft(na, -1)/na.length # forward 2D FFT and normalization nc = FFTW3.fft(fc, 1) # backward 2D FFT (complex) --> nb = nc.real # should be equal to na except round errors

<example 2>

fc = FFTW3.fft(na, -1, 0) / na.shape[0] # forward FFT with the first dim

<example 3>

fc = FFTW3.fft(na, -1, 1) / na.shape[1] # forward FFT with the second dim

==API Reference

===Module methods

---fft(narray, dir [,dim,dim,...])

Complex FFT.

The 3rd, 4th,... arguments are optional.

ARGUMENTS
* narray (NArray or NArray-compatible Array) : array to be
  transformed. If real, coerced to complex before transformation.
  If narray is single-precision and the single-precision
  version of FFTW3 is installed (before installing this module),
  this method does a single-precision transform. 
  Otherwise, a double-precision transform is used.
* dir (-1 or 1) : forward transform if -1; backward transform if 1.
* optional 3rd, 4th,... arguments (Integer) : Specifies dimensions 
  to apply FFT. For example, if 0, the first dimension is
  transformed (1D FFT); If -1, the last dimension is used (1D FFT);
  If 0,2,4, the first, third, and fifth dimensions
  are transformed (3D FFT); If entirely omitted, ALL DIMENSIONS
  ARE SUBJECT TO FFT, so 3D FFT is done with a 3D array.

RETURN VALUE
* a complex NArray

NOTE
* As in FFTW, return value is NOT normalized. Thus, a consecutive
  forward and backward transform would multiply the size of
  data used for transform. You can normalize, for example,
  the forward transform FFTW.fft(narray, -1, 0, 1)
  (FFT regarding the first (dim 0) & second (dim 1) dimensions) by
  dividing with (narray.shape[0]*narray.shape[1]). Likewise,
  the result of FFTW.fft(narray, -1) (FFT for all dimensions)
  can be normalized by narray.length.