In this page, links to programs in C/C++ and Matlab for simulating several combinations
of error correcting codes and digital modulation are presented. Combined
coding and modulation is discussed in Chapter 9 of the book

qpsk_rm31.c

Simulation of coded QPSK with an extended Hamming (8,4,4) code. This basic example of a coded modulation scheme serves to set our minds and understand the essential idea, before proceeding to more elaborated combinations of ECC and modulation.

Reed-Solomon coded M-QAM:

RS coded MQAM.mdl

Note: This is a Simulink model created with Matlab version 7.1

**Trellis-coded modulation (TCM)**

As in the case of binary convolutional codes and turbo codes, TCM schemes have an underlying trellis structure that must be provided to the Viterbi decoding algorithm. Therefore, there are two steps required in the simulation of a particular combination of trellis and modulation:

**1. Trellis structure**

gen_trellis_ungerboeck.c

This is the same algorithm as for binary convolutional encoders. For
rate-1/2 encoders and 8-PSK modulation, the difference is that labels of
branches are now integers from 0 to 2^m-1, and not pairs of bits. This
is because the branch labels are used by the decoder to address cosets
of signals associated with uncoded bits. The trellis is specified by an
input file with the same format as in the binary
case. Here are some good examples of input files and the corresponding
trellis structure files:

input_8state.data trellis_tcm_S8.data

input_16state.data trellis_tcm_S16.data

input_32state.data trellis_tcm_S32.data

input_64tate.data trellis_tcm_S64.data

**2. Viterbi decoder**

tcm_8psk.c

The Viterbi algorithm is the same as the binary case with one main difference: The survivor sequences include the uncoded bits, which are decided at each trellis stage when selecting one of two parallel branches with the largest correlation metric.

**Pragmatic trellis-coded modulation (P-TCM)**

Pragmatic TCM schemes are designed to use the same binary convolutional
encoder selecting cosets in a signal constellation. Denser constellations
can be used by employing uncoded bits (parallel branches in the trellis).
Below are two programs for simulating P-TCM schemes using suboptimal decoders
of reduced complexity. They have been designed for 8-PSK modulation. The
trellis structure of the standard 64-state rate-1/2 code is:

trellis_tcm_S64.data

tc-8psk-iq.c

Based on a (patented) IQ transformation of the incoming 8-PSK symbols. The transformed I-channel and Q-channel samples appear to the decoder as if they were QPSK symbols. The second decoding stage is a simple look-up table with the decoded bit from the Viterbi algorithm and information on the sector of the original noisy received 8-PSK symbol.

**2. Decoding with polar coordinates**

tc-8psk-sect.c

The same two-stage decoder as above. However, when transforming the
symbols prior to Viterbi decoding, the amplitude information is ignored
and only the phase of the received symbol is employed in the metric computation
stage.

**Multilevel-coded modulation (MCM)**

Multilevel coding schemes are designed to use binary codewords selecting labels of signals in a constellation. These schemes have been shown to achieve capacity if the component codes are designed with rates matching the capacities of underlying multiple channels. Below is an example of an MCM scheme with short BCH codes and soft-decision decoding with ordered statistics.

The same observations made in discussing the ordered
statistics decoding algorithm apply here, in terms of a definition
file that needs to be modified every time the component codes change. In
the program below, the component are BCH(64,18,22), BCH(64,45,8) and BCH(64,63,2)
codes. Consequently the orders needed are [22/4]=4, [8/4]=2 and [2/4]=0.
The source files are:

def3.h

main_4_2_0.c

order4_code1.c

order2_code2.c

order0_code3.c

which should be compiled as:

gcc -O2 main_4_2_0.c order4_code1.c order2_code2.c order0_code3.c -lm

The generator matrices of these codes, needed as input to the simulation
program, are:

generator_641822.data

generator_644508.data

generator_646302.data