ved bit sequence does not match this known structure, the receiver declares an error has occurred. If the number of errors is sufficiently small and the structure is robust, the receiver can detect the erroneous bits and reconstruct the correct bit sequence. A strong error correcting code has two key characteristics: (1) the encoder imposes a structure that maximizes the difference (or the distance) between any two valid bit sequences; (2) the decoder utilizes all the information available at the receiver's end, including the redundancy and previously unsuccessful transmissions. Thus, the decoder can determine which valid bit sequence is most likely the one that has been transmitted. The first significant difference between a Turbo code and a conventional code is the use of a recursive systematic encoder. A typical convolutional coder uses a non-recursive structure. By feeding one of the outputs back to the input, a recursive encoding structure is obtained. The recursive structure is systematic, i.e., the input bits appear directly as part of the encoded bit-stream. Therefore, a systematic structure enables the combination of two codes in order to construct a stronger composite code. The input bit-stream only needs to be transmitted once. The computed parity bits from each of the two constituent encoders are transmitted separately. The recursive structure interacts with the interleaver to give the composite code some unique performance characteristics. The optimum decoder for any code is a Maximum-Likelihood (ML) decoder. In ML decoding, the receiver produces a probability that each received bit is either 0 or 1. The ML decoder then uses these received bit probabilities, along with its knowledge of the structure imposed by the encoder, to compute the probability of every possible transmitted bit sequence. The most probable transmitted bit sequence is then chosen as the decoded bit sequence. The ML decoding is theoretically optimal and can achieve the lowest probability of decoder failure or probability of error. 