Coded modulation schemes

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

Reed-Muller coded QPSK modulation:
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_4state.data   trellis_tcm_S4.data
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.
Presently, only 8-PSK modulation is considered. Extensions to higher-order modulations can be implemented following a similar procedure.

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

1. Two-stage decoding
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