Julia package providing a framework for multicell MIMO simulations.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.



CoordinatedPrecoding.jl is a Julia package for the simulation of wireless networks, in particular multicell multiple-input multiple-output (MIMO) networks operating using coordinated precoding.

The main purpose of the package is to provide an infrastructure for researchers to write their own simulation scripts. In addition to this, the package contains some basic network/channel models (inspired by 3GPP and ITU-T) and some reference implementations of popular precoding methods.

The package is under continuous development, and may be improved and extended in the future.



The networks are subtypes of the Network abstract type. In order to generate the network, several concrete models are available:

  • InterferingBroadcastChannel, a network without large-scale fading which can be used to simulate interfering broadcast channels (including interference channels).
  • TriangularMacroNetwork, a triangular macro network with three sites. Large-scale parameters are inspired by 3GPP Case 1.
  • TriangularHetNet, similar to the network above, but including a variable number of pico base stations per cell.
  • IndoorsNetwork, an office corridor inspired by ITU-T InH
  • RandomLargeScaleNetwork, a macro network with random base station placement and 3GPP inspired pathloss.

For each network, a convenience function is available for quick generation, e.g.: setup_interfering_broadcast_channel(num_BSs, num_MSs_per_cell, num_MS_antennas, num_BS_antennas; kwargs)

Simulation functions

The simulation is a simple Monte Carlo loop. Given a network, the simulate(network, simulation_params) function determines large-scale parameters by dropping the users by calling draw_user_drop!(network). The small-scale fading is then generated by calling channel = draw_channel(network). By writing customized methods for these functions, new network models can be implemented.

The simulation function sweeps one main independent variable, but support also exists for sweeping auxiliary independent variables.

Reference implementations of precoding schemes

We provide implementations for the following precoding methods:

  • Shi2011_WMMSE, the famous WMMSE algorithm by Shi et al.
  • Razaviyayn2013_MinMaxWMMSE, min-max version of the WMMSE algorithm by Razaviyayn et al.
  • Komulainen2013_WMMSE, diagonalized WMMSE algorithm by Komulainen et al.
  • Gomadam2008_MinWLI, leakage minimization by Gomadam et al.
  • Gomadam2008_MaxSINR, heuristic per-stream SINR maximization by Gomadam et al.
  • Eigenprecoding, single-user optimal beamforming with/without TDMA

Installation and Usage

The package is installed by calling Pkg.clone("https://github.com/rasmusbrandt/CoordinatedPrecoding.jl") from the Julia REPL.

See the examples folder for ideas on how to write the simulation scripts. For implementing network models and precoding methods, see the corresponding folders in the src directory.

The package uses PyPlot.jl for visualization, Lumberjack.jl for logging, and ProgressMeter.jl for showing progress during lengthy simulation runs. The Min-Max WMMSE algorithm is implemented using Gurobi.jl. The package uses Compat.jl for compatibility between julia 0.3 and 0.4.