Guru Complex DFTs (FFTW 3.3.11)

#### 4.5.3 Guru Complex DFTs ¶

    fftw_plan fftw_plan_guru_dft(
         int rank, const fftw_iodim *dims,
         int howmany_rank, const fftw_iodim *howmany_dims,
         fftw_complex *in, fftw_complex *out,
         int sign, unsigned flags);

    fftw_plan fftw_plan_guru_split_dft(
         int rank, const fftw_iodim *dims,
         int howmany_rank, const fftw_iodim *howmany_dims,
         double *ri, double *ii, double *ro, double *io,
         unsigned flags);

These two functions plan a complex-data, multi-dimensional DFT for the interleaved and split format, respectively. Transform dimensions are given by (`rank`, `dims`) over a multi-dimensional vector (loop) of dimensions (`howmany_rank`, `howmany_dims`). `dims` and `howmany_dims` should point to `fftw_iodim` arrays of length `rank` and `howmany_rank`, respectively.

`flags` is a bitwise OR (‘`|`’) of zero or more planner flags, as defined in Planner Flags.

In the `fftw_plan_guru_dft` function, the pointers `in` and `out` point to the interleaved input and output arrays, respectively. The sign can be either -1 (= `FFTW_FORWARD`) or +1 (= `FFTW_BACKWARD`). If the pointers are equal, the transform is in-place.

In the `fftw_plan_guru_split_dft` function, `ri` and `ii` point to the real and imaginary input arrays, and `ro` and `io` point to the real and imaginary output arrays. The input and output pointers may be the same, indicating an in-place transform. For example, for `fftw_complex` pointers `in` and `out`, the corresponding parameters are:

    ri = (double *) in;
    ii = (double *) in + 1;
    ro = (double *) out;
    io = (double *) out + 1;

Because `fftw_plan_guru_split_dft` accepts split arrays, strides are expressed in units of `double`. For a contiguous `fftw_complex` array, the overall stride of the transform should be 2, the distance between consecutive real parts or between consecutive imaginary parts; see Guru vector and transform sizes. Note that the dimension strides are applied equally to the real and imaginary parts; real and imaginary arrays with different strides are not supported.

There is no `sign` parameter in `fftw_plan_guru_split_dft`. This function always plans for an `FFTW_FORWARD` transform. To plan for an `FFTW_BACKWARD` transform, you can exploit the identity that the backwards DFT is equal to the forwards DFT with the real and imaginary parts swapped. For example, in the case of the `fftw_complex` arrays above, the `FFTW_BACKWARD` transform is computed by the parameters:

    ri = (double *) in + 1;
    ii = (double *) in;
    ro = (double *) out + 1;
    io = (double *) out;