In this page, programs in C/C++ 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
Binary-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.
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 with:
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