Skip to content

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,
) -> int

Dispersion filter length needed for one section.

The kernel has to span the dispersive delay spread across the simulation band, ∣β2∣L Δω\lvert \beta_2 \rvert L \,\Delta\omega with Δω=2π/Δt\Delta\omega = 2\pi/\Delta t, which in samples is ∣β2∣L 2π/Δt2\lvert \beta_2 \rvert L\, 2\pi/\Delta t^2.

Sizing this per section matters more than it looks. A span split into NN sections needs only 1/N1/N 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 NN until the pulse no longer emerges within the record. Sized this way the total stays roughly independent of NN, 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.