Channel
Channel offers an interface to implement
Discrete Memoryless
Channels, which are a class of communication
channels,
as well as a number of pre-defined channels. A number of well-known channels are
already implemented.
Interface
Channel Base Class
Each channel inherits from the channel base class template:
template <typename Input, typename Output>
struct Channel;
Input is the type of objects that enter the channel, Output is
the type of objects that emerge from the channel, i.e. the channel output.
virtual ~Channel() |
Make sure to always define a virtual destructor, see
Scott Meyers' ``effective C++''. |
virtual
double probabilityOf(Output &channelOutput,
Input &channelInput) const;
|
Return the probability that the channel output is
channelOutput when the input to the channel is
channelInput. |
Unless explicity stated otherwise each channel given below is a template class
and inherits from the base class as in this example:
template <Input, Output>
struct ExampleChannel : public Channel<Input, Output>
{
// ... Overload destructor and probabilityOf(...) ...
};
You can create your own channels in the same way.
NoiselessChannel
A channel that models noiseless communication. Thus, the channel output is
always equal to the channel input; equivalently, probabilityOf(...)
returns 1 if channelOutput equals channelInput and zero otherwise.
NoiselessChannel(); |
Only a default Constructor is available. |
ShiftChannel
Models a channel where the output is a shifted version of the input.
ShiftChannel(double offset); |
The offset is the shift introduced by the channel, i.e.
channelOutput = channelInput + offset. |
AWGNChannel
The well-known Additive White
Gaussian Noise channel. If the mean of the noise is zero, and a given
variance, the AWGNChannel with that variance is the worst possible kind of
additive noise. Hence if the actual probability model of the noise is not known,
but the mean is zero and the variance is known, the AWGNChannel is equivalent to
a worst-case scenario.
AWGNChannel(double variance); |
The variance refers to the variance of the noise. |
AGNChannel
The AGNChannel models an Additive Gaussian Noise channel. Unlike the
AWGNChannel, the mean does not have to be zero, otherwise it is equivalent.
Hence, it is a combination of the ShiftChannel and AWGNChannel. To be used like
the AWGNChannel when the mean of the noise is not equal to zero.
AGNChannel(double mean, double variance);
|
The parameters are the mean and variance of the
noise. |
AGGNChannel
Models additive noise distributed according to the
Generalized Gaussian distribution. In addition to the parameters mean
and variance, which are equivalent to those in the Gaussian channels,
the shape parameter is unique to the Generalized Gaussian distribution
and is often denoted as alpha. Note that there is procedure
generalizedGaussianShape(...) to estimate the shape parameter from a
dataset in Math.
AGGNChannel(double mean, double variance,
double shape = 2.0); |
The input to the constructor are simply the parameters of the
distribution of the noise. By default the shape is 2.0
which makes the distribution Gaussian. |
MultiChannel
Unlike most channels in Channel, MultiChannel is not an existing
channel model. It allows one to create a channel that behaves differently for
each input by associating a particular channel with each possible input.
In the table below, CHANNEL_MAP, the type of the parameter to the constructor is
in fact:
std::map<Input, std::tr1::shared_ptr< Channel<Input,Output> > >
This is only to simplify the documentation, CHANNEL_MAP is not defined in the
code.
MultiChannel(CHANNEL_MAP channels) |
The constructor requires a map from each possible valid
Input to an associated shared-pointer to a channel to be used
to obtain the likelihood of the channel output for a given input symbol.
|
BinarySymmetricChannel
The
Binary Symmetric Channel is a well-known channel that takes bits
as input and produces bits as output, flipping the bits during transport with a
certain probability that is usually denoted as p.
By exception, BinarySymmetricChannel is not a template class as the
channel input symbols and the channel output are defined to be booleans, and
hence the definition is:
class BinarySymmetricChannel : public Channel<bool, bool> ...
BinarySymmetricChannel(double pFlip); |
Constructor, the probability that a bit is flipped is
pFlip. |
|