BCJR algorithm
The Bahl-Cocke-Jelinek-Raviv (BCJR) algorithm is an algorithm for maximum a posteriori decoding of error correcting codes defined on trellises (principally convolutional codes). The algorithm is named after its inventors: Bahl, Cocke, Jelinek and Raviv.[1] This algorithm is critical to modern iteratively-decoded error-correcting codes, including turbo codes and low-density parity-check codes.
Steps involved
[edit | edit source]Based on the trellis:
- Compute forward probabilities
- Compute backward probabilities
- Compute smoothed probabilities based on other information (i.e. noise variance for AWGN, bit crossover probability for binary symmetric channel)
Variations
[edit | edit source]SBGT BCJR
[edit | edit source]Berrou, Glavieux and Thitimajshima simplification.[2]
Log–MAP BCJR
[edit | edit source]The Log–MAP algorithm is a log-domain implementation of the BCJR (MAP) decoder. By working with log-likelihoods it avoids numerical underflow and turns probability multiplications into additions. In the log domain, the forward–backward recursions use the Jacobian logarithm ("max-star") identity , which yields the same a-posteriori log-likelihood ratios (LLRs) as the original MAP/BCJR algorithm when applied to the branch metrics.[3]
In practice, the small correction term is implemented via a short look-up table or a piecewise-linear approximation; working in the log domain also simplifies normalization of the forward/backward state metrics. Log–MAP decoders that output extrinsic LLRs are widely used as the soft-input/soft-output components in iterative (turbo) decoders.[4][5]
A common lower-complexity variant is **Max-Log-MAP**, which approximates the Jacobian logarithm by dropping the correction term (i.e., using ). This reduces complexity at the cost of a small performance loss relative to Log-MAP/MAP; the gap can be narrowed with constant/linear corrections or by scaling the extrinsic information ("normalized/scaled Max-Log-MAP"), typically recovering a few-tenths of a dB depending on the code and SNR.[6][7]
Windowed BCJR
[edit | edit source]A modified version that processes the trellis in segments to reduce computational complexity and memory requirements. This approach is particularly useful for very long sequences where full trellis storage becomes impractical. The windowed version maintains near-optimal performance while significantly lowering latency and hardware resource utilization in implementations.[8]
Implementations
[edit | edit source]- Susa framework implements BCJR algorithm for forward error correction codes and channel equalization in C++.
See also
[edit | edit source]References
[edit | edit source]- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
External links
[edit | edit source]- The online textbook: Information Theory, Inference, and Learning Algorithms, by David J.C. MacKay, discusses the BCJR algorithm in chapter 25.
- The implementation of BCJR algorithm in Susa signal processing framework