This module provides layers and functions that implement channel models for (fiber) optical communications. The currently only available model is the split-step Fourier method (SSFM, for dual- and single-polarization) that can be combined with an Erbium-doped amplifier (EDFA).

The following code snippets show how to setup and simulate the transmission over a single-mode fiber (SMF) by using the split-step Fourier method.

# init fiber
span = sionna.channel.optical.SSFM(
# init amplifier
amplifier = sionna.channel.optical.EDFA(

def simulate_transmission(x, n_span):
      y = x
      # simulate n_span fiber spans
      for _ in range(n_span):
            # simulate single span
            y = span(y)
            # simulate amplifier
            y = amplifier(y)

      return y

Running the channel model is done as follows:

# x is the optical input signal, n_span the number of spans
y = simulate_transmission(x, n_span)

For further details, the tutorial “Optical Channel with Lumped Amplification” provides more sophisticated examples of how to use this module.

For the purpose of the present document, the following symbols apply:


Time normalization for the SSFM in \((\text{s})\)


Distance normalization the for SSFM in \((\text{m})\)




Attenuation coefficient in \((1/L_\text{norm})\)


Group velocity dispersion coeff. in \((T_\text{norm}^2/L_\text{norm})\)


Carrier frequency in \(\text{(Hz)}\)


Nonlinearity coefficient in \((1/L_\text{norm}/\text{W})\)


Fiber length in \((L_\text{norm})\)


Planck constant


Number of SSFM simulation steps


Spontaneous emission factor of Raman amplification


Normalized simulation time step in \((T_\text{norm})\)


Normalized simulation step size in \((L_\text{norm})\)


Amplifier gain


Amplifier’s noise figure


Noise spectral density


Signal power


Linear SSFM operator [A2012]


Non-linear SSFM operator [A2012]


Simulation bandwidth

Remark: Depending on the exact simulation parameters, the SSFM algorithm may require dtype=tf.complex128 for accurate simulation results. However, this may increase the simulation complexity significantly.

Split-step Fourier method

class sionna.channel.SSFM(alpha=0.046, beta_2=- 21.67, f_c=193.55e12, gamma=1.27, half_window_length=0, length=80, n_ssfm=1, n_sp=1.0, sample_duration=1.0, t_norm=1e-12, with_amplification=False, with_attenuation=True, with_dispersion=True, with_manakov=False, with_nonlinearity=True, swap_memory=True, dtype=tf.complex64, **kwargs)[source]

Layer implementing the split-step Fourier method (SSFM)

The SSFM (first mentioned in [HT1973]) numerically solves the generalized nonlinear Schrödinger equation (NLSE)

\[\frac{\partial E(t,z)}{\partial z}=-\frac{\alpha}{2} E(t,z)+j\frac{\beta_2}{2}\frac{\partial^2 E(t,z)}{\partial t^2}-j\gamma |E(t,z)|^2 E(t,z) + n(n_{\text{sp}};\,t,\,z)\]

for an unpolarized (or single polarized) optical signal; or the Manakov equation (according to [WMC1991])

\[\frac{\partial \mathbf{E}(t,z)}{\partial z}=-\frac{\alpha}{2} \mathbf{E}(t,z)+j\frac{\beta_2}{2}\frac{\partial^2 \mathbf{E}(t,z)}{\partial t^2}-j\gamma \frac{8}{9}||\mathbf{E}(t,z)||_2^2 \mathbf{E}(t,z) + \mathbf{n}(n_{\text{sp}};\,t,\,z)\]

for dual polarization, with attenuation coefficient \(\alpha\), group velocity dispersion parameters \(\beta_2\), and nonlinearity coefficient \(\gamma\). The noise terms \(n(n_{\text{sp}};\,t,\,z)\) and \(\mathbf{n}(n_{\text{sp}};\,t,\,z)\), respectively, stem from an (optional) ideally distributed Raman amplification with spontaneous emission factor \(n_\text{sp}\). The optical signal \(E(t,\,z)\) has the unit \(\sqrt{\text{W}}\). For the dual polarized case, \(\mathbf{E}(t,\,z)=(E_x(t,\,z), E_y(t,\,z))\) is a vector consisting of the signal components of both polarizations.

The symmetrized SSFM is applied according to Eq. (7) of [FMF1976] that can be written as

\[E(z+\Delta_z,t) \approx \exp\left(\frac{\Delta_z}{2}\hat{D}\right)\exp\left(\int^{z+\Delta_z}_z \hat{N}(z')dz'\right)\exp\left(\frac{\Delta_z}{2}\hat{D}\right)E(z,\,t)\]

where only the single-polarized case is shown. The integral is approximated by \(\Delta_z\hat{N}\) with \(\hat{D}\) and \(\hat{N}\) denoting the linear and nonlinear SSFM operator, respectively [A2012].

Additionally, ideally distributed Raman amplification may be applied, which is implemented as in [MFFP2009]. Please note that the implemented Raman amplification currently results in a transparent fiber link. Hence, the introduced gain cannot be parametrized.

The SSFM operates on normalized time \(T_\text{norm}\) (e.g., \(T_\text{norm}=1\,\text{ps}=1\cdot 10^{-12}\,\text{s}\)) and distance units \(L_\text{norm}\) (e.g., \(L_\text{norm}=1\,\text{km}=1\cdot 10^{3}\,\text{m}\)). Hence, all parameters as well as the signal itself have to be given with the same unit prefix for the same unit (e.g., always pico for time, or kilo for distance). Despite the normalization, the SSFM is implemented with physical units, which is different from the normalization, e.g., used for the nonlinear Fourier transform. For simulations, only \(T_\text{norm}\) has to be provided.

To avoid reflections at the signal boundaries during simulation, a Hamming window can be applied in each SSFM-step, whose length can be defined by half_window_length.



>>> ssfm = SSFM(
>>>     alpha=0.046,
>>>     beta_2=-21.67,
>>>     f_c=193.55e12,
>>>     gamma=1.27,
>>>     half_window_length=100,
>>>     length=80,
>>>     n_ssfm=200,
>>>     n_sp=1.0,
>>>     t_norm=1e-12,
>>>     with_amplification=False,
>>>     with_attenuation=True,
>>>     with_dispersion=True,
>>>     with_manakov=False,
>>>     with_nonlinearity=True)


>>> # x is the optical input signal
>>> y = ssfm(x)
  • alpha (float) – Attenuation coefficient \(\alpha\) in \((1/L_\text{norm})\). Defaults to 0.046.

  • beta_2 (float) – Group velocity dispersion coefficient \(\beta_2\) in \((T_\text{norm}^2/L_\text{norm})\). Defaults to -21.67

  • f_c (float) – Carrier frequency \(f_\mathrm{c}\) in \((\text{Hz})\). Defaults to 193.55e12.

  • gamma (float) – Nonlinearity coefficient \(\gamma\) in \((1/L_\text{norm}/\text{W})\). Defaults to 1.27.

  • half_window_length (int) – Half of the Hamming window length. Defaults to 0.

  • length (float) – Fiber length \(\ell\) in \((L_\text{norm})\). Defaults to 80.0.

  • n_ssfm (int | "adaptive") – Number of steps \(N_\mathrm{SSFM}\). Set to “adaptive” to use nonlinear-phase rotation to calculate the step widths adaptively (maxmimum rotation can be set in phase_inc). Defaults to 1.

  • n_sp (float) – Spontaneous emission factor \(n_\mathrm{sp}\) of Raman amplification. Defaults to 1.0.

  • sample_duration (float) – Normalized time step \(\Delta_t\) in \((T_\text{norm})\). Defaults to 1.0.

  • t_norm (float) – Time normalization \(T_\text{norm}\) in \((\text{s})\). Defaults to 1e-12.

  • with_amplification (bool) – Enable ideal inline amplification and corresponding noise. Defaults to False.

  • with_attenuation (bool) – Enable attenuation. Defaults to True.

  • with_dispersion (bool) – Apply chromatic dispersion. Defaults to True.

  • with_manakov (bool) – Considers axis [-2] as x- and y-polarization and calculates the nonlinear step as given by the Manakov equation. Defaults to False.

  • with_nonlinearity (bool) – Apply Kerr nonlinearity. Defaults to True.

  • phase_inc (float) – Maximum nonlinear-phase rotation in rad allowed during simulation. To be used with n_ssfm = “adaptive”. Defaults to 1e-4.

  • swap_memory (bool) – Use CPU memory for while loop. Defaults to True.

  • dtype (tf.complex) – Defines the datatype for internal calculations and the output dtype. Defaults to tf.complex64.


x ([…,n] or […,2,n], tf.complex) – Input signal in \((\sqrt{\text{W}})\). If with_manakov is True, the second last dimension is interpreted as x- and y-polarization, respectively.


y (Tensor with same shape as x, tf.complex) – Channel output

Erbium-doped fiber amplifier

class sionna.channel.EDFA(g=4.0, f=7.0, f_c=193.55e12, dt=1e-12, with_dual_polarization=False, dtype=tf.complex64, **kwargs)[source]

Layer implementing a model of an Erbium-Doped Fiber Amplifier

Amplifies the optical input signal by a given gain and adds amplified spontaneous emission (ASE) noise.

The noise figure including the noise due to beating of signal and spontaneous emission is \(F_\mathrm{ASE,shot} =\frac{\mathrm{SNR} _\mathrm{in}}{\mathrm{SNR}_\mathrm{out}}\), where ideally the detector is limited by shot noise only, and \(\text{SNR}\) is the signal-to-noise-ratio. Shot noise is neglected here but is required to derive the noise power of the amplifier, as otherwise the input SNR is infinitely large. Hence, for the input SNR, it follows [A2012] that \(\mathrm{SNR}_\mathrm{in}=\frac{P}{2hf_cW}\), where \(h\) denotes Planck’s constant, \(P\) is the signal power, and \(W\) the considered bandwidth. The output SNR is decreased by ASE noise induced by the amplification. Note that shot noise is applied after the amplifier and is hence not amplified. It results that \(\mathrm{SNR}_\mathrm{out}=\frac{GP}{\left (4\rho_\mathrm{ASE}+2hf_c\right)W}\), where \(G\) is the parametrized gain. Hence, one can write the former equation as \(F_\mathrm{ASE,shot} = 2 n_\mathrm{sp} \left(1-G^{-1}\right) + G^{-1}\). Dropping shot noise again results in \(F = 2 n_\mathrm{sp} \left(1-G^ {-1}\right)=2 n_\mathrm{sp} \frac{G-1}{G}\).

For a transparent link, e.g., the required gain per span is \(G = \exp\left(\alpha \ell \right)\). The spontaneous emission factor is \(n_\mathrm{sp}=\frac{F} {2}\frac{G}{G-1}\). According to [A2012] and [EKWFG2010] combined with [BGT2000] and [GD1991], the noise power spectral density of the EDFA per state of polarization is obtained as \(\rho_\mathrm{ASE}^{(1)} = n_\mathrm{sp}\left (G-1\right) h f_c=\frac{1}{2}G F h f_c\). At simulation frequency \(f_\mathrm{sim}\), the noise has a power of \(P_\mathrm{ASE}^{(1)}=\sigma_\mathrm{n,ASE}^2=2\rho_\mathrm{ASE}^{(1)} \cdot f_\mathrm{sim}\), where the factor \(2\) accounts for the unpolarized noise (for dual polarization the factor is \(1\) per polarization). Here, the notation \(()^{(1)}\) means that this is the noise introduced by a single EDFA.

This class inherits from the Keras Layer class and can be used as layer in a Keras model.



>>> edfa = EDFA(
>>>     g=4.0,
>>>     f=2.0,
>>>     f_c=193.55e12,
>>>     dt=1.0e-12,
>>>     with_dual_polarization=False)


>>> # x is the optical input signal
>>> y = EDFA(x)
  • g (float) – Amplifier gain (linear domain). Defaults to 4.0.

  • f (float) – Noise figure (linear domain). Defaults to 7.0.

  • f_c (float) – Carrier frequency \(f_\mathrm{c}\) in \((\text{Hz})\). Defaults to 193.55e12.

  • dt (float) – Time step \(\Delta_t\) in \((\text{s})\). Defaults to 1e-12.

  • with_dual_polarization (bool) – Considers axis [-2] as x- and y-polarization and applies the noise per polarization. Defaults to False.

  • dtype (tf.complex) – Defines the datatype for internal calculations and the output dtype. Defaults to tf.complex64.


x (Tensor, tf.complex) – Optical input signal


y (Tensor with same shape as x, dtype) – Amplifier output

Utility functions


sionna.channel.utils.time_frequency_vector(num_samples, sample_duration, dtype=tf.float32)[source]

Compute the time and frequency vector for a given number of samples and duration per sample in normalized time unit.

>>> t = tf.cast(tf.linspace(-n_min, n_max, num_samples), dtype) * sample_duration
>>> f = tf.cast(tf.linspace(-n_min, n_max, num_samples), dtype) * 1/(sample_duration*num_samples)
  • num_samples (int) – Number of samples

  • sample_duration (float) – Sample duration in normalized time

  • dtype (tf.DType) – Datatype to use for internal processing and output. Defaults to tf.float32.

  • t ([num_samples], dtype) – Time vector

  • f ([num_samples], dtype) – Frequency vector


R. H. Hardin and F. D. Tappert, “Applications of the Split-Step Fourier Method to the Numerical Solution of Nonlinear and Variable Coefficient Wave Equations.”, SIAM Review Chronicles, Vol. 15, No. 2, Part 1, p 423, 1973.


J. A. Fleck, J. R. Morris, and M. D. Feit, “Time-dependent Propagation of High Energy Laser Beams Through the Atmosphere”, Appl. Phys., Vol. 10, pp 129–160, 1976.


N. J. Muga, M. C. Fugihara, M. F. S. Ferreira, and A. N. Pinto, “ASE Noise Simulation in Raman Amplification Systems”, Conftele, 2009.


G. P. Agrawal, “Fiber-optic Communication Systems”, 4th ed. Wiley series in microwave and optical engineering 222. New York: Wiley, 2010.


R. J. Essiambre, G. Kramer, P. J. Winzer, G. J. Foschini, and B. Goebel, “Capacity Limits of Optical Fiber Networks”, Journal of Lightwave Technology 28, No. 4, 2010.


D. M. Baney, P. Gallion, and R. S. Tucker, “Theory and Measurement Techniques for the Noise Figure of Optical Amplifiers”, Optical Fiber Technology 6, No. 2, 2000.


C.R. Giles, and E. Desurvire, “Modeling Erbium-Doped Fiber Amplifiers”, Journal of Lightwave Technology 9, No. 2, 1991.


P. K. A. Wai, C. R. Menyuk, and H. H. Chen, “Stability of Solitons in Randomly Varying Birefringent Fibers”, Optics Letters, No. 16, 1991.