# Transmission Through a Simulated Channel

Once a codeword has been found to represent a source message, it can be sent through a channel, with the result that certain data is received as the output of the channel, which will be related to the codeword sent, but with random noise. This software currently handles only memoryless binary channels, for which each bit sent through the channel results in a separate piece of data being received, and the noise affecting one bit is independent of the noise affecting other bits.

For a Binary Symmetric Channel (BSC), each bit sent results in a bit being received. The bit received differs from the bit sent with some error probability, p, which is the same for 0 bits and for 1 bits. In other words, the probability distribution for the bit received given the bit sent is as follows:

> P(receive 1 | send 1) = P(receive 0 | send 0) = 1-p
> P(receive 1 | send 0) = P(receive 0 | send 1) = p

For an Additive White Gaussian Noise (AWGN) channel, the data received at each time is equal to the data sent plus Gaussian noise with mean zero and some standard deviation, s, independently for each bit. For this software, the data sent is -1 for a 0 bit and +1 for a 1 bit. In other words, the distribution of the received data given the bit sent is as follows:

> data received | send 1 ~ N(+1,s2)
> data received | send 0 ~ N(-1,s2)

It is typically assumed that the standard deviation of the noise varies with the rate at which bits are sent, increasing in proportion to the square root of the rate. The error rate obtained from sending unencoded bits at rate R will then be the same as is obtained using a code that repeats each bit n times, and sends these bits at rate nR (assuming optimal decoding of each bit by thresholding the sum of the n channel outputs corresponding to that bit). Another way of looking at this scaling for s is that when bits are send at a lower rate, the receiver will be accumulating the channel output for a longer time, with the result that the amount of noise will decrease (relative to the signal) as a result of averaging.

To account for this, it is common to compare codes for AWGN channels in terms of their bit error rate and the value of

> Eb / N0 = 1 / 2Rs2

at which they operate, where R=K/N is the rate of the code, and s is the noise level at which the code achieves the quoted bit error rate. Hence, a code operating at a lower rate is allowed to assume a lower noise level to make the comparison fair. It is common to quote Eb / N0 in decibels (db), equal to 10 log10(Eb / N0).

The Additive White Logistic Noise (AWLN) channel is similar to the AWGN channel, except that the noise comes from a logistic rather than a Gaussian distribution. The probability density function for the noise is

> (1/w) exp(-n/w) / [1 + exp(-n/w)]2

where n is the amount of noise, and w is a width parameter for the distribution, analogous to the s parameter for Gaussian noise. (However, w is not equal to the standard deviation for the logistic distribution, which is sqrt(pi2/3)w.) Note: Although I've named this channel in analogy with the AWGN channel, it does not share the properties discussed above regarding how noise levels would be expected to change when the data rate changes.

transmit: Transmit bits through a simulated channel.

>     transmit encoded-file|n-zeros received-file seed channel

> > where `channel` is one of the following:

> > >     bsc error-probability

> > >     awgn standard-deviation

> > >     awln width

Simulates the transmission of the bits in `encoded-file` through a channel, with the received data being stored in `received-file`. Typically, `encoded-file` will have been produced by the `encode` program, but it could also come from `rand-src` or another program. If newlines separate blocks in `encoded-file`, these block boundaries will be preserved in `received-file`.

Alternatively, a count of zeros to transmit can be given, rather than a encoded-file. This count can be the product of the block size and the number of blocks, written with `x` separating these numbers, with no spaces. The `received-file` will mark the block boundaries with newlines, assuming a block size of one if a simple bit count is given. Note that zero messages are sufficient for assessing the performance of a linear code with a symmetrical channel and a symmetrical decoding algorithm. Warning: Ties, messages that lead to floating-point overflow, and program bugs can easily make a decoding algorithm non-symmetrical, so it's best not to test exclusively on zero messages. Indeed, it is best not to do this at all unless you really need to avoid the time needed to generate and encode random messages.

The transmission will be corrupted by random noise, which will be generated pseudo-randomly based on `seed`. The actual random seed used will be `seed` times 10 plus 3, so that the stream of pseudo-random numbers will not be the same as any that might have been used by another program.

The fourth argument specifies the type of channel, currently either `bsc` (or `BSC`) for the Binary Symmetric Channel, or `awgn` (or `AWGN`) for the Additive White Gaussian Noise channel, or `awln` (or `AWLN`) for the Additive White Logistic Noise channel. The channel type is followed by an argument specifying the characteristics of the channel, as follows:

> BSC: The probability that a bit will be flipped by noise - ie, the probability that the bit received is an error.

> AWGN: The standard deviation of the Gaussian noise that is added to the encodings of the bits.

> AWLN: The width parameter of the logistic distribution for the noise that is added to the encodings of the bits.

See the description of channel transmission for more details.

Examples: The command:

    transmit 10x3 rec 1 bsc 0.1

will simulate the transmission of 30 zero bits (3 blocks of size 10) through a Binary Symmetric Channel with error probability of 0.1. The result will be to store something like the following in the file `rec`:

>     0000000000
>     1000000000
>     0100000000

If an AWGN channel is used instead, as follows:

    transmit 10x3 rec 1 awgn 0.5

then the file `rec` will contain data such as:

>      -1.36 -0.86 -0.80 -1.19 -1.18 -0.64 -0.31 -1.16 -1.56 -0.79
>      -2.20 -1.62 -0.53 -1.29 -1.08 -2.05 -0.75 -1.22 -0.81 -0.52
>      -0.86 -0.34 -1.10 -1.30 -1.10 -1.20 -0.37 -1.07 -0.22 -1.46

Back to index for LDPC software