8  Special fibers and fiber Bragg gratings

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

Slides 195–230. Light can be confined by something other than total internal reflection. A periodic structure reflects a band of wavelengths. Wrapped around a core it makes a Bragg or photonic-crystal fiber. Written along the core it makes a fiber Bragg grating (FBG), which is a filter and a sensor.

8.1 Bragg fibers: a cladding that is a mirror (slides 196–198)

The cladding alternates layers of index \(n_1\) and \(n_2\). Reflections add in phase when \(n_1d_1+n_2d_2=m\lambda/2\). The usual quarter-wave design is \(n_1d_1=n_2d_2=\lambda/4\). Locally, at normal incidence, the cladding behaves like a planar dielectric mirror. We can therefore compute its reflectance with the transfer-matrix method:

Show the Python
def stack_R(lam, n_hi, n_lo, N, lam0, n_in=1.0, n_out=1.45):
    d_hi, d_lo = lam0 / (4 * n_hi), lam0 / (4 * n_lo)
    R = []
    for l in lam:
        M = np.eye(2, dtype=complex)
        for n, d in [(n_hi, d_hi), (n_lo, d_lo)] * N:
            ph = 2 * np.pi * n * d / l
            M = M @ np.array([[np.cos(ph), 1j * np.sin(ph) / n], [1j * n * np.sin(ph), np.cos(ph)]])
        B, C = M @ np.array([1, n_out])
        r = (n_in * B - C) / (n_in * B + C)
        R.append(abs(r) ** 2)
    return np.array(R)

lam = np.linspace(1000, 2500, 800) * 1e-9
fig, ax = plt.subplots()
for k, N in enumerate([2, 5, 10]):
    ax.plot(lam * 1e9, stack_R(lam, 2.5, 1.5, N, 1550e-9), color=fl.PALETTE[k], label=f"{N} pairs (n = 2.5 / 1.5)")
ax.plot(lam * 1e9, stack_R(lam, 1.49, 1.45, 60, 1550e-9), color=fl.PALETTE[3], label="60 pairs (n = 1.49 / 1.45)")
dl = 4 / np.pi * np.arcsin((2.5 - 1.5) / (2.5 + 1.5)) * 1550
ax.axvspan(1550 - dl / 2, 1550 + dl / 2, color=fl.GRID, alpha=0.5, lw=0)
ax.set_xlabel("λ (nm)"); ax.set_ylabel("reflectance"); ax.legend(fontsize=8)
plt.show()
print(f"Stop-band width (high contrast): Δλ ≈ (4/π)·asin((n_H−n_L)/(n_H+n_L))·λ0 = {dl:.0f} nm")
Figure 8.1: Reflectance of a quarter-wave stack (planar approximation of the Bragg-fiber cladding) designed for 1550 nm, for several numbers of layer pairs. Inside the stop band (photonic band gap) the light cannot escape the core.
Stop-band width (high contrast): Δλ ≈ (4/π)·asin((n_H−n_L)/(n_H+n_L))·λ0 = 499 nm

The core of a Bragg fiber can even be hollow. Only a high-contrast cladding gives a wide stop band, which is why hollow Bragg fibers use polymer/chalcogenide layers.

8.2 Photonic crystal fibers (slides 199–207)

solid-core PCF hollow-core PCF / anti-resonant
guiding modified TIR (air holes lower the effective cladding index) photonic band gap or anti-resonance
key property endlessly single-mode, large NA, engineerable dispersion ~99.9 % of light in air: tiny nonlinearity and latency, almost no material dispersion
applications supercontinuum, high-power lasers, sensing low-latency links, high-power delivery, gas spectroscopy
NoteUpdate since the slides were written

Hollow-core nested anti-resonant fibers (NANF/DNANF) have been reported with attenuation below 0.1 dB/km around 1550 nm. That is lower than the Rayleigh limit of silica computed in Chapter 5, and the propagation is ~1.5 µs/km faster than in solid glass. They are being deployed in low-latency links (finance, data centres).

8.3 Fiber Bragg gratings (slides 209–213)

A periodic modulation \(\Delta n\) of period \(\Lambda\) written in the core reflects the Bragg wavelength

\[ \lambda_B=2n_\text{eff}\Lambda . \]

Coupled-mode theory gives, for a uniform grating of length \(L\) with \(\kappa=\pi\Delta n/\lambda\):

\[ R_\text{max}=\tanh^2(\kappa L),\qquad \Delta\lambda_0=\frac{\lambda_B^2}{\pi n_\text{eff}L}\sqrt{(\kappa L)^2+\pi^2}\ \ (\text{between first zeros}). \]

\(\kappa L<1\) is a weak grating (narrow, low \(R\)). \(\kappa L>1\) is a strong grating (flat-top, \(R\to1\), width set by \(\Delta n\)).

8.3.1 Example: FBG at 1550 nm (slide 222)

Show the Python
lB, neff, dn, L = 1550e-9, 1.455, 1e-4, 10e-3
Lam = lB / (2 * neff)
kap = np.pi * dn / lB
wl = np.linspace(1549e-9, 1551e-9, 40001)
R = fl.fbg_reflectance(wl, lB, neff, dn, L)
m = R >= R.max() / 2
print(f"Λ = {Lam*1e9:.1f} nm (with n = 1.450 as on the slide: {lB/2/1.450*1e9:.1f} nm)")
print(f"κ = {kap:.1f} m⁻¹, κL = {kap*L:.3f} → strong grating, R_max = tanh²(κL) = {np.tanh(kap*L)**2:.3f}")
print(f"Δλ between first zeros = {fl.fbg_bandwidth(lB, neff, dn, L)*1e9:.3f} nm, FWHM = {(wl[m][-1]-wl[m][0])*1e9:.3f} nm")
Λ = 532.6 nm (with n = 1.450 as on the slide: 534.5 nm)
κ = 202.7 m⁻¹, κL = 2.027 → strong grating, R_max = tanh²(κL) = 0.933
Δλ between first zeros = 0.197 nm, FWHM = 0.149 nm
WarningTo double-check on slide 222

The reflectance (93.3 %) matches. The coupled-mode bandwidth formula above gives ≈ 0.20 nm (0.15 nm FWHM) with these numbers, whereas the slide quotes 0.428 nm. It is worth verifying which expression or values were used there.

8.3.2 FBG designer, live

8.3.3 Apodisation (new): getting rid of the side lobes

A uniform grating has strong side lobes, which cause crosstalk between DWDM channels. Tapering \(\Delta n(z)\) smoothly suppresses them. We compute non-uniform gratings with the piecewise-uniform transfer-matrix method (Erdogan, 1997): cut the grating into \(M\) short uniform sections and multiply their \(2\times2\) coupled-mode matrices.

Show the Python
def fbg_tmm(wl, lB, neff, dn_z, L):
    M = len(dn_z); dz = L / M
    R = np.empty(len(wl))
    for i, l in enumerate(wl):
        sig = 2 * np.pi * neff * (1 / l - 1 / lB)
        F = np.eye(2, dtype=complex)
        for dn in dn_z:
            k = np.pi * dn / l
            g = np.sqrt(complex(k**2 - sig**2))
            ch, sh = np.cosh(g * dz), (np.sinh(g * dz) / g if abs(g) > 1e-12 else dz)
            Fi = np.array([[ch - 1j * sig * sh, -1j * k * sh], [1j * k * sh, ch + 1j * sig * sh]])
            F = Fi @ F
        R[i] = abs(F[1, 0] / F[0, 0]) ** 2
    return R

wl = np.linspace(1548.8e-9, 1551.2e-9, 1200)
z = np.linspace(-0.5, 0.5, 120)
uni = fl.fbg_reflectance(wl, lB, neff, 1e-4, L)
gau = fbg_tmm(wl, lB, neff, 1e-4 * np.exp(-4 * np.log(2) * (z / 0.5) ** 2), L)
fig, (a1, a2) = plt.subplots(1, 2, figsize=(10, 3.6), gridspec_kw={"width_ratios": [1, 2.2]})
a1.plot(z * 10, np.ones_like(z), label="uniform"); a1.plot(z * 10, np.exp(-4 * np.log(2) * (z / 0.5) ** 2), label="Gaussian")
a1.set_xlabel("z (mm)"); a1.set_ylabel("Δn(z) / Δn₀"); a1.legend(fontsize=8)
a2.plot(wl * 1e9, 10 * np.log10(uni + 1e-9), label="uniform (analytic)")
a2.plot(wl * 1e9, 10 * np.log10(gau + 1e-9), label="Gaussian apodized (TMM)")
a2.set_ylim(-60, 2); a2.set_xlabel("λ (nm)"); a2.set_ylabel("R (dB)"); a2.legend(fontsize=8)
plt.tight_layout(); plt.show()
Figure 8.2: Uniform versus Gaussian-apodized FBG (L = 10 mm, peak Δn = 1e-4), computed with the transfer-matrix method. Apodisation lowers the side lobes by more than 20 dB at the price of a slightly wider main lobe.

8.4 FBG sensors (slides 214–227)

Strain changes both \(\Lambda\) and \(n_\text{eff}\) (photo-elastic effect, \(p_e\approx0.22\)). Temperature changes them through thermal expansion \(\alpha_\Lambda\) and the thermo-optic coefficient \(\xi\):

\[ \frac{\Delta\lambda_B}{\lambda_B}=(1-p_e)\,\varepsilon+(\alpha_\Lambda+\xi)\,\Delta T . \]

Several gratings at different \(\lambda_B\) on one fiber can be read by a single broadband source: this is wavelength-division multiplexed sensing (slides 221, 225).

Show the Python
centers = np.array([1530, 1538, 1546, 1554, 1562]) * 1e-9
shifts = [(0, 0), (0, 0), (800e-6, 0), (0, 0), (0, 40)]
wl = np.linspace(1526e-9, 1567e-9, 6000)
fig, ax = plt.subplots(figsize=(8.5, 3.4))
ax.plot(wl * 1e9, np.exp(-((wl - 1546.5e-9) / 22e-9) ** 2), color=fl.GRID, lw=6, label="broadband source")
for k, (c, (eps, dT)) in enumerate(zip(centers, shifts)):
    lb = c * (1 + 0.78 * eps + 7.25e-6 * dT)
    Rk = fl.fbg_reflectance(wl, lb, 1.455, 2e-4, 5e-3)
    ax.plot(wl * 1e9, Rk * np.exp(-((lb - 1546.5e-9) / 22e-9) ** 2), color=fl.PALETTE[k], label="ABCDE"[k])
    if lb != c:
        ax.annotate("", xy=(lb * 1e9, 1.02), xytext=(c * 1e9, 1.02), arrowprops=dict(arrowstyle="->", color=fl.INK))
        ax.text(c * 1e9, 1.06, f"{(lb-c)*1e12:.0f} pm", fontsize=8)
ax.set_xlabel("λ (nm)"); ax.set_ylabel("reflected power (a.u.)"); ax.legend(ncol=6, fontsize=8, loc="lower center")
ax.set_ylim(0, 1.15); plt.show()
Figure 8.3: Five FBG sensors multiplexed in wavelength on one fiber. Sensor C is strained by +800 µε and sensor E heated by +40 K. Each shifts inside its own spectral slot.

8.5 Try it yourself

  1. Use fbg_tmm with a linear chirp of \(\Lambda(z)\). Show that the reflected group delay varies linearly with \(\lambda\). A chirped FBG is a compact dispersion compensator (Chapter 3).
  2. Add a \(\pi\) phase shift in the middle of the grating. What appears at \(\lambda_B\)?
  3. How can you separate strain from temperature with FBGs? (Hint: two gratings, one strain-free, or two gratings with different sensitivities.)