308 lines
7.7 KiB
C
308 lines
7.7 KiB
C
#include <stdint.h>
|
|
|
|
// LDPC(174,87) parameters from WSJT-X.
|
|
// this is an indirection table that moves a
|
|
// codeword's 87 systematic (message) bits to the end.
|
|
uint8_t colorder[] = {
|
|
0, 1, 2, 3, 30, 4, 5, 6, 7, 8, 9, 10, 11, 32, 12, 40, 13, 14, 15, 16,
|
|
17, 18, 37, 45, 29, 19, 20, 21, 41, 22, 42, 31, 33, 34, 44, 35, 47,
|
|
51, 50, 43, 36, 52, 63, 46, 25, 55, 27, 24, 23, 53, 39, 49, 59, 38,
|
|
48, 61, 60, 57, 28, 62, 56, 58, 65, 66, 26, 70, 64, 69, 68, 67, 74,
|
|
71, 54, 76, 72, 75, 78, 77, 80, 79, 73, 83, 84, 81, 82, 85, 86, 87,
|
|
88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,
|
|
104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
|
|
118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
|
|
132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145,
|
|
146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
|
|
160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173
|
|
};
|
|
|
|
// this is the LDPC(174,87) parity check matrix.
|
|
// 87 rows.
|
|
// each row describes one parity check.
|
|
// each number is an index into the codeword (1-origin).
|
|
// the codeword bits mentioned in each row must xor to zero.
|
|
// From WSJT-X's bpdecode174.f90.
|
|
uint8_t Nm[][7] = {
|
|
{1, 30, 60, 89, 118, 147, 0},
|
|
{2, 31, 61, 90, 119, 147, 0},
|
|
{3, 32, 62, 91, 120, 148, 0},
|
|
{4, 33, 63, 92, 121, 149, 0},
|
|
{2, 34, 64, 93, 122, 150, 0},
|
|
{5, 33, 65, 94, 123, 148, 0},
|
|
{6, 34, 66, 95, 124, 151, 0},
|
|
{7, 35, 67, 96, 120, 152, 0},
|
|
{8, 36, 68, 97, 125, 153, 0},
|
|
{9, 37, 69, 98, 126, 152, 0},
|
|
{10, 38, 70, 99, 127, 154, 0},
|
|
{11, 39, 71, 100, 126, 155, 0},
|
|
{12, 40, 61, 101, 128, 145, 0},
|
|
{10, 33, 60, 95, 128, 156, 0},
|
|
{13, 41, 72, 97, 126, 157, 0},
|
|
{13, 42, 73, 90, 129, 156, 0},
|
|
{14, 39, 74, 99, 130, 158, 0},
|
|
{15, 43, 75, 102, 131, 159, 0},
|
|
{16, 43, 71, 103, 118, 160, 0},
|
|
{17, 44, 76, 98, 130, 156, 0},
|
|
{18, 45, 60, 96, 132, 161, 0},
|
|
{19, 46, 73, 83, 133, 162, 0},
|
|
{12, 38, 77, 102, 134, 163, 0},
|
|
{19, 47, 78, 104, 135, 147, 0},
|
|
{1, 32, 77, 105, 136, 164, 0},
|
|
{20, 48, 73, 106, 123, 163, 0},
|
|
{21, 41, 79, 107, 137, 165, 0},
|
|
{22, 42, 66, 108, 138, 152, 0},
|
|
{18, 42, 80, 109, 139, 154, 0},
|
|
{23, 49, 81, 110, 135, 166, 0},
|
|
{16, 50, 82, 91, 129, 158, 0},
|
|
{3, 48, 63, 107, 124, 167, 0},
|
|
{6, 51, 67, 111, 134, 155, 0},
|
|
{24, 35, 77, 100, 122, 162, 0},
|
|
{20, 45, 76, 112, 140, 157, 0},
|
|
{21, 36, 64, 92, 130, 159, 0},
|
|
{8, 52, 83, 111, 118, 166, 0},
|
|
{21, 53, 84, 113, 138, 168, 0},
|
|
{25, 51, 79, 89, 122, 158, 0},
|
|
{22, 44, 75, 107, 133, 155, 172},
|
|
{9, 54, 84, 90, 141, 169, 0},
|
|
{22, 54, 85, 110, 136, 161, 0},
|
|
{8, 37, 65, 102, 129, 170, 0},
|
|
{19, 39, 85, 114, 139, 150, 0},
|
|
{26, 55, 71, 93, 142, 167, 0},
|
|
{27, 56, 65, 96, 133, 160, 174},
|
|
{28, 31, 86, 100, 117, 171, 0},
|
|
{28, 52, 70, 104, 132, 144, 0},
|
|
{24, 57, 68, 95, 137, 142, 0},
|
|
{7, 30, 72, 110, 143, 151, 0},
|
|
{4, 51, 76, 115, 127, 168, 0},
|
|
{16, 45, 87, 114, 125, 172, 0},
|
|
{15, 30, 86, 115, 123, 150, 0},
|
|
{23, 46, 64, 91, 144, 173, 0},
|
|
{23, 35, 75, 113, 145, 153, 0},
|
|
{14, 41, 87, 108, 117, 149, 170},
|
|
{25, 40, 85, 94, 124, 159, 0},
|
|
{25, 58, 69, 116, 143, 174, 0},
|
|
{29, 43, 61, 116, 132, 162, 0},
|
|
{15, 58, 88, 112, 121, 164, 0},
|
|
{4, 59, 72, 114, 119, 163, 173},
|
|
{27, 47, 86, 98, 134, 153, 0},
|
|
{5, 44, 78, 109, 141, 0, 0},
|
|
{10, 46, 69, 103, 136, 165, 0},
|
|
{9, 50, 59, 93, 128, 164, 0},
|
|
{14, 57, 58, 109, 120, 166, 0},
|
|
{17, 55, 62, 116, 125, 154, 0},
|
|
{3, 54, 70, 101, 140, 170, 0},
|
|
{1, 36, 82, 108, 127, 174, 0},
|
|
{5, 53, 81, 105, 140, 0, 0},
|
|
{29, 53, 67, 99, 142, 173, 0},
|
|
{18, 49, 74, 97, 115, 167, 0},
|
|
{2, 57, 63, 103, 138, 157, 0},
|
|
{26, 38, 79, 112, 135, 171, 0},
|
|
{11, 52, 66, 88, 119, 148, 0},
|
|
{20, 40, 68, 117, 141, 160, 0},
|
|
{11, 48, 81, 89, 146, 169, 0},
|
|
{29, 47, 80, 92, 146, 172, 0},
|
|
{6, 32, 87, 104, 145, 169, 0},
|
|
{27, 34, 74, 106, 131, 165, 0},
|
|
{12, 56, 84, 88, 139, 0, 0},
|
|
{13, 56, 62, 111, 146, 171, 0},
|
|
{26, 37, 80, 105, 144, 151, 0},
|
|
{17, 31, 82, 113, 121, 161, 0},
|
|
{28, 49, 59, 94, 137, 0, 0},
|
|
{7, 55, 83, 101, 131, 168, 0},
|
|
{24, 50, 78, 106, 143, 149, 0},
|
|
};
|
|
|
|
// Mn from WSJT-X's bpdecode174.f90.
|
|
// each row corresponds to a codeword bit.
|
|
// the numbers indicate which three parity
|
|
// checks (rows in Nm) refer to the codeword bit.
|
|
// 1-origin.
|
|
uint8_t Mn[][3] = {
|
|
{1, 25, 69},
|
|
{2, 5, 73},
|
|
{3, 32, 68},
|
|
{4, 51, 61},
|
|
{6, 63, 70},
|
|
{7, 33, 79},
|
|
{8, 50, 86},
|
|
{9, 37, 43},
|
|
{10, 41, 65},
|
|
{11, 14, 64},
|
|
{12, 75, 77},
|
|
{13, 23, 81},
|
|
{15, 16, 82},
|
|
{17, 56, 66},
|
|
{18, 53, 60},
|
|
{19, 31, 52},
|
|
{20, 67, 84},
|
|
{21, 29, 72},
|
|
{22, 24, 44},
|
|
{26, 35, 76},
|
|
{27, 36, 38},
|
|
{28, 40, 42},
|
|
{30, 54, 55},
|
|
{34, 49, 87},
|
|
{39, 57, 58},
|
|
{45, 74, 83},
|
|
{46, 62, 80},
|
|
{47, 48, 85},
|
|
{59, 71, 78},
|
|
{1, 50, 53},
|
|
{2, 47, 84},
|
|
{3, 25, 79},
|
|
{4, 6, 14},
|
|
{5, 7, 80},
|
|
{8, 34, 55},
|
|
{9, 36, 69},
|
|
{10, 43, 83},
|
|
{11, 23, 74},
|
|
{12, 17, 44},
|
|
{13, 57, 76},
|
|
{15, 27, 56},
|
|
{16, 28, 29},
|
|
{18, 19, 59},
|
|
{20, 40, 63},
|
|
{21, 35, 52},
|
|
{22, 54, 64},
|
|
{24, 62, 78},
|
|
{26, 32, 77},
|
|
{30, 72, 85},
|
|
{31, 65, 87},
|
|
{33, 39, 51},
|
|
{37, 48, 75},
|
|
{38, 70, 71},
|
|
{41, 42, 68},
|
|
{45, 67, 86},
|
|
{46, 81, 82},
|
|
{49, 66, 73},
|
|
{58, 60, 66},
|
|
{61, 65, 85},
|
|
{1, 14, 21},
|
|
{2, 13, 59},
|
|
{3, 67, 82},
|
|
{4, 32, 73},
|
|
{5, 36, 54},
|
|
{6, 43, 46},
|
|
{7, 28, 75},
|
|
{8, 33, 71},
|
|
{9, 49, 76},
|
|
{10, 58, 64},
|
|
{11, 48, 68},
|
|
{12, 19, 45},
|
|
{15, 50, 61},
|
|
{16, 22, 26},
|
|
{17, 72, 80},
|
|
{18, 40, 55},
|
|
{20, 35, 51},
|
|
{23, 25, 34},
|
|
{24, 63, 87},
|
|
{27, 39, 74},
|
|
{29, 78, 83},
|
|
{30, 70, 77},
|
|
{31, 69, 84},
|
|
{22, 37, 86},
|
|
{38, 41, 81},
|
|
{42, 44, 57},
|
|
{47, 53, 62},
|
|
{52, 56, 79},
|
|
{60, 75, 81},
|
|
{1, 39, 77},
|
|
{2, 16, 41},
|
|
{3, 31, 54},
|
|
{4, 36, 78},
|
|
{5, 45, 65},
|
|
{6, 57, 85},
|
|
{7, 14, 49},
|
|
{8, 21, 46},
|
|
{9, 15, 72},
|
|
{10, 20, 62},
|
|
{11, 17, 71},
|
|
{12, 34, 47},
|
|
{13, 68, 86},
|
|
{18, 23, 43},
|
|
{19, 64, 73},
|
|
{24, 48, 79},
|
|
{25, 70, 83},
|
|
{26, 80, 87},
|
|
{27, 32, 40},
|
|
{28, 56, 69},
|
|
{29, 63, 66},
|
|
{30, 42, 50},
|
|
{33, 37, 82},
|
|
{35, 60, 74},
|
|
{38, 55, 84},
|
|
{44, 52, 61},
|
|
{51, 53, 72},
|
|
{58, 59, 67},
|
|
{47, 56, 76},
|
|
{1, 19, 37},
|
|
{2, 61, 75},
|
|
{3, 8, 66},
|
|
{4, 60, 84},
|
|
{5, 34, 39},
|
|
{6, 26, 53},
|
|
{7, 32, 57},
|
|
{9, 52, 67},
|
|
{10, 12, 15},
|
|
{11, 51, 69},
|
|
{13, 14, 65},
|
|
{16, 31, 43},
|
|
{17, 20, 36},
|
|
{18, 80, 86},
|
|
{21, 48, 59},
|
|
{22, 40, 46},
|
|
{23, 33, 62},
|
|
{24, 30, 74},
|
|
{25, 42, 64},
|
|
{27, 49, 85},
|
|
{28, 38, 73},
|
|
{29, 44, 81},
|
|
{35, 68, 70},
|
|
{41, 63, 76},
|
|
{45, 49, 71},
|
|
{50, 58, 87},
|
|
{48, 54, 83},
|
|
{13, 55, 79},
|
|
{77, 78, 82},
|
|
{1, 2, 24},
|
|
{3, 6, 75},
|
|
{4, 56, 87},
|
|
{5, 44, 53},
|
|
{7, 50, 83},
|
|
{8, 10, 28},
|
|
{9, 55, 62},
|
|
{11, 29, 67},
|
|
{12, 33, 40},
|
|
{14, 16, 20},
|
|
{15, 35, 73},
|
|
{17, 31, 39},
|
|
{18, 36, 57},
|
|
{19, 46, 76},
|
|
{21, 42, 84},
|
|
{22, 34, 59},
|
|
{23, 26, 61},
|
|
{25, 60, 65},
|
|
{27, 64, 80},
|
|
{30, 37, 66},
|
|
{32, 45, 72},
|
|
{38, 51, 86},
|
|
{41, 77, 79},
|
|
{43, 56, 68},
|
|
{47, 74, 82},
|
|
{40, 52, 78},
|
|
{54, 61, 71},
|
|
{46, 58, 69},
|
|
};
|
|
|
|
uint8_t nrw[] = {
|
|
6,6,6,6,6,6,6,6,6,6,
|
|
6,6,6,6,6,6,6,6,6,6,
|
|
6,6,6,6,6,6,6,6,6,6,
|
|
6,6,6,6,6,6,6,6,6,7,
|
|
6,6,6,6,6,7,6,6,6,6,
|
|
6,6,6,6,6,7,6,6,6,6,
|
|
7,6,5,6,6,6,6,6,6,5,
|
|
6,6,6,6,6,6,6,6,6,6,
|
|
5,6,6,6,5,6,6
|
|
};
|