# This file is part of NFDMLab.
#
# NFDMLab is free software; you can redistribute it and/or
# modify it under the terms of the version 2 of the GNU General
# Public License as published by the Free Software Foundation.
#
# NFDMLab is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with NFDMLab; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
# 02111-1307 USA
#
# Contributors:
# Sander Wahls (TU Delft) 2018-2019
# Shrinivas Chimmalgi (TU Delft) 2018
import numpy as np
import math
from Examples import BaseExample
[docs]class BuelowArefIdler2016(BaseExample):
    '''This example loosely recreates the experiment presented in the paper
    "Transmission of Waveforms Determined by 7 Eigenvalues with PSK-Modulated
    Spectral Amplitudes" by H. Buelow, V. Aref and W. Idler
    presented at the 42nd European Conference on Optical Communication
    (ECOC 2016).'''
    def __init__(self):
        # Fiber parameters
        self.beta2 = -5.75e-27
        """Dispersion coefficient in s**2/m."""
        self.gamma = 1.6e-3
        """Nonlinearity coefficient in (W m)**(-1)."""
        self.Tscale = 4.5473e-11
        """Time scale used during normalization in s."""
        self.alpha = np.array([0.2e-3])
        """Loss coefficient in 1/m."""
        self.n_spans = 20
        """Number of fiber spans."""
        self.n_steps_per_span = 40
        """Number of spatial steps per fiber span during simulations."""
        self.fiber_span_length = 72e3
        """Length of a fiber span in m."""
        self.post_boost = True
        """Boost at end of each span (lumped amplification). True or False."""
        self.path_average = True
        """Use path-average fiber parameters during normalization. True or
        False."""
        self.noise = True
        """Add ASE noise (lumped amplification only). True or False."""
        self.noise_figure = 3
        """Noise figure in dB."""
        # Receiver bandwidth
        self.tx_bandwidth = 33*1e9
        """Bandwidth of the ideal low-pass at the transmitter in Hz."""
        self.rx_bandwidth = 33*1e9 # Hz
        """Bandwidth of the ideal low-pass at the receiver in Hz."""
        # Modulator parameters
        self.constellation_level = 4
        """Level of the QAM constellation (4, 16, 256, ...)."""
        self.eigenvalues = np.array([0.45j-0.6, 0.3j-0.4, 0.45j-0.2, 0.3j, 0.45j+0.2, 0.3j+0.4, 0.45j+0.6])
        """Eigenvalue pattern."""
        self.residues_amplitude = np.exp(np.array([11.85, 7.06, 7.69, 3.81, 1.93, -0.62, -5.43]))
        """Spectral amplitudes for each of the eigenvalues. These values get
        multiplied with symbols drawn from the constellation before pulse
        generation). """
        self.reconfigure()