fp_design — OPTICS fpm op

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

• Aufruf: import fullseye as fs; fs.ledger.fp_design(na_obj=0.1, wavelength_um=0.532, led_pitch_mm=4.0, led_distance_mm=70.0, n_side=13, magnification=4.0, camera_pixel_um=5.2, target_na=None, field_of_view_um=None, boundary_tolerance_na=0.005) (die Implementierung direkt: import fourierptycho; fourierptycho.fp_design(na_obj=0.1, wavelength_um=0.532, led_pitch_mm=4.0, led_distance_mm=70.0, n_side=13, magnification=4.0, camera_pixel_um=5.2, target_na=None, field_of_view_um=None, boundary_tolerance_na=0.005); aus dem Register: opsoptics.get("fp_design"))

• GPU: nein (nur CPU-Referenzimplementierung)

Verwendung

Leistung der Fourier-Ptychographie in geschlossener Form vor der Aufnahme (table): synthetische NA, Grenzperiode, spektraler Überlappungsgrad, Anzahl der LEDs und Pixelabtastung.

Quadratisches LED-Raster (n_side × n_side, Rastermaß led_pitch_mm), led_distance_mm unterhalb der Probe angeordnet, mit der mittleren LED auf der optischen Achse.

• Beleuchtungs-NA: für die Rand-LED auf der Achse NA_ill = e/√(e² + h²) (e = (n_side − 1)/2 · Rastermaß); der Wert der diagonalen Ecke wird ebenfalls zurückgegeben.

• Synthetische NA = NA_obj + NA_ill (Achse). Bei einer USAF-Tafel mit achsparallelen Balken bestimmt der Achsenwert die Auflösung (diagonale LEDs bringen keine reinen x-Frequenzen in die Pupille). Kohärente Grenzperiode λ/NA_syn (nur Objektiv: λ/NA_obj), Halbperiode λ/(2 NA_syn).

• Überlappungsgrad: Schnittfläche der Pupillenkreise (Radius NA_obj/λ, Mittenabstand = Differenz von sinθ/λ) der mittleren LED und ihrer Nachbar-LED / Kreisfläche = (2/π)[acos a − a√(1 − a²)], a = d/(2r). Am kleinsten in der Mitte (die sinθ-Schritte werden nach außen enger); der Randwert wird ebenfalls zurückgegeben. overlap_ok = Wert in der Mitte ≥ 0.35 (Untergrenze nach Sun et al. 2016).

• Abtastung: das objektseitige Pixel Δx = camera_pixel_um / magnification ist höchstens λ/(2 NA_obj) (R_cam = λ·M/(2 NA_obj Δx_cam) ≥ 1). Die auf das Intensitätsband bezogene Nyquist-Grenze λ/(4 NA_obj) wird ebenfalls zurückgegeben (FP rekonstruiert das Feld, daher genügt λ/(2 NA_obj)).

• Hochskalierungsfaktor: die kleinste ganze Zahl, bei der das hochaufgelöste Pixel höchstens λ/(2 NA_syn) ist.

• Grenz-LEDs: Anzahl der LEDs, deren Beleuchtungs-NA innerhalb von boundary_tolerance_na um NA_obj liegt (boundary_leds). Ihre Bilder liegen an der Grenze zwischen Hellfeld und Dunkelfeld, und ob der Pupillenrand die nullte Ordnung der Beleuchtung abschneidet, kippt mit einer Rundung von k um 1 Pixel —— gemessen konvergierte eine Konfiguration mit 39 % Überlappung allein wegen dieser einen LED nicht mehr (bei 256 Pixel Bildfeld; nach Verschieben des LED-Abstands von 70 → 76 mm konvergierte sie. Bei 384 Pixel Bildfeld konvergierte sie auch mit der LED auf der Grenze —— es kann passieren, muss aber nicht). boundary_ok = 0 Stück.

• target_na: für diese synthetische NA benötigte Rasterseitenlänge, LED-Gesamtzahl und Anzahl der LEDs mit ausreichender Beleuchtungs-NA.

• field_of_view_um: Raum-Bandbreite-Produkt (Bildfeld / Halbperiode)².

Rückgabe: dict(kind="fp_design", na_synthetic, na_illumination_max_axis, coherent_cutoff_period_um, overlap_ratio_centre, overlap_ratio_edge, overlap_ok, n_leds, n_brightfield, boundary_leds, boundary_ok, object_pixel_um, r_cam, pixel_sampling_ok, upsample_needed, …).

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)

• poc_fourier_ptychography — py -3.11 examples/poc_fourier_ptychography.py

Typkompatible Folge-Operatoren (nehmen table als Eingabe)

abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd

Gleiche Kategorie (fpm)

fp_usaf_target · fp_capture · fp_stack_from_images · fp_reconstruct · fp_element_contrast


*Provenance: fourierptycho.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.