fullseye

angular_spectrum_propagate — OPTICS wave op

使い方

Exact scalar free-space propagation of a complex field (angular spectrum).

U(z) = IFFT{ FFT{U(0)} * exp(i*2*pi*z*sqrt(1/lambda^2 - fx^2 - fy^2)) } in the exp(-i*omega*t) convention, so a positive distance_um propagates forward. Components beyond the propagating cone (fx^2 + fy^2 > 1/lambda^2) are attenuated by exp(-2*pi*|z|*sqrt(fx^2 + fy^2 - 1/lambda^2)), which is the physical evanescent decay — not zeroed, so distance_um = 0 is an exact identity and the transfer function is continuous through it.

Unlike Fresnel propagation this makes no paraxial approximation: it is the exact solution of the Helmholtz equation for a band-limited field, valid from a fraction of a wavelength outward.

Returns a complex128 array with the same shape as field.

Ground truth it reproduces (measured): distance_um = 0 returns the field bit-identically (it short-circuits the transform pair); propagating +z then -z returns the original to a relative L2 error of 4.3e-16 to 5.3e-16 for a band-limited field (measured on three: 64x64 random at +/-50 um, a 64x64 Gaussian at +/-250 um, a 128x128 random at +/-500 um); total power is conserved to between 0 and 3.5e-16 relative on the same three. A field with evanescent content does not round-trip — those components are gone by construction, in both directions, because that is what physically happens.

field is a field in the space domain, not a spectrum: do not hand it the fftshifted output of :func:complexops.cx_fft. Real input is promoted to complex, which loses nothing.

Aliasing: the discrete transfer function is periodic, so a field that diffracts past the array edge wraps around. The practical guard is the usual one — pad the field so the propagated support stays inside, and keep pixel_pitch_um below lambda/(2*NA). No warning can detect this reliably from the array alone, so none is invented.

Raises ValueError: field is not 2-D, smaller than 2x2, larger than :data:MAX_FIELD_ELEMENTS, masked, or non-finite; non-positive or non-finite wavelength_um / pixel_pitch_um; non-finite distance_um.

ファミリ共通の入力契約(fail-closed)

optics の全 op は入力を検証してから計算する(黙って通さない):

詳しい使い方ガイド

参考(サンプルデータ・文献)

実行できる例(この op を実際に呼ぶ検証済みサンプル)

型が繋がる次の op(cimage を入力に取れる)

jones_apply

同カテゴリ(wave)

airy_pattern · fraunhofer_pattern · gaussian_beam · defocus_from_shift · pupil_psf · pupil_blur


Provenance: optics.py — OPTICS operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.