CHANNEL CODING
When it comes to channel coding, we always have to compromise between energy efficiency and bandwidth efficiency.

Low-rate codes are not very efficient due to the reason that:
• They have large overheads
• Requires more bandwidth to transmit the data.
• The decoders are more complex.

While codes with greater redundancy are more efficient in correcting errors, as the efficiency of the code increases:
• It contributes greatly by operating at a lower transmit power and transmitting over long distances.
• It is also more tolerant towards interference and hence can be used with small antennas.
• Transmits at a higher data rate.

Due to these advantages codes having redundancy is preferred for wireless links.

We can distinguish coding methods into the following categories:

Backward error correction (BEC): In this case when an error is detected, it asks the sender to retransmit the data. Though this method is simple, it results in undesirable delays in the transmission, due its requirements of a duplex communication.

Forward error correction (FEC): This requires that the decoder should be capable of locating the position of the errors in addition to correcting them. Since FEC codes require only simplex communication they improve the energy efficiency of the communication system, making it suitable for satellite transmission.


SHANNON CAPACITY THEORM
The Shannon–Hartley theorem states the channel capacity C, meaning the theoretical tightest upper bound on the information rate (excluding error correcting codes) of clean (or arbitrarily low bit error rate) data that can be sent with a given average signal power S through an analog communication channel subject to additive white Gaussian noise of power N, is:
shannon capacity
Where C is the channel capacity in bits/sec
B is the bandwidth of the channel in Hertz.
S/N is the signal to noise ratio.


CONVOLUTION CODES
Convolution codes refer to those codes where redundancy is introduced to overcome errors. Instead of breaking the message stream into fixed-size blocks (In the case of Block Codes), redundancy is added continuously to the whole stream. The encoder introduces redundancy by keeping a certain number of bits in its memory, and the output bit is made to be dependent on the current input as well as the previously stored inputs.