# 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()