Files
libfec/code.h
T
2026-06-22 11:39:50 +03:00

183 lines
4.3 KiB
C

#define MCQLI24 1 // used by ICE
//#define RJ1 1
//#define RJ2 1
//#define BJ24 1
//#define MJ 1
//#define MCQLI24 1 // k=24 r=1/2 code for ICE
//#define JQLIODP48 1
//#define MCQLI48 1
//#define OT24 1
//#define QR24 1
//#define LL 1
//#define J60 1
//#define J50 1
//#define MCQLI32 1 // NASA standard
//#define JP24 1
//#define JSODP47 1
//#define BLLF47 1
// Convolutional coding polynomials. All are rate 1/2
#if defined(MCQLI32)
//"NASA standard" code by Massey & Costello
// Shortened from MCQLI-48:
// Nonsystematic, quick look-in, dmin=11, dfree=23
// used on Pioneer 10-12, Helios A,B
#define POLY1 0xbbef6bb7 // 111 011 011 101 011 011 110 111 110 111 010 = 73353367672
#define POLY2 0xbbef6bb5 // 101 011 011 101 011 011 110 111 110 111 010 = 53353367672
#define K 32
#define G1FLIP 0
#define G2FLIP 0
#elif defined(MJ)
// Massey-Johannesson code
// Nonsystematic, quick look-in, dmin=13, dfree>=23
// Purported to be more computationally efficient than Massey-Costello
// Appears related to 1JQLIODP-24
#define POLY1 0xb840a20f // 111 100 000 100 010 100 000 010 000 111 010 = 74042402072
#define POLY2 0xb840a20d // 101 100 000 100 010 100 000 010 000 111 010 = 54042402072
#define K 32
#define G1FLIP 0
#define G2FLIP 0
#elif defined(LL)
// Layland-Lushbaugh code
// Nonsystematic, non-quick look-in, dmin=?, dfree=?
#define POLY1 0xf2d05351 // 100 010 101 100 101 000 001 011 010 011 110 = 42545013236
#define POLY2 0xe4613c47 // 111 000 100 011 110 010 000 110 001 001 110 = 70436206116
#define K 32
#define G1FLIP 0
#define G2FLIP 0
#elif defined(MCQLI24)
// MCQLI-24
// k=24 r=1/2 Massey QLI code for ISEE-3/International Comet Explorer
// The ref gives the polynomials as 073353367 and 053353367 (octal)
// Shortened from MCQLI-48
#define POLY1 073665667
#define POLY2 073665665
#define K 24
#define G1FLIP 0
#define G2FLIP 1 // Invert the second symbol
// 1JQLIODP-24
// Johannassen QLI ODP k=24
#elif defined(RJ1)
#define POLY1 074121017
#define POLY2 074121015
#define K 24
#define G1FLIP 0
#define G2FLIP 0
// 2JQLIODP-24
// Johannassen QLI ODP k=24
#elif defined(RJ2)
#define POLY1 073541017
#define POLY2 073541015
#define K 24
#define G1FLIP 0
#define G2FLIP 0
// BJ-24
// Bahl-Jelinek k=24 complementary code
#elif defined(BJ24)
#define POLY1 054220245
#define POLY2 063557533
#define K 24
#define G1FLIP 0
#define G2FLIP 0
// QR-24 code
// Massey, Costello, Justesen Quadratic k=24 residue code
#elif defined(QR24)
#define POLY1 026241177
#define POLY2 037620515
#define K 24
#define G1FLIP 0
#define G2FLIP 0
// OT-24
// Massey k=24 optimally truncatable code
#elif defined(OT24)
#define POLY1 062650457
#define POLY2 062650455
#define K 24
#define G1FLIP 0
#define G2FLIP 0
// MCQLI-48
// Massey-Costelli QLI code k=48
#elif defined(MCQLI48)
#define POLY1 06556767373665667LL
#define POLY2 06556767373665665LL
#define K 48
#define G1FLIP 0
#define G2FLIP 0
// JQLIODP-48
// Johannesson QLI ODP code with k=48
#elif defined(JQLIODP48)
#define POLY1 05634247020121017LL
#define POLY2 05634247020121015LL
#define K 48
#define G1FLIP 0
#define G2FLIP 0
//BLLF-47
// Bussgang, Lin, Lynn, Forney k=47
// Systematic
#elif defined(BLLF47)
#define POLY1 1
#define POLY2 0531746407671547LL
#define K 45
#define G1FLIP 0
#define G2FLIP 0
// JSODP-47
// Johannesson's ODP k=47
// Systematic
#elif defined(JSODP47)
#define POLY1 1
#define POLY2 03331355751514473LL
#define K 47
#define G1FLIP 0
#define G2FLIP 0
// JP-24
// Mentioned in addendum to Massey
// Non-QLI, non-systematic
#elif defined (JP24)
#define POLY1 052431655
#define POLY2 061411757
#define K 24
#define G1FLIP 0
#define G2FLIP 0
// Monster k=60 Johannesson systematic
#elif defined (J60)
#define POLY1 1
#define POLY2 073607331355751514473LL
#define K 60
#define G1FLIP 0
#define G2FLIP 0
// Monster k=50 Johannesson QLI
#elif defined (J50)
#define POLY1 075634247020121017
#define POLY2 075634247020121015
#define K 50
#define G1FLIP 0
#define G2FLIP 0
#endif
int encode(
unsigned char *symbols, // Output buffer, 2*8*nbytes
const unsigned char *data, // Input buffer, nbytes
unsigned int nbytes); // Number of bytes in data