fraunhofer_propagation

colibri.optics.functional.fraunhofer_propagation(field, M, N, pixel_size, wavelengths, distance, device=device(type='cpu'))[source]

The Fraunhofer approximation of \(U_0(x',y')\) is its Fourier transform, \(\mathcal{F}\{U_0\}\) with an additional phase factor that depends on the distance of propagation, \(z\). The Fraunhofer approximation is given by the following equation:

\[U(x,y,z) \approx \frac{e^{jkz}e^{\frac{jk\left(x^2+y^2\right)}{2z}}}{j\lambda z} \mathcal{F}\left\{U_0(x,y)\right\}\left(\frac{x}{\lambda z}, \frac{y}{\lambda z}\right)\]

where \(U(x,y,z)\) is the field at distance \(z\) from the source, \(U_0(x,y)\) is the field at the source, \(\mathcal{F}\) is the Fourier transform operator, \(k\) is the wavenumber, \(\lambda\) is the wavelength, \(\frac{x}{\lambda z}\) and \(\frac{y}{\lambda z}\) are the spatial frequencies, and \(z\) is the distance of propagation.

Parameters:
  • field (torch.Tensor) – Input field.

  • M (int) – Resolution at Y axis in pixels.

  • N (int) – Resolution at X axis in pixels.

  • pixel_size (float) – Pixel pixel_size in meters.

  • wavelengths (torch.Tensor) – Wavelengths in meters.

  • distance (float) – Distance in meters.

  • device (torch.device) – Device, for more see torch.device().

Returns:

Propagated field.

Return type:

torch.Tensor