## 3 Software Receiver Implementation
### Back-End
#### 3.2.2 SCCC Decoder  
The SCCC decoder can be considered the main section of the receiver, responsible for recovering the information bits from the encoded ones. Its input is the quantized soft bits from the constellation demapper module, representing the confidence of the encoded bits being one or zero. The information bits are decoded using a turbo-like structure as in Figure 5, where multiple iterations are used to improve the confidence of the bits, before the final hard decision. Also, for the internal architecture of the SCCC decoder, the Factory Method Design Pattern has been exploited, developing each single module to be highly flexible and easy to interface with the other modules. The SCCC decoder implemented is based on the BCJR algorithm, defined by [PERSON], [PERSON], [PERSON], and [PERSON] [31]. It is an iterative Maximum A Posteriori (MAP) Trellis-based algorithm that aims to reconstruct the a posteriori probabilities by means of Soft-Input Soft-Output (SISO) decoders [32]. The nature of the SISO decoders, and the iterations needed to decode the signal, make the SCCC decoder the most computationally intensive part of the receiver. Puncturing/de-puncturing and interleaving/de-interleaving modules aim to respectively remove/add redundancy bits and interleave/de-interleave bits according to a set of predefined rules. These modules have been developed following GPU-aided parallelism and they can be executed in a few microseconds. The most important modules of the SCCC decoders are obviously the SISO decoders. Further details about the implemented BCJR algorithm can be found in [33]. Specifically, the trellis processing is performed in two steps: forward and backward. For this reason, the BCJR is also called the _forward-backward_ algorithm. These steps must be performed iteratively, limiting the use of parallelization, and slowing down the whole process. Also, each step requires the computation of the already-mentioned \(\max^{\star}\) equation, which is known to be computationally intensive. Overall, three operations are the most complex to be designed and accelerated for the SISO decoders:  
* The forward recursion, which calculates the \(\alpha\) values iteratively, limits the application of the SIMD technique because each value is dependent on the elements computed before it. * The backward recursion, which calculates the \(\beta\) values iteratively, limits the application of the SIMD technique because each value is dependent on the elements computed before it. * The \(\max^{\star}\) that requires the computation of a logarithm and an exponential, both intensive functions due to the software abstraction needed. To increase the performance-exploiting GPU programming as far as possible, different techniques have been used. First of all, the GPU memory has been exploited to guarantee fast and shared access to data for each thread. Then, to parallelize \(\alpha\) and \(\beta\) computation, the windowing technique has been employed [32]. This procedure involves parallelizing the computation of sets of samples by computing the metrics in successive windows. With an effective number of windows, this procedure parallelizes the whole computation, without a significant implementation loss. The windows number is strongly related to the number of inputs of the SISO decoders, which is proportional to the used ModCod. The larger the number of windows, the larger the speed of the process. In our implementation, the ideal number of windows for ACM 1 has been computed to be about 15 windows, while for ACM 27, we could employ up to 60 windows, without significant loss in error correction performance. On the other hand, to avoid the slowing factor introduce by the Jacobian logarithm (1), we have chosen an approximation of it. Several approximations of this function have been proposed in literature [34; 35]. One of these proposes to use the classic max instead of the max\({}^{+}\) function, introducing an implementation loss in error decoding performance [32].