# ldpc Low-Density Parity-Check codes with belief propagation decoding. `ldpc` implements the CCSDS [131.0-B-4][ccsds] AR4JA (Accumulate-Repeat-4-Jagged-Accumulate) family: circulant-based parity-check matrices, systematic encoding, and sum-product belief propagation decoding. Ships with the `rate_1_2` preset (k=1024 information bits, n=2048 transmitted bits) used on near-Earth and deep-space links. [ccsds]: https://public.ccsds.org/Pubs/131x0b4.pdf ## Installation Install with opam: ```sh $ opam install ldpc ``` If opam cannot find the package, it may not yet be released in the public `opam-repository`. Add the overlay repository, then install it: ```sh $ opam repo add samoht https://tangled.org/gazagnaire.org/opam-overlay.git $ opam update $ opam install ldpc ``` ## Usage The rate-1/2 code takes `k/8 = 128` data bytes and emits `n/8 = 256` codeword bytes: ```ocaml # let data = Bytes.make 128 '\x5a' in let codeword = Ldpc.encode Ldpc.ccsds_rate_1_2 data in Bytes.length codeword - : int = 256 ``` Belief-propagation decoding recovers the data from a corrupted codeword. `max_iter` caps the number of sum-product iterations (default 50): ```ocaml # let data = Bytes.make 128 '\x5a' in let codeword = Ldpc.encode Ldpc.ccsds_rate_1_2 data in (* Flip a handful of bits. *) for i = 0 to 7 do Bytes.set_uint8 codeword (i * 17) (Bytes.get_uint8 codeword (i * 17) lxor 0x80) done; match Ldpc.decode ~max_iter:50 Ldpc.ccsds_rate_1_2 codeword with | Ok recovered -> Bytes.equal recovered data | Error _ -> false - : bool = true ``` ## Licence ISC