<!--
{
  "documentType" : "article",
  "framework" : "Accelerate",
  "identifier" : "/documentation/Accelerate/out-of-place-functions-for-2d-complex-fft",
  "metadataVersion" : "0.1.0",
  "role" : "collectionGroup",
  "title" : "Out-of-Place Functions for 2D Complex FFT"
}
-->

# Out-of-Place Functions for 2D Complex FFT

Perform fast Fourier transforms out of place on 2D complex data.

## Discussion

The functions in this group use the following operation for a complex-to-complex transform:

```swift
N0 = 1 << Log2N0;
N1 = 1 << Log2N1;

if (IA1 == 0) IA1 = IA0*N0;
if (IC1 == 0) IC1 = IC0*N0;

scale = 0 < Direction ? 1 : 1. / (N1*N0);

// Define a complex matrix, h:
for (j1 = 0; j1 < N1; ++j1)
for (j0 = 0; j0 < N0; ++j0)
    h[j1][j0] = A->realp[j1*IA1 + j0*IA0]
          + i * A->imagp[j1*IA1 + j0*IA0];

// Perform Discrete Fourier Transform.
for (k1 = 0; k1 < N1; ++k1)
for (k0 = 0; k0 < N0; ++k0)
    H[k1][k0] = scale * sum(sum(h[j1][j0]
        * e**(-Direction*2*pi*i*j0*k0/N0), 0 <= j0 < N0)
        * e**(-Direction*2*pi*i*j1*k1/N1), 0 <= j1 < N1);

// Store result.
for (k1 = 0; k1 < N1; ++k1)
for (k0 = 0; k0 < N0; ++k0)
{
    C->realp[k1*IC1 + k0*IC0] = Re(H[k1][k0]);
    C->imagp[k1*IC1 + k0*IC0] = Im(H[k1][k0]);
}
```

The temporary buffer versions perform the same operation but use a temporary buffer for improved performance.

## Topics

### Out-of-Place FFT Functions

[`extern void vDSP_fft2d_zop(FFTSetup __Setup, const DSPSplitComplex *__A, vDSP_Stride __IA0, vDSP_Stride __IA1, const DSPSplitComplex *__C, vDSP_Stride __IC0, vDSP_Stride __IC1, vDSP_Length __Log2N0, vDSP_Length __Log2N1, FFTDirection __Direction);`](/documentation/Accelerate/vDSP_fft2d_zop)

Computes a 2D forward or inverse out-of-place, single-precision complex FFT.

[`extern void vDSP_fft2d_zopD(FFTSetupD __Setup, const DSPDoubleSplitComplex *__A, vDSP_Stride __IA0, vDSP_Stride __IA1, const DSPDoubleSplitComplex *__C, vDSP_Stride __IC0, vDSP_Stride __IC1, vDSP_Length __Log2N0, vDSP_Length __Log2N1, FFTDirection __Direction);`](/documentation/Accelerate/vDSP_fft2d_zopD)

Computes a 2D forward or inverse out-of-place, double-precision complex FFT.

### Out-of-Place FFT Functions with Temporary Buffer

[`extern void vDSP_fft2d_zopt(FFTSetup __Setup, const DSPSplitComplex *__A, vDSP_Stride __IA0, vDSP_Stride __IA1, const DSPSplitComplex *__C, vDSP_Stride __IC0, vDSP_Stride __IC1, const DSPSplitComplex *__Buffer, vDSP_Length __Log2N0, vDSP_Length __Log2N1, FFTDirection __Direction);`](/documentation/Accelerate/vDSP_fft2d_zopt)

Computes a 2D forward or inverse out-of-place, single-precision complex FFT using a temporary buffer.

[`extern void vDSP_fft2d_zoptD(FFTSetupD __Setup, const DSPDoubleSplitComplex *__A, vDSP_Stride __IA0, vDSP_Stride __IA1, const DSPDoubleSplitComplex *__C, vDSP_Stride __IC0, vDSP_Stride __IC1, const DSPDoubleSplitComplex *__Buffer, vDSP_Length __Log2N0, vDSP_Length __Log2N1, FFTDirection __Direction);`](/documentation/Accelerate/vDSP_fft2d_zoptD)

Computes a 2D forward or inverse out-of-place, double-precision complex FFT using a temporary buffer.



---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)