This repository provides helper functions and models for end-to-end learning of optical communication systems.
For clarifications or bugs feel free to create a Github issue or write me an email: chef@<firstname><lastname>.com
This code has been developed as part of my PhD at DTU, Denmark, but also thereafter. There is still some code that has not been integrated into the public repository here, which will take some more time.
The latest example concerns a laser phase noise channel (+ AWGN), as studied in optical communication systems [https://ieeexplore.ieee.org/document/4814758]. A recurrent neural network is used to estimate the phase noise in parallel to the end-to-end auto encoder. The learned constellation becomes eye shaped instead of round in order to have better properties regarding the phase noise, see here. The recurrent neural network can be seen as a spatial transformer network [https://arxiv.org/abs/1506.02025, https://arxiv.org/abs/1605.00716].
Some examples doing probabilistic shaping have been added, following this publication ([https://arxiv.org/abs/1906.07748]).
Another example, an implementation of the split-step Fourier method (SSFM) in Tensorflow, allows gradient based learning end-to-end through the SSFM. The procedure is computational expensive and memory demanding, see here for two rendered iPython notebooks containing a pure simulation and an example of constellation shaping across the SSFM via end-to-end learning. Since the SSFM models cross-wavelength, cross-polarization and temporal correlations of the signal, in principle, it is possible to learn a high dimensional constellation shape across all mentioned degrees of freedom. However, the computational demand and memory usage is very large.
Further, this repository provides an implementation for two conference contributions ([https://arxiv.org/abs/1805.03785], [https://arxiv.org/abs/1907.08535]) and a manuscript [https://arxiv.org/abs/1810.00774].
- Fiber model, NLIN/GN model, Split step Fourier Method
- System components, e.g. Pulse shaping filter, WDM system framework back2back and transmission simulation
- Geometrical/Probabilistic constellation shaping via end-to-end learning:
iPython Notebook Example | Shaping | Channel | Optimised for bits/symbols (GMI/MI) | Gradient Through Channel | Reference |
---|---|---|---|---|---|
Link | Geometric | AWGN | Symbols (MI) | ✔️ | --- |
Link | Probabilistic | AWGN | Symbols (MI) | ✔️ | Arxiv |
Link | Joint Geo./Prob. | AWGN | Symbols (MI) | ✔️ | Arxiv |
Link | Geometric | Fiber (NLIN/GN) | Symbols (MI) | ✔️ | Arxiv 1, Arxiv 2 |
Link | Probabilistic | Fiber (NLIN/GN) | Symbols (MI) | ✔️ | --- |
Link | Geometric | Fiber (SSFM) | Symbols (MI) | ✔️ | --- |
Link | Geometric | Laser phase noise | Symbols (MI) | ✔️ | --- |
Link | Geometric | AWGN | Bits (GMI) | ✔️ | --- |
Link | Geometric | Fiber (NLIN/GN) | Bits (GMI) | ✔️ | Arxiv |
Link | Geometric | AWGN | Symbols (MI) | ❌ | Arxiv |
Link | Geometric | AWGN | Symbols (MI)/MINE | ❌ | Arxiv |
The learning algorithm learns by embedding a fiber channel model within an autoencoder. The implementation of the fiber channel model is copied from a MATLAB implementation by Dar et al. [https://www.osapublishing.org/oe/abstract.cfm?uri=oe-22-12-14199, https://arxiv.org/abs/1310.6137]. Please cite the authors appropriately if you use the here provided Python implementation.
Numpy model [claude/claude/models/NLIN.py]
Tensorflow model [claude/claude/claudeflow/models/NLIN.py]
Install Anaconda from https://www.anaconda.com/download/
Clone the git repository into your filesystem
git clone https://github.com/rassibassi/claude
Enter the git repository
cd claude
Create a new conda environment
conda create -n claudeDev python=3.6 pip scipy jupyter matplotlib
Activate the new environment
source activate claudeDev
Install TensorFlow as instructed here: https://www.tensorflow.org/install/install_linux#InstallingAnaconda
Install the local claude
pip package
pip install -e claude
This will install claude
from the claude folder.
Check if everything is installed
pip list | grep -E 'claude|tensorflow|numpy|scipy|jupyter|matplotlib'
Output:
claude 0.1 /home/path-to-some-folder/claude
jupyter 1.0.0
jupyter-client 5.2.3
jupyter-console 5.2.0
jupyter-core 4.4.0
matplotlib 2.2.3
numpy 1.15.1
scipy 1.1.0
tensorflow 1.14
Start Jupyter with
jupyter notebook
Open the Jupyter notebooks in the example directory. Then you can click on Kernel -> Restart & Run All