A set of error-correction codes that consist of two (or more) interleaved codes and are decoded iteratively, the output of the decoder for the first code used being fed back into the decoder of the second code used, which is then fed back into the decoder for first code, etc. Turbo-codes can provide large coding gains, and systems using these codes can approach the Shannon capacity (see Shannon–Hartley theorem) for a communications channel.