fourier_plane_filter — OPTICS wave op

• Datenarten: keine → cimage (ein Operator, der allein durch seine Argumente bestimmt ist — er nimmt kein Bild und keine Daten entgegen)

• Aufruf: import fullseye as fs; fs.ledger.fourier_plane_filter(size=64, kind='derivative_x', order=1, charge=1, radius_frac=0.25, pixel_pitch_um=1.0) (die Implementierung direkt: import optics; optics.fourier_plane_filter(size=64, kind='derivative_x', order=1, charge=1, radius_frac=0.25, pixel_pitch_um=1.0); aus dem Register: opsoptics.get("fourier_plane_filter"))

Verwendung

Komplexe Transmissionsfunktion H(fx, fy) in der Fourier-Ebene eines 4f-Systems.

Gibt ein complex128-Array in numpy.fft.fftfreq-Reihenfolge (ohne fftshift) der Form (size, size) zurück, das direkt an four_f_filter übergeben werden kann. Die Einheit der Ortsfrequenz ist cycles/um (fftfreq(size, d=pixel_pitch_um)).

*kind*:

identity

H = 1. Das 4f-System bildet nur ab —— die Ausgabe ist die Eingabe, um 180 Grad gedreht.

block

H = 0. Die Ausgabe ist exakt null (Fourier-Ebene blockiert).

derivative_x / derivative_y

H = (i*2*pi*f)**order. Die Ausgabe ist die räumliche Ableitung der Ordnung *order*. Die Linse berechnet die Ableitung —— in dieser 1 Zeile; das ist der Kern des optischen Rechnens.

laplacian

H = -(2*pi)**2 * (fx**2 + fy**2). Isotrope Ableitung 2. Ordnung.

lowpass / highpass

Kreisförmige Apertur |f| <= radius_frac * f_nyquist (bzw. ihr Komplement).

f_nyquist = 1/(2*pixel_pitch_um). Das Lehrbuchbeispiel der Raumfrequenzfilterung.

hilbert_x

H = -i*sign(fx) (0 bei fx = 0 und im Nyquist-Bin gerader Längen).

Die einseitige Phase hebt Kanten hervor —— die numerische Version des Schlierenverfahrens. ★Der Nyquist-Bin wird auf 0

gesetzt, weil fftfreq bei gerader Länge nur -1/2 liefert und das zugehörige +1/2

fehlt; bliebe er stehen, würde die Ausgabe einer reellen geraden Funktion die Ungeradesymmetrie nicht exakt erfüllen

(gemessen 1.6e-09 → auf 0 gesetzt: 2.3e-16). Die Standardbehandlung der diskreten Hilbert-Transformation.

vortex

Vortex-Phasenplatte H = exp(i*charge*phi). *charge* ist die Windungszahl der Phase:

1-mal um einen geschlossenen Weg in der Fourier-Ebene herum wächst die Phase um exakt 2*pi*charge

—— eine ganzzahlige Invariante, daher als Gate geeignet. ★Der DC-Term wird auf 0 gesetzt (weil phi im

Ursprung nicht definiert ist). Dadurch fällt der Mittelwert weg, und die Platte wirkt als

isotrope Kantenverstärkung (radiale Hilbert-Transformation).

Ground Truth (was dieser Op reproduziert):

• identity durch four_f_filter geschickt stimmt mit der um 180 Grad gedrehten Eingabe überein —— gemessen maximale absolute Differenz 3.4e-16 (64x64-Gauß, pixel_pitch_um=1). Nicht bitidentisch: der FFT-Hin- und Rückweg fügt Krümel von 1e-16 hinzu. Ein Kurzschluss wie bei der Ausbreitung über Distanz null würde es exakt machen, wäre aber eine Sonderbehandlung nur für identity.

• derivative_x order=1 auf die Gaußfunktion exp(-x**2/w**2) angewandt stimmt mit -2x/w**2 * exp(-x**2/w**2) überein (im Rahmen der Bandbegrenzung).

• Die Windungszahl von vortex: Summe der Phasendifferenzen entlang eines geschlossenen Wegs geteilt durch 2*pi ist exakt *charge*.

• lowpass + highpass = identity (exakt 1 bei gleichem *radius_frac*).

Raises ValueError: *kind* nicht in obiger Liste / *size* kleiner als 2 oder größer als MAX_GRID / *order* außerhalb 0..8 / *charge* außerhalb -32..32 / *radius_frac* 0 oder kleiner bzw. größer als 1 / *pixel_pitch_um* nicht positiv oder nicht endlich.

Familienweiter Eingabevertrag (fail-closed)

Jeder optics-Operator prüft seine Eingabe vor der Berechnung (nichts rutscht stillschweigend durch):

• Einheiten stecken im Argumentnamen — _mm / _um / _deg / _mrad. Eine Verwechslung von mm und µm stürzt nicht ab, sondern liefert eine plausibel aussehende falsche Antwort; der Name verhindert das. Aus der Größenordnung wird nie auf die Einheit geschlossen.

• Strings lösen ValueError aus — float('50') gelingt, sodass ein ungeparster Konfigurationswert als Länge durchrutschen würde (gemessen: thin_lens('50', '200') lieferte plausible 66,667 mm). bool wird als implizite Hochstufung True == 1 ebenfalls abgelehnt.

• complex / Masked Arrays lösen ValueError aus (nur reelle Slots; das stille Verwerfen des Imaginärteils bzw. Abstreifen der Maske wird abgelehnt). NaN/Inf löst bei jeder Eingabe ValueError aus.

• Division durch null und Verwandtes wird namentlich abgelehnt: Brennweite 0, Krümmungsradius 0, Brechzahl <= 0, undurchlässige Blende (alles 0, die Normierung wird 0/0), PSF mit Summe <= 0, Stokes-Vektor mit S0 = 0 und ein Objekt im vorderen Brennpunkt (Bild im Unendlichen).

• Nur zwei Operatoren liefern einen nicht-endlichen Wert, und beide halten das vertraglich fest: depth_of_field liefert jenseits der hyperfokalen Distanz far_mm = inf (genau das bedeutet die hyperfokale Distanz), und gaussian_beam liefert an der Taille wavefront_radius_mm = inf (der Krümmungsradius einer ebenen Wellenfront). Beide liefern zusätzlich einen endlichen Partner (far_is_infinite / curvature_per_mm). Jedes andere stille NaN/Inf wird intern erkannt und löst ValueError aus — "float64 ist übergelaufen" und "die Antwort ist unendlich" sind verschiedene Aussagen; die erste wird nie im Gewand der zweiten geliefert.

• Größenobergrenzen: erzeugte Gitter durch optics.MAX_GRID (4096), übergebene Felder/PSFs/Blenden durch optics.MAX_FIELD_ELEMENTS (2^24), ABCD-Elementketten durch optics.MAX_SYSTEM_ELEMENTS (1024), Zernike durch MAX_ZERNIKE_TERMS (512) / MAX_ZERNIKE_ORDER (40) / MAX_ZERNIKE_BASIS (2^25). Damit werden Pfade fail-closed geschlossen, in denen ein kleines Argument eine riesige interne Allokation auslöst (gemessen: n_max=40 × 4096² braucht 108 GB).

• Physikalisch unmögliche Zustände werden ebenfalls abgelehnt: Stokes-Vektor mit Polarisationsgrad > 1, negative Transmission, negative Intensität und ungültige Zernike-Indizes wie ungerades n-|m|.

Ausführlicher Anwendungsleitfaden

• Leitfaden zur Familie optics_imaging

Referenzen (Beispieldaten, Literatur)

• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).

• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.

• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• optics_four_f_processor — py -3.11 examples/optics_four_f_processor.py

Typkompatible Folge-Operatoren (nehmen cimage als Eingabe)

angular_spectrum_propagate · four_f_filter · jones_apply

Gleiche Kategorie (wave)

airy_pattern · angular_spectrum_propagate · fraunhofer_pattern · four_f_filter · gaussian_beam · defocus_from_shift · pupil_psf · pupil_blur


*Provenance: optics.py — OPTICS Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*

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