10  Projects and new ideas

Open in Colab  Run this chapter’s code in Google Colab (no installation).

This chapter collects improvements to the course, topics that have become important since the slides were written, and student projects that reuse the code of this book.

10.1 What has changed in fiber optics recently

topic why it matters where it connects in Chapter 2
Coherent detection + DSP Chromatic dispersion and PMD are now undone digitally, so DCF disappears from new links dispersion compensation, power fading
Hollow-core anti-resonant fibers < 0.1 dB/km reported, 1/3 lower latency, ~1000× lower nonlinearity special fibers, Rayleigh limit
Space-division multiplexing multicore and few-mode fibers multiply capacity again (petabit/s per fiber in the lab) LP modes, coupled-mode theory
Multi-band (O to U) low-water-peak fibers + new amplifiers use > 50 nm beyond the C-band attenuation spectrum, OH peak
Distributed acoustic sensing on telecom cables φ-OTDR turns submarine and urban cables into seismometers and traffic sensors OTDR, Rayleigh backscatter
PAM-4 / IM-DD in data centres 100–200 Gb/s per lane over short SMF, close to λ₀ = 1310 nm B²L limit, power fading
Quantum key distribution single photons share fibers with classical channels, so Raman noise and FWM matter nonlinear effects, Raman

10.1.1 A taste of the nonlinear Shannon limit

Amplified links add ASE noise (\(\propto\) number of spans), and nonlinear interference grows as \(P^3\) (the Gaussian-noise model). The SNR, \(\mathrm{SNR}=P/(P_\text{ASE}+\eta P^3)\), therefore has an optimum launch power, and the capacity per fiber has a ceiling.

Show the Python
P = np.logspace(-4, -1.5, 300)          # W per channel
h_nu, NF, G = fl.h * 193.4e12, 10 ** 0.5, 10 ** (80 * 0.2 / 10)
B, eta1 = 32e9, 1.0e3                    # symbol bandwidth, NLI coefficient per span [1/W²]
fig, ax = plt.subplots()
for k, Ns in enumerate([10, 20, 40]):
    ase = Ns * NF * h_nu * G * B
    snr = P / (ase + Ns * eta1 * P**3)
    ax.plot(10 * np.log10(P / 1e-3), 10 * np.log10(snr), color=fl.PALETTE[k], label=f"{Ns} spans ({Ns*80} km)")
    i = snr.argmax(); ax.plot(10*np.log10(P[i]/1e-3), 10*np.log10(snr[i]), "o", color=fl.PALETTE[k])
ax.set_xlabel("launch power per channel (dBm)"); ax.set_ylabel("SNR (dB)"); ax.legend()
plt.show()
Figure 10.1: Toy GN-model: SNR versus launch power per channel for links of 10, 20 and 40 spans of 80 km. Below the optimum the link is noise-limited, above it nonlinearity-limited.

10.2 Improvements to the course

  1. Live figures instead of screenshots. Many slides show plots taken from books (b–V curves, \(D(\lambda)\), loss spectrum, eye diagrams). Every one of them is now regenerated in this book by a few lines of code. Students can change a parameter and see the consequence, which builds intuition faster than a static picture.
  2. “Predict, then compute.” For each live panel, ask the class to predict the outcome before moving the slider (e.g. “What happens to the eye if D changes sign?”). This is quick, engaging and well suited to peer instruction.
  3. Exercises with automatic checking. The worked examples are all reproduced numerically, so they can become exercises with randomised numbers (e.g. with quarto-live or Pyodide, Python runs in the browser and the answer can be checked on the spot). The problem set Chapter2_Questions_Problems.pdf is a natural source.
  4. One running example through the chapter. Use the same standard SMF (a = 4.1 µm, 3.5 % GeO₂) from modes → MFD → dispersion → bend loss → link budget → eye diagram. Students then see how the design choices are coupled (e.g. a smaller core shifts λ₀ but raises bend loss).
  5. Connect with the online link simulator already used in the course (see opticallinksimulator.txt) and with the in-browser simulator of Chapter 6.
  6. Shorten the sensor part, deepen the “why”. The gyroscope history slides (301–309) could become a single timeline, freeing time for the Sagnac calculation and the OTDR trade-offs, which are more transferable skills.

10.3 Student projects

Each project reuses fiberlib.py and can be done in 1–3 weeks.

# project skills difficulty
1 Fiber design optimiser: find (a, Δ) that give λ₀ = 1450 nm, single-mode above 1260 nm, MFD > 8.5 µm, and minimum bend loss optimisation, mode solver ★★
2 Three-layer (W / trench) fiber solver: extend LP_b to a depressed cladding and reproduce a dispersion-flattened fiber Bessel functions, root finding ★★★
3 Split-step Fourier propagation: SPM, soliton, and the GN-model optimum launch power FFT, NLSE ★★★
4 Chirped FBG dispersion compensator: design a grating that compensates 80 km of SMF TMM, group delay ★★
5 OTDR event detector: automatic detection/classification of events in a measured trace (least-squares, change-point, or a small ML classifier) signal processing ★★
6 PAM-4 vs NRZ data-centre link at 1310 nm with imdd_link modulation, BER ★★
7 Few-mode fiber MDM: LP-mode overlaps and mode-dependent loss; how many channels can a few-mode fiber carry? modes, overlaps ★★★
8 Raman DTS design: required averaging for 1 K resolution at 10 km noise, statistics ★★
9 Measure your own fiber: cut-back loss and bend loss with a lab source and power meter, compared with the models of Chapter 5 experiment ★

10.4 Useful open-source tools

  • OptiCommPy: transmitters, channels, DSP and coherent receivers in Python.
  • ofiber (S. Prahl): the package used in ofiber_test.ipynb. It is a good cross-check for fiberlib (install with pip install ofiber).
  • GNPy: GN-model planning of real optical networks.
  • femwell, Meep / MPB: finite-element and FDTD solvers for arbitrary waveguide cross-sections (PCF, multicore).

10.5 Notes for the instructor: checks on the slides

While recomputing the examples, everything matched the slides except the following points, which deserve a second look:

  • Slide 222 (FBG): the bandwidth formula \(\frac{\lambda_B^2}{\pi nL}\sqrt{(\kappa L)^2+\pi^2}\) gives ≈ 0.20 nm, not 0.428 nm. The periodicity uses \(n=1.450\) while the statement gives \(n_\text{eff}=1.4550\) (532.6 nm vs 534.5 nm).
  • Slide 146: \(0.90/1.55^4=0.156\) dB/km rather than 0.178 dB/km (the total would be 0.176 dB/km). The NA-based value, 0.159 dB/km, is correct.
  • Slide 139 (Rayleigh): the intermediate value is written both as \(3.276\times10^{-2}\) and \(3.735\times10^{-2}\) km⁻¹. The correct one is \(3.276\times10^{-2}\) km⁻¹, which gives 0.142 dB/km.
  • opticomm.ipynb: the errors come from an API change in OptiCommPy ≥ 0.10 (pulseShape now takes a parameters object, and bsp returns a different shape). A corrected cell is given in Chapter 6.
  • ofiber_test.ipynb needs pip install ofiber. All of its plots have an equivalent in this book that does not depend on it.