Concatenation
How Serial Code Cascading Defeats Burst Errors
The concatenated-code construction was introduced by G. David Forney in his 1966 doctoral thesis as a way to build very long, powerful codes that remain practical to decode. Rather than designing a single enormous code with an intractable decoder, concatenation splits the work between two simpler codes operating on different alphabets. The inner code works on individual bits or short symbols and is decoded with a maximum-likelihood Viterbi algorithm; the outer code works on larger symbols (bytes) over a Galois field and is decoded algebraically. Because each stage is independently decodable, the combined system inherits a minimum distance close to the product of the two component distances while keeping decoder complexity additive rather than multiplicative.
The division of labor is what makes the pairing so effective. A rate-1/2, constraint-length-7 convolutional code decoded by a soft-decision Viterbi processor gives roughly 5 dB of gain on its own, but its output errors are correlated: when the trellis search chooses the wrong survivor path it produces a run of several to a few dozen wrong bytes. A Reed-Solomon outer code is indifferent to how many bits inside a symbol are corrupted, so it treats each Viterbi burst as a handful of symbol errors. RS(255,223) corrects up to t = 16 symbol errors per 255-byte codeword, which is more than enough to absorb the residual bursts once the interleaver has spread them out.
Modern systems often replace the classic pairing with iterative schemes. Turbo codes use parallel concatenation of two recursive convolutional codes joined by an interleaver and decoded iteratively, and LDPC codes approach the Shannon limit with belief-propagation decoding. DVB-S2 retains the concatenated philosophy by pairing an outer BCH code with an inner LDPC code. The serial Reed-Solomon plus convolutional arrangement nevertheless remains in service wherever a proven, low-complexity, standards-frozen link is preferred over the last fraction of a decibel.
Code Rate and Coding Gain
Rcc = Router × Rinner = (k/n)out × (k/n)in
CCSDS example:
Rcc = (223 / 255) × (1 / 2) ≈ 0.874 × 0.5 ≈ 0.437
Reed-Solomon correction capacity:
t = (n − k) / 2 = (255 − 223) / 2 = 16 symbols per codeword
Asymptotic coding gain:
G ≈ 10·log10(Rcc × dmin / 2) dB
Where R = code rate, n = block length, k = information length, dmin = minimum Hamming distance. The interleaver of depth I divides any Viterbi burst length L into ceil(L / I) errors per RS codeword.
Concatenated Coding Standards
| System | Outer Code | Inner Code | Interleaver | Overall Rate | BER Target |
|---|---|---|---|---|---|
| CCSDS deep space | RS(255,223) | Conv. rate-1/2, K=7 | Byte, depth 2 to 8 | ≈ 0.437 | 1×10-10 |
| DVB-S (1994) | RS(204,188) | Conv. rate-1/2 to 7/8 | Convolutional, I=12 | 0.41 to 0.81 | 1×10-11 (QEF) |
| DVB-S2 | BCH (t = 8 to 12) | LDPC, rate 1/4 to 9/10 | Bit, block | 0.25 to 0.90 | 1×10-7 |
| Turbo (3GPP) | (parallel concat.) | 2 × RSC, K=4 | Internal, QPP | 1/3 base | 1×10-6 |
| GSM GMSK | Block (Fire/CRC) | Conv. rate-1/2, K=5 | Block, diagonal | ≈ 0.45 | 1×10-3 |
Frequently Asked Questions
Why does a concatenated code place Reed-Solomon outside and convolutional inside?
The inner Viterbi-decoded convolutional code excels at random bit errors but fails in short bursts. Reed-Solomon works on m-bit symbols (usually bytes) and counts one corrupted symbol regardless of how many of its bits are wrong, so placing it outside lets it absorb the bursty residue. The CCSDS standard pairs outer RS(255,223) over GF(256) with an inner rate-1/2, K=7 convolutional code and a depth-2-to-8 byte interleaver between them.
How much coding gain does a concatenated Reed-Solomon plus convolutional code provide?
The CCSDS scheme delivers roughly 7 to 9 dB of gain at an output BER of 1×10-5, hitting that target near Eb/N0 of about 2.5 dB. The inner code alone contributes about 5 dB; the outer RS code adds 2 to 3 dB by clearing residual bursts. Combined rate is 0.5 × 0.874 ≈ 0.437, so bandwidth expansion is about 2.3×.
Why is an interleaver required between the inner and outer codes?
A Viterbi decoder emits runs of consecutive byte errors. RS(255,223) corrects only t = 16 symbols per codeword, so an entire burst landing in one codeword could be uncorrectable. A symbol interleaver of depth I spreads consecutive Viterbi bytes across I different RS codewords, dividing each burst by I. CCSDS uses depth 2 to 8; depth 5 keeps bursts up to about 80 bytes survivable.