Intel® oneAPI Math Kernel Library Developer Reference - Fortran

Configuring and Computing an FFT in Fortran

The table below summarizes information on configuring and computing an FFT in Fortran for all kinds of transforms and possible combinations of input and output domains.

FFT to Compute

Input Data

Output Data

Required FFT Function Calls

Complex-to-complex,

in-place,

forward or backward

Interleaved complex numbers

Interleaved complex numbers

! Configure a Descriptor
status = DftiCreateDescriptor(hand, <precision>, &
    DFTI_COMPLEX, <dimension>, <sizes>)
status = DftiCommitDescriptor(hand)

! Compute an FFT
! forward FFT
status = DftiComputeForward(hand, X_inout)
! or backward FFT
status = DftiComputeBackward(hand, X_inout)

Complex-to-complex,

out-of-place,

forward or backward

Interleaved complex numbers

Interleaved complex numbers

! Configure a Descriptor
status = DftiCreateDescriptor(hand, <precision>, &
    DFTI_COMPLEX, <dimension>, <sizes>)
status = DftiSetValue(hand, DFTI_PLACEMENT, &
    DFTI_NOT_INPLACE)
status = DftiCommitDescriptor(hand)

! Compute an FFT
! forward FFT
status = DftiComputeForward(hand, X_in, Y_out)
! or backward FFT
status = DftiComputeBackward(hand, X_in, Y_out)

Complex-to-complex,

in-place,

forward or backward

Split-complex numbers

Split-complex numbers

! Configure a Descriptor
status = DftiCreateDescriptor(hand, <precision>, &
    DFTI_COMPLEX, <dimension>, <sizes>)
status = DftiSetValue(hand, & 
    DFTI_COMPLEX_STORAGE, DFTI_REAL_REAL)
status = DftiCommitDescriptor(hand)

! Compute an FFT
! forward FFT
status = DftiComputeForward(hand, Xre_inout, &
    Xim_inout)
! or backward FFT
status = DftiComputeBackward(hand, Xre_inout, &
    Xim_inout)

Complex-to-complex,

out-of-place,

forward or backward

Split-complex numbers

Split-complex numbers

! Configure a Descriptor
status = DftiCreateDescriptor(hand, <precision>, &
    DFTI_COMPLEX, <dimension>, <sizes>)
status = DftiSetValue(hand, &
    DFTI_COMPLEX_STORAGE, DFTI_REAL_REAL)
status = DftiSetValue(hand, &
    DFTI_PLACEMENT, DFTI_NOT_INPLACE)
status = DftiCommitDescriptor(hand)

! Compute an FFT
! forward FFT
status = DftiComputeForward(hand, Xre_in, &
    Xim_in, Yre_out, Yim_out)
! or backward FFT
status = DftiComputeBackward(hand, Xre_in, &
    Xim_in, Yre_out, Yim_out)

Real-to-complex,

in-place,

forward

Real numbers

Numbers in the CCE format

! Configure a Descriptor
status = DftiCreateDescriptor(hand, <precision>, & 
   DFTI_REAL, <dimension>, <sizes>)
status = DftiSetValue(hand, &
    DFTI_CONJUGATE_EVEN_STORAGE, & 
    DFTI_COMPLEX_COMPLEX)
status = DftiSetValue(hand, DFTI_PACKED_FORMAT,  &
    DFTI_CCE_FORMAT)
status = DftiSetValue(hand, DFTI_INPUT_STRIDES,  &
    <real_strides>)
status = DftiSetValue(hand, DFTI_OUTPUT_STRIDES, &
    <complex_strides>)
status = DftiCommitDescriptor(hand)

! Compute an FFT
status = DftiComputeForward(hand, X_inout)

Real-to-complex,

out-of-place,

forward

Real numbers

Numbers in the CCE format

! Configure a Descriptor
status = DftiCreateDescriptor(hand, <precision> &, 
    DFTI_REAL, <dimension>, <sizes>)
status = DftiSetValue(hand, &
    DFTI_CONJUGATE_EVEN_STORAGE, & 
    DFTI_COMPLEX_COMPLEX)
status = DftiSetValue(hand, DFTI_PACKED_FORMAT, &
    DFTI_CCE_FORMAT)
status = DftiSetValue(hand, DFTI_PLACEMENT, &
    DFTI_NOT_INPLACE)
status = DftiSetValue(hand, DFTI_INPUT_STRIDES, &
    <real_strides>)
status = DftiSetValue(hand, DFTI_OUTPUT_STRIDES, &
    <complex_strides>)
status = DftiCommitDescriptor(hand)

! Compute an FFT
status = DftiComputeForward(hand, X_in, Y_out)

Complex-to-real,

in-place,

backward

Numbers in the CCE format

Real numbers

! Configure a Descriptor
status = DftiCreateDescriptor(hand, <precision>, & 
    DFTI_REAL, <dimension>, <sizes>)
status = DftiSetValue(hand, &
    DFTI_CONJUGATE_EVEN_STORAGE, & 
    DFTI_COMPLEX_COMPLEX)
status = DftiSetValue(hand, DFTI_PACKED_FORMAT, &
    DFTI_CCE_FORMAT)
status = DftiSetValue(hand, DFTI_INPUT_STRIDES, &
    <complex_strides>)
status = DftiSetValue(hand, DFTI_OUTPUT_STRIDES, &
    <real_strides>)
status = DftiCommitDescriptor(hand)

! Compute an FFT
status = DftiComputeBackward(hand, X_inout)

Complex-to-real,

out-of-place,

backward

Numbers in the CCE format

Real numbers

! Configure a Descriptor
status = DftiCreateDescriptor(hand, <precision>, & 
    DFTI_REAL, <dimension>, <sizes>)
status = DftiSetValue(hand, & 
    DFTI_CONJUGATE_EVEN_STORAGE, & 
    DFTI_COMPLEX_COMPLEX)
status = DftiSetValue(hand, DFTI_PLACEMENT, &
    DFTI_NOT_INPLACE)
status = DftiSetValue(hand, DFTI_PACKED_FORMAT, &
    DFTI_CCE_FORMAT)
status = DftiSetValue(hand, DFTI_INPUT_STRIDES, &
    <complex_strides>)
status = DftiSetValue(hand, DFTI_OUTPUT_STRIDES, &
    <real_strides>)
status = DftiCommitDescriptor(hand)

! Compute an FFT
status = DftiComputeBackward(hand, X_in, Y_out)

You can find Fortran programs that illustrate configuring and computing FFTs in the examples/dftf/subdirectory of your Intel® oneAPI Math Kernel Library directory.