fiber.filter_taps
filter_taps( length_km: Annotated[float, exclusiveMinimum=0], time_step: Annotated[float, exclusiveMinimum=0], *, headroom: Annotated[float, exclusiveMinimum=0] = 0.4, minimum_taps: Annotated[int, exclusiveMinimum=0] = 256, **fiber: object,) -> intDispersion filter length needed for one section.
The kernel has to span the dispersive delay spread across the simulation band, with , which in samples is .
Sizing this per section matters more than it looks. A span split into sections needs only of the taps in each, and each section’s filter costs half its length in latency, so a fixed tap count makes the total latency grow with until the pulse no longer emerges within the record. Sized this way the total stays roughly independent of , because the taps per section fall as fast as the count rises.
The delay spread is not the only constraint, and on its own it is a trap. A kernel only a few times longer than its content cannot be windowed without touching the content, and the error compounds over the sections. Measured on lossless linear propagation of 50 km, split so the spread sets each tap count, where the energy out must equal the energy in:
====== ========= =============== taps sections energy out/in ====== ========= =============== 8192 1 1.00000 1024 8 1.00000 256 33 1.00000 128 66 0.99999 64 132 1.00031 32 264 1.00484 ====== ========= ===============
Hence minimum_taps. Splitting a span more finely shortens each section
and so relaxes the spread, but it cannot be allowed to shorten the kernels
past the floor, or a fine split degrades the signal instead of improving
accuracy.
Note the cost: the latency is half the kernel per section, so once the floor
binds, total latency grows as sections * minimum_taps / 2 and the record
has to be long enough to let the pulse out.
Args
- length_km: Section length, in km.
- time_step: Simulation time step, in s.
- headroom: Fraction of the kernel the spread may occupy. The stepper warns above 0.4.
- minimum_taps: Floor on the kernel length, whatever the spread.
- fiber: Passed to
fiber_parameters.
Returns
A power of two, at least minimum_taps.