Skip to content

Angular Spectrum Sync Task

The Angular Spectrum Method (ASM) models free-space propagation of a wavefield by decomposing it into plane waves and applying a phase shift in the spatial frequency domain.

Given a scalar real or complex field \(U(x, y, 0)\) at \(z = 0\), its propagated field at distance \(z\) is:

\[ U(x, y, z) = \mathcal{F}^{-1} \{ \mathcal{F}\{U(x, y, 0)\} \cdot H(f_x, f_y, z) \} \]

where \(\mathcal{F}\) and \(\mathcal{F}^{-1}\) are the 2D Fourier and inverse Fourier transforms, and the transfer function \(H(f_x, f_y, z)\) is:

\[ H(f_x, f_y, z) = \exp\left( i 2\pi z \sqrt{\frac{1}{\lambda^2} - f_x^2 - f_y^2} \right) \]

where:

  • \(\lambda\): wavelength
  • \(f_x, f_y\): spatial frequencies
  • \(z\): propagation distance

See Angular Spectrum Method - Wikipedia and Angular Spectrum Method - LibreTexts for more details.

Note

This task can perform an optional frequency domain filtering step specified by the optional filter setting. See the Filter 2D task documentation for more details on the available filter types and settings.

Note

The optional padding setting centers the input in a larger zero-filled grid before propagation. The requested width and height must be at least the input dimensions, and the number of pixels added on each axis must be even.

Inputs

This task has a single input tensor of rank 2 or higher. The last two dimensions are the propagated spatial dimensions:

  • H: height of the input field
  • W: width of the input field

Any leading dimensions are treated as batch dimensions. The dtype of the input tensor must be 32-bit real (float32) or complex 32-bit (complex32).

The memory location of the input tensor must be device memory.

Outputs

This task has a single complex 32-bit (complex32) output. Without padding, its shape matches the input. With padding, the last two dimensions are replaced by the requested padded height and width; all leading batch dimensions are preserved.

The memory location of the output tensor is device memory.

Inplace

Without padding, this task has an inplace relationship between its input and output for complex input. Padding and real input require a separate complex output.

Ownership

This task does not own any inputs or outputs.


Settings

Examples:

1
2
3
4
5
6
{
    "lambda": 5.32e-07,
    "dx": 3.45e-06,
    "dy": 3.45e-06,
    "z": 0.1
}
{
    "lambda": 5.32e-07,
    "dx": 3.45e-06,
    "dy": 3.45e-06,
    "z": 0.1,
    "filter": {
        "r_inner": 120,
        "r_outer": 220,
        "s_inner": 16,
        "s_outer": 32
    }
}
{
    "lambda": 5.32e-07,
    "dx": 3.45e-06,
    "dy": 3.45e-06,
    "z": 0.1,
    "padding": {
        "width": 1024,
        "height": 1024
    }
}
Property Pattern Type Deprecated Definition Title/Description
+ lambda No number No - Wavelength in meters. Must satisfy:
- lambda > 0
+ dx No number No - Pixel pitch along X in meters. Must satisfy:
- dx > 0
- dx == dy
+ dy No number No - Pixel pitch along Y in meters. Must satisfy:
- dy > 0
- dy == dx
+ z No number No - Propagation distance in meters. Positive values propagate forward; negative values back-propagate.
- filter No object No - Optional bandlimiting filter expressed in pixels. Must satisfy:
- r_inner >= 0
- r_outer >= r_inner
- s_inner >= 0
- s_outer >= 0
- padding No object No - Optional centered zero-padding resolution. Target dimensions must fit the input and add an even number of pixels on each axis.