Example 3: Dispersion (slope) compensation

As shown in example 1 and 2 chromatic dipersion yields in pulse broadening and inter symbol interference respectlively. The reason for this is that the wavelengths are shifted in time relative to each other. The relative time shift of each wavelength can be calculated by $$ \tau(\lambda, z) = D_0 z (1550\text{nm} - \lambda_0) + \frac{1}{2}S z (\lambda - \lambda_0)^2 $$ where $D_0$ is the chromatic dispersion coefficent, $S$ the dispersion slope, $\lambda_0$ the reference wavelength (e.g. 1550nm) and $z$ the transmission distance.

This formular can be derived by integrating the acculated dispersion $D_{acc}(\lambda,z)=D_0 z + S z (\lambda - \lambda_0)$ over $\lambda$ : $$ \tau(\lambda,z) = \int _{ \xi = 1550nm }^{ \lambda }{ D_0 z + S z (\xi - \lambda_0) \partial \xi } $$ The accumalted dispersion $D_{acc}(\lambda,z)$ represents the derivation of the relative time shift over the wavelength $\lambda$ at the transmission distance $z$.

For $D_{acc}(\lambda,z) \neq 0 \text{ps/nm}$ an optical pulse broadens and depending on the pulse width inter symbol interference may occur.

Some years ago it was state of the art to reduce the accumlated dispersion by dispersion compensating fiber (DCF). DCF hava negative dispersion coefficent $D_0$ and dispersion slope $S$. A full compensation can be achieved by a DCF with the following parameters: $$ D_{acc,TF}(\lambda,L_{TF}) + D_{acc,DCF}(\lambda,L_{DCF}) = 0 \text{ps/nm} $$ where $TF$ stands for transmission fiber. This can be rewritten as $$ D_{0,TF} L_{TF} z + S_{TF} z (\lambda - \lambda_0) L_{TF} + D_{0,DCF} L_{DCF} + S_{DCF} (\lambda - \lambda_0) L_{DCF} = 0 \text{ps/nm} $$ Setting $\lambda = \lambda_0$ results in a simple formular which can be transfomed to $$ L_{DCF} = - L_{TF}\frac{ D_{0,TF}}{D_{0,DCF}} $$ Inserting this result in the initial equation gives the needed slope $S_{DCF}$: $$ S_{DCF} = S_{TF}\frac{ D_{0,DCF}}{D_{0,TF}} $$

The following script models the transmission over a transmission fiber (SMMF) followed by a DCF for three signal channels at wavelengths $\lambda=1550\text{nm}$, $\lambda=1546\text{nm}$ and $\lambda=1554\text{nm}$.

Pulsebroadening by chromatic dispersion
Fig. 1 : Input and broadened output signal

As can be seen the slope of the DCF $S_{DCF}$ is not optimized. This can be seen in figure 1: At the center channel the accumulated is nearly zero as the influence of teh slope is small. For hiher wavelength deviations the slope becomes visible by broadend pulses.

##!/usr/bin/env python2
# -*- coding: utf-8 -*-

#Import functions and libraries
import sys
sys.path.append('../')
from pypho_setup import pypho_setup
from pypho_symbols import pypho_symbols
from pypho_signalsrc import pypho_signalsrc
from pypho_lasmod import pypho_lasmod
from pypho_fiber import pypho_fiber
from pypho_eye import pypho_eye
from pypho_optfi import pypho_optfi
from pypho_functions import *
import numpy as np
import copy
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt

# Define network elements
gp       = pypho_setup(nos = 4*16, sps = 1*256, symbolrate = 40e9)
bitsrc   = pypho_symbols(glova = gp, nos = gp.nos, pattern = 'random') # Set pattern = "singlepulse"
esigsrc  = pypho_signalsrc(glova = gp, pulseshape = 'gauss_rz' , fwhm = 0.33)
sig_1550 = pypho_lasmod(glova = gp, power = 0, Df = 0, teta = 0)
sig_1546 = pypho_lasmod(glova = gp, power = 0, Df = +500, teta = 0)
sig_1554 = pypho_lasmod(glova = gp, power = 0, Df = -500, teta = 0)
filter_1550 = pypho_optfi(glova = gp, Df = 0, B = 100)
filter_1546 = pypho_optfi(glova = gp, Df = +500, B = 100)
filter_1554 = pypho_optfi(glova = gp, Df = -500, B = 100)
SSMF     = pypho_fiber(glova = gp, l = 100e3,  D = 16.8,   S = 0.058, alpha = 0.2e-12, gamma = 0, phi_max = 10.0)
DCF      = pypho_fiber(glova = gp, l = 16.8e3,  D = -100.0,   S = -0.058/16.8 * 100.0, alpha = 0.2e-12, gamma = 0, phi_max = 10.0)
eye      = pypho_eye(glova = gp, polarisation = 'x,y')

# Simulation
bits = bitsrc()

esig = esigsrc(bitsequence = bits)
E_1550 = sig_1550(esig = esig)                                              
E_1546 = sig_1546(esig = esig)
E_1554 = sig_1554(esig = esig)


# Plot Input signals
plt.figure(1)
plt.subplot(3, 1, 1)
plt.title("$\lambda$=1546nm", loc='left')
eye(E = E_1546[0]['E'], polarisation = 'x', style="0.5")

plt.subplot(3, 1, 2)
plt.title("$\lambda$=1550nm", loc='left')
eye(E = E_1550[0]['E'], polarisation = 'x', style="0.5")

plt.subplot(3, 1, 3)
plt.title("$\lambda$=1554nm", loc='left')
eye(E = E_1554[0]['E'], polarisation = 'x', style="0.5")

E_Tx = copy.deepcopy(E_1550)
E_Tx[0]['E'][0] = E_1550[0]['E'][0] + E_1546[0]['E'][0] + E_1554[0]['E'][0] # Multiplex all signals 
E = copy.deepcopy(E_Tx)

# Fiber transmission
E = SSMF(E = E,l = 100e3,  D = 16.8, S = 0.058) 
E =  DCF(E = E,l = 16.8e3, D = -100, S = -0.058/16.8 * 100) # For full dispersion compensation set S = -0.058/16.8 * 100


# Filter out the channels
E_1550 = filter_1550(E = copy.deepcopy(E))
E_1546 = filter_1546(E = copy.deepcopy(E))
E_1554 = filter_1554(E = copy.deepcopy(E))

# Plot Output signals
#plt.figure(2)
plt.subplot(3, 1, 1)
eye(E = E_1546[0]['E'], polarisation = 'x', style="r")
red_patch = mpatches.Patch(color='0.5', label='Input signal')
green_patch = mpatches.Patch(color='red', label='Output signal')
plt.legend(handles=[red_patch, green_patch], loc=1)

plt.subplot(3, 1, 2)
eye(E = E_1550[0]['E'], polarisation = 'x', style="r")
plt.subplot(3, 1, 3)
eye(E = E_1554[0]['E'], polarisation = 'x', style="r")
plt.show()