# Coded-GFDM for Reliable Communication in Underwater Acoustic Channels
## 3 System Architecture
### Forward Error Correction Codes  
FECs encoding is performed by adding a sequence of code bits to the input sequence to be transmitted [25]. This reduces the probability of any error arising due to channel impairments. Hamming distance is the number of bit positions by which the two codes are different. The hamming distance is directly proportional to the number of bits corrected at the receiver. If \(D\) is the Hamming distance, the maximum number of bits corrected are usually less than or equal to \((D-1)/2\). In block type Hamming codes, for every \(k\) bit input block size, \((n-k)\) bits are added to create a new block of size \(n\). This coding technique is denoted by \((n,k)\). In this work, we will use two types of FECs including cyclic block (BCH & RS) codes and convolutional codes to evaluate their performance for an acoustic GFDM system. BCH codes are considered a big category of cyclic codes. These codes work for both binary and nonbinary alphabets. Since these codes have a rich algebraic structure, their decoding is done by using efficient decoding methods. Moreover, there exist a variety of code rates and block lengths for BCH codes that are well documented as well. These codes are also considered among the best-known codes when the requirement is to use low or moderate block lengths [26]. If \(t\) represents the number of multiple bit errors, \(m\) a positive integer with \(m\geq 3\) and \(t\leq 2^{m-1}\), a binary BCH code is possible with the following characteristics:  
* Block length \(n=2^{m}-1\)
* Parity check bits: \(n-k\leq m\times t\)
* Minimum distance \(D\geq 2t+1\)  
While BCH codes stem from Hamming codes, unlike Hamming codes that can only correct one-bit errors, these codes can correct multi-bit errors. One of the powerful classes of cyclic codes, their code generators are well documented [27] which makes the use of various types of BCH codes a trivial job. Using the table presented in [27], BCH code generators commonly used for the construction of BCH codes can be identified for various values of \(n\), \(k\), and \(t\), up to a block length of 255 [28]. Introduced in 1960 by [PERSON] and [PERSON] [29], Reed-Solomon codes are considered to be the most widely used codes in communication systems as well as data storage systems. These codes in fact are nonbinary BCH codes. Symbols of RS codes are made up of \(m\)-bit sequences with \(m>2\). For a typical RS code, \(n\), which is the total number of code symbols in the encoded block, and \(k\), which is the number of data symbols are given by [26]:  
\[(n,k)=(2^{m}-1,\;2^{m}-1-2t) \tag{1}\]  
In short, RS codes are in fact \(2^{m}\)-ary BCH codes with minimum distance \(D_{\min}=2t+1\) and \(1<t<2^{m}-1-1\). Given the same encoder input and output block lengths, RS codes demonstrate the largest minimum code distance when comparing the linear codes. RS codes are known to perform extremely well against burst errors [28]. Moreover, since RS codes are nonbinary, the distance between two codewords is defined as the number of symbols in which the sequences differ and for RS codes, this minimum distance is given by:  
\[d_{min}=n-k+1 \tag{2}\]  
Three integers i.e., \(n,k\), and \(K\) describe a typical convolutional code. Like the block codes, the ratio \(k/n\) is the code rate. The parameter \(K\) is called constraint length. The values of \(n\) and \(k\) are normally small integers while \(K\) controls the potential and complexity of the code. Finite-state machines are used to describe the convolutional codes. If \(i\) represents the time instant, \(\sigma_{i}\) is the \(i\)th state of the encoder, and \(k\) is the information bits that enter the encoder, then the output of the encoder is \(n\) binary bits while the state of the encoder changes from \(\sigma_{i-1}\) to \(\sigma_{i}\). Figure 1 represents a typical convolutional encoder having shift registers of length \(k\)[26; 28]. The encoder works as follows:  
As a start, \(k\) bits enter the encoder at each time instance.