LDPCCode
LDPCCode offers an interface for
LDPC communication codes and
implementations of such codes which employ different possible decoding schemes.
To learn more about the terminology used here, the reader is advised to read an
introduction to Hamming
codes to get acquainted with the subject.
In this text, the term generator matrix is slightly different from the
usual description.
We only consider only the P part to be the generator matrix and assume
that the identity part I is implicit. The matrix I should thus be
left out of any generator matrix used here.
Code
template <std::size_t N, std::size_t K>
class Code;
std::size_t N |
The number of bits in a codeword. N should always be
greater than or equal to K. |
std::size_t K |
The number of bits in a message. |
From the given parameters N and K, it follows that the rate of
the code is K / N. Additionally, we can deduce the number of parity bits
to be N - K. It is adviced, and in some cases required, to select
K as a power of two and N as a multiple of K.
Any code offers the following interface:
std::size_t M |
The number of parity checks of the code, defined as N-K. |
typename G |
The type of the generator matrix, short for
std::tr1::array<std::bitset<K>, N-K>. A Generator
matrix only needs to contain entries for parity checks, the
K-by-K Identity matrix can be left out, it will be added
automatically. Hence, G contains only N-K vectors in stead of
N. |
typename H |
The type of the parity-check matrix, short for
std::tr1::array<std::bitset<N>, M>. The parity-check
matrix of the code will be automatically derived from the Generator
matrix of the code. |
bool encode(const std::bitset<K> &message,
std::bitset<N> &codeword) const |
Produces a codeword for a given a message,
returns true when successful. |
bool decode(const std::tr1::array<T, N> &channelOutput,
std::bitset<K> &message) |
Attempts to decode the output of the channel, which should be given
in floating point values in the range [0...1]: for each bit,
it should represent the probability of that bit to be 1.
Depending on the particular subclass of Code that is instanciated, a
different decoding algorithm will be employed. If a valid codeword is
deduced, the corresponding the message is written and
decode returns true. If no valid codeword is found,
false is returned and the contents of message are
undefined.
|
void print() const |
Prints the code's generator and check matrices. |
BPLDPCCode
The most commonly used decoding scheme, belief propagation, is implemented in
the BPLDPCCode, defined as:
template <typename T, unsigned N, unsigned K>
class BPLDPCCode;
Belief propagation is a sub-optimal and numerically unstable but computationally
feasible algorithm, and is hence the recommended choice for decoding.
BPLDPCCode offers the following constructors:
BPLDPCCode(const unsigned maxIterations = 1024u) |
This constructor will automatically create a generator matrix and
requires K to be a power of two and N to be a multiple
of K. The belief propagation algorithm will stop on convergeance,
or after maxIterations iterations. |
BPLDPCCode(const G &generator,
const unsigned maxIterations = 1024u) |
The code will be defined by the user-supplied generator matrix
generator. The belief propagation algorithm will stop on
convergeance, or after maxIterations iterations. |
MLLDPCCode
For reference, a maximum-likelihood decoder is implemented in the
MLLDPCCode:
template <typename T, unsigned N, unsigned K>
class MLLDPCCode;
Although a maximum-likelyhood decoder is stable and will lead to optimal
results, the required computation time is likely to exceed any reasonable
limits unless N and K are very small.
MLLDPCCode offers the following constructors:
MLLDPCCode() |
This constructor will automatically create a generator matrix and
requires K to be a power of two and N to be a multiple
of K. |
MLLDPCCode(const G &generator) |
The code will be defined by the user-supplied generator matrix
generator. |
|