tdi_sync_mtf — OPTICS linescan op

• Data kinds: कोई नहीं → table (केवल arguments से तय होने वाला op — यह कोई image या data input नहीं लेता)

• Call: import fullseye as fs; fs.ledger.tdi_sync_mtf(frequency_cyc_px=None, stages=64, sync_error=0.0, yaw_deg=0.0) (implementation को सीधे call करना हो तो import linescan; linescan.tdi_sync_mtf(frequency_cyc_px=None, stages=64, sync_error=0.0, yaw_deg=0.0), registry से लेना हो तो opsoptics.get("tdi_sync_mtf"))

उपयोग

TDI synchronisation error और yaw (तिरछा चलता web) से बने blur का MTF (closed form, table)।

> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।

TDI は電荷を 1 ライン周期に 1 行ずつ送り、被写体も同じだけ進めば N 段が同じ物点を足す。速度(またはラインレート)の相対誤差 ε があると 1 段ごとに像が ε 画素ずつ滑り、N 段で L = N·|ε| 画素の一様な掃引になる。一様な掃引の MTF は |sinc(f L)|(np.sinc = sin(πx)/(πx))—— 最初の零は f = 1/L。

ヨー角 θ(web の流れがセンサの走査軸から θ 傾く)では、web の軸で測った 1 段あたりの滑りが流れ方向 (1 + ε) − cos θ、幅方向 sin θ になる(電荷は走査軸に沿って動くので)。幅方向のぼけ N·|sin θ| 画素は同期を完全にしても残る —— エンコーダ同期では直らない。

*frequency_cyc_px*: 周波数 [cycles/画素] (既定 0〜0.5 を 51 点)。返り値 dict: frequency / mtf_scan(流れ方向)/ mtf_cross(幅方向)/ slip_scan / slip_cross(1 段あたり [画素])/ smear_scan_px / smear_cross_px(N 段ぶん)/ first_zero_scan(1/L、ぼけが無ければ None)。

★入れていないもの: 同期が完全でも電荷の送りが離散なので 1 画素ぶんの掃引(sinc(f))が残るが、これは全条件に共通で、多相クロックでは減る。比べたい差は同期の側なので掛けていない。

Raises ValueError: 周波数が負・非有限・1-D でない / 段数が範囲外 / |ε| > 0.5 / |θ| > 30°。

पूरी family का input contract (fail-closed)

optics के सभी ops गणना से पहले input की जाँच करते हैं (कुछ भी चुपचाप पास नहीं होता):

• Unit argument के नाम में ही लिखी होती है — _mm / _um / _deg / _mrad। mm और µm की गड़बड़ी crash नहीं करती, बल्कि "सही दिखने वाला पर गलत उत्तर" देती है, इसलिए नाम से इसे रोका जाता है। मान के आकार से unit का अनुमान बिल्कुल नहीं लगाया जाता।

• String से ValueError — float('50') सफल हो जाता है, इसलिए बिना parse किया config value length के रूप में निकल जाता (मापा गया: thin_lens('50', '200') सही दिखने वाला 66.667 mm लौटा रहा था)। bool को भी True == 1 वाले implicit promotion के रूप में अस्वीकार किया जाता है।

• complex / masked array से ValueError (केवल real-valued slots; imaginary part को चुपचाप छोड़ना या mask हटाना अस्वीकार)। हर input पर NaN/Inf से ValueError।

• शून्य से भाग और उससे जुड़े मामलों को नाम लेकर अस्वीकार किया जाता है: focal length 0, radius of curvature 0, refractive index <= 0, पूरी तरह opaque aperture (सब 0, इसलिए normalisation 0/0), ऐसा PSF जिसका योग <= 0 हो, S0 = 0 वाला Stokes vector, और front focal point पर रखा object (image अनंत पर)।

• केवल 2 ops non-finite value लौटाते हैं, और वह भी contract के रूप में लिखा हुआ: depth_of_field hyperfocal distance से आगे far_mm = inf (hyperfocal distance की परिभाषा यही है) और gaussian_beam waist पर wavefront_radius_mm = inf (plane wavefront की radius of curvature)। दोनों साथ में एक finite साथी (far_is_infinite / curvature_per_mm) भी लौटाते हैं। इसके अलावा कोई भी चुपचाप आया NaN/Inf अंदर ही पकड़ा जाता है और ValueError देता है — "float64 overflow हुआ" और "उत्तर अनंत है" अलग-अलग दावे हैं, इसलिए पहले को दूसरे का चेहरा पहनाकर नहीं लौटाया जाता।

• Size की सीमा: generate होने वाले grid के लिए optics.MAX_GRID (4096), दिए गए field/PSF/aperture के लिए optics.MAX_FIELD_ELEMENTS (2^24), ABCD element chain के लिए optics.MAX_SYSTEM_ELEMENTS (1024), Zernike के लिए MAX_ZERNIKE_TERMS (512) / MAX_ZERNIKE_ORDER (40) / MAX_ZERNIKE_BASIS (2^25)। छोटे argument से बहुत बड़ा internal allocation होने वाले रास्तों (मापा गया: n_max=40 × 4096² पर 108 GB) को fail-closed ढंग से बंद किया गया है।

• भौतिक रूप से असंभव states भी अस्वीकार: degree of polarisation > 1 वाला Stokes vector, ऋणात्मक transmittance, ऋणात्मक intensity, और n-|m| odd जैसे अमान्य Zernike indices।

उपयोग की विस्तृत guide

• optics_imaging family guide

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• poc_tdi_linescan — py -3.11 examples/poc_tdi_linescan.py

वे अगले ops जिनसे type जुड़ता है (table को input के रूप में लेते हैं)

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

इसी category के (linescan)

tdi_snr · linescan_acquire · lens_field_profile · linescan_lens_columns · linescan_lens_example


*Provenance: linescan.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

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