subroutine bpdecode300(llr,apmask,maxiterations,decoded,niterations,cw) ! A log-domain belief propagation decoder for the (300,60) code. integer, parameter:: N=300, K=60, M=N-K integer*1 codeword(N),cw(N),apmask(N) integer colorder(N) integer*1 decoded(K) integer Nm(5,M) ! 4, or 5 bits per check integer Mn(7,N) ! 2, 3, or 7 checks per bit integer synd(M) real tov(7,N) real toc(5,M) real tanhtoc(5,M) real zn(N) real llr(N) real Tmn integer nrw(M) integer ncw(N) data colorder/ & 0,1,2,3,4,5,6,7,8,9,10,11,123,12,13,14,15,16,17,18, & 19,20,21,22,23,24,25,138,26,145,27,28,29,30,31,32,33,34,35,36, & 37,154,38,39,40,41,42,43,44,144,46,47,48,49,50,51,52,53,143,54, & 125,56,57,58,124,59,120,140,157,160,55,60,61,62,156,162,141,64,65,153, & 181,183,66,170,67,68,69,130,70,164,71,72,73,74,75,63,76,77,135,78, & 79,80,176,169,82,83,84,167,180,85,136,158,129,166,175,142,134,146,121,165, & 88,89,192,90,45,91,92,93,182,189,94,95,96,173,81,97,98,178,122,126, & 132,99,100,152,186,193,101,102,151,103,104,172,159,168,150,190,147,148,201,107, & 205,177,108,198,197,174,127,109,185,110,202,87,199,171,179,187,139,137,106,131, & 206,194,112,149,155,113,128,184,196,86,114,203,212,195,208,105,188,161,163,191, & 200,209,214,204,115,218,133,111,207,117,213,216,211,217,116,215,219,220,210,221, & 118,222,223,225,224,228,226,229,231,227,233,119,234,235,232,230,237,239,236,238, & 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259, & 260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279, & 280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299/ data Mn/ & 1, 67, 0, 0, 0, 0, 0, & 2, 189, 0, 0, 0, 0, 0, & 3, 201, 0, 0, 0, 0, 0, & 4, 13, 0, 0, 0, 0, 0, & 5, 84, 0, 0, 0, 0, 0, & 6, 188, 0, 0, 0, 0, 0, & 7, 140, 0, 0, 0, 0, 0, & 8, 167, 0, 0, 0, 0, 0, & 9, 187, 0, 0, 0, 0, 0, & 10, 173, 0, 0, 0, 0, 0, & 11, 88, 0, 0, 0, 0, 0, & 12, 213, 0, 0, 0, 0, 0, & 14, 141, 0, 0, 0, 0, 0, & 15, 236, 0, 0, 0, 0, 0, & 16, 117, 0, 0, 0, 0, 0, & 17, 99, 0, 0, 0, 0, 0, & 18, 111, 0, 0, 0, 0, 0, & 19, 178, 0, 0, 0, 0, 0, & 20, 28, 0, 0, 0, 0, 0, & 21, 177, 0, 0, 0, 0, 0, & 22, 199, 0, 0, 0, 0, 0, & 23, 209, 0, 0, 0, 0, 0, & 24, 220, 0, 0, 0, 0, 0, & 25, 59, 0, 0, 0, 0, 0, & 26, 224, 0, 0, 0, 0, 0, & 27, 30, 0, 0, 0, 0, 0, & 29, 157, 0, 0, 0, 0, 0, & 31, 184, 0, 0, 0, 0, 0, & 32, 179, 0, 0, 0, 0, 0, & 33, 149, 0, 0, 0, 0, 0, & 34, 144, 0, 0, 0, 0, 0, & 35, 80, 0, 0, 0, 0, 0, & 36, 228, 0, 0, 0, 0, 0, & 37, 185, 0, 0, 0, 0, 0, & 38, 197, 0, 0, 0, 0, 0, & 39, 69, 0, 0, 0, 0, 0, & 40, 42, 0, 0, 0, 0, 0, & 41, 112, 0, 0, 0, 0, 0, & 43, 70, 0, 0, 0, 0, 0, & 44, 198, 0, 0, 0, 0, 0, & 45, 76, 0, 0, 0, 0, 0, & 46, 68, 0, 0, 0, 0, 0, & 47, 90, 0, 0, 0, 0, 0, & 48, 75, 0, 0, 0, 0, 0, & 49, 118, 0, 0, 0, 0, 0, & 50, 125, 0, 0, 0, 0, 0, & 51, 114, 0, 0, 0, 0, 0, & 52, 239, 0, 0, 0, 0, 0, & 53, 108, 0, 0, 0, 0, 0, & 54, 120, 0, 0, 0, 0, 0, & 55, 162, 0, 0, 0, 0, 0, & 56, 218, 0, 0, 0, 0, 0, & 57, 138, 0, 0, 0, 0, 0, & 58, 212, 0, 0, 0, 0, 0, & 60, 207, 0, 0, 0, 0, 0, & 61, 71, 0, 0, 0, 0, 0, & 62, 65, 0, 0, 0, 0, 0, & 63, 161, 0, 0, 0, 0, 0, & 64, 166, 0, 0, 0, 0, 0, & 66, 158, 0, 0, 0, 0, 0, & 72, 235, 0, 0, 0, 0, 0, & 73, 225, 0, 0, 0, 0, 0, & 74, 116, 0, 0, 0, 0, 0, & 77, 96, 0, 0, 0, 0, 0, & 78, 81, 0, 0, 0, 0, 0, & 79, 82, 0, 0, 0, 0, 0, & 83, 229, 0, 0, 0, 0, 0, & 85, 134, 0, 0, 0, 0, 0, & 86, 176, 0, 0, 0, 0, 0, & 87, 203, 0, 0, 0, 0, 0, & 89, 145, 0, 0, 0, 0, 0, & 91, 152, 0, 0, 0, 0, 0, & 92, 237, 0, 0, 0, 0, 0, & 93, 215, 0, 0, 0, 0, 0, & 94, 130, 0, 0, 0, 0, 0, & 95, 156, 0, 0, 0, 0, 0, & 97, 104, 0, 0, 0, 0, 0, & 98, 182, 0, 0, 0, 0, 0, & 100, 222, 0, 0, 0, 0, 0, & 101, 123, 0, 0, 0, 0, 0, & 102, 181, 0, 0, 0, 0, 0, & 103, 135, 0, 0, 0, 0, 0, & 105, 146, 0, 0, 0, 0, 0, & 106, 115, 0, 0, 0, 0, 0, & 107, 109, 0, 0, 0, 0, 0, & 110, 194, 0, 0, 0, 0, 0, & 113, 164, 0, 0, 0, 0, 0, & 119, 172, 0, 0, 0, 0, 0, & 121, 190, 0, 0, 0, 0, 0, & 122, 169, 0, 0, 0, 0, 0, & 124, 211, 0, 0, 0, 0, 0, & 126, 165, 0, 0, 0, 0, 0, & 127, 139, 0, 0, 0, 0, 0, & 128, 129, 0, 0, 0, 0, 0, & 131, 205, 0, 0, 0, 0, 0, & 132, 196, 0, 0, 0, 0, 0, & 133, 193, 0, 0, 0, 0, 0, & 136, 200, 0, 0, 0, 0, 0, & 137, 159, 0, 0, 0, 0, 0, & 142, 204, 0, 0, 0, 0, 0, & 143, 154, 0, 0, 0, 0, 0, & 147, 238, 0, 0, 0, 0, 0, & 148, 175, 0, 0, 0, 0, 0, & 150, 216, 0, 0, 0, 0, 0, & 151, 171, 0, 0, 0, 0, 0, & 153, 231, 0, 0, 0, 0, 0, & 155, 208, 0, 0, 0, 0, 0, & 160, 230, 0, 0, 0, 0, 0, & 163, 223, 0, 0, 0, 0, 0, & 168, 217, 0, 0, 0, 0, 0, & 170, 180, 0, 0, 0, 0, 0, & 174, 233, 0, 0, 0, 0, 0, & 183, 202, 0, 0, 0, 0, 0, & 186, 214, 0, 0, 0, 0, 0, & 191, 206, 0, 0, 0, 0, 0, & 192, 219, 0, 0, 0, 0, 0, & 195, 227, 0, 0, 0, 0, 0, & 210, 226, 0, 0, 0, 0, 0, & 221, 234, 0, 0, 0, 0, 0, & 232, 240, 0, 0, 0, 0, 0, & 1, 106, 0, 0, 0, 0, 0, & 2, 119, 0, 0, 0, 0, 0, & 3, 139, 0, 0, 0, 0, 0, & 4, 14, 0, 0, 0, 0, 0, & 5, 65, 0, 0, 0, 0, 0, & 6, 61, 0, 0, 0, 0, 0, & 7, 223, 0, 0, 0, 0, 0, & 8, 171, 0, 0, 0, 0, 0, & 9, 136, 0, 0, 0, 0, 0, & 10, 113, 0, 0, 0, 0, 0, & 11, 104, 0, 0, 0, 0, 0, & 12, 175, 0, 0, 0, 0, 0, & 13, 203, 0, 0, 0, 0, 0, & 15, 149, 0, 0, 0, 0, 0, & 16, 226, 0, 0, 0, 0, 0, & 17, 219, 0, 0, 0, 0, 0, & 18, 98, 0, 0, 0, 0, 0, & 19, 211, 0, 0, 0, 0, 0, & 20, 49, 0, 0, 0, 0, 0, & 21, 214, 0, 0, 0, 0, 0, & 22, 68, 0, 0, 0, 0, 0, & 23, 77, 0, 0, 0, 0, 0, & 24, 116, 0, 0, 0, 0, 0, & 25, 235, 0, 0, 0, 0, 0, & 26, 50, 0, 0, 0, 0, 0, & 27, 124, 0, 0, 0, 0, 0, & 28, 229, 0, 0, 0, 0, 0, & 29, 83, 0, 0, 0, 0, 0, & 30, 158, 0, 0, 0, 0, 0, & 31, 220, 0, 0, 0, 0, 0, & 32, 155, 0, 0, 0, 0, 0, & 33, 152, 0, 0, 0, 0, 0, & 34, 231, 0, 0, 0, 0, 0, & 35, 207, 0, 0, 0, 0, 0, & 36, 40, 0, 0, 0, 0, 0, & 37, 142, 0, 0, 0, 0, 0, & 38, 75, 0, 0, 0, 0, 0, & 39, 90, 167, 0, 0, 0, 0, & 41, 55, 125, 0, 0, 0, 0, & 42, 153, 196, 0, 0, 0, 0, & 43, 72, 112, 0, 0, 0, 0, & 44, 183, 233, 0, 0, 0, 0, & 45, 81, 178, 0, 0, 0, 0, & 46, 187, 230, 0, 0, 0, 0, & 47, 133, 176, 0, 0, 0, 0, & 48, 54, 186, 0, 0, 0, 0, & 51, 150, 224, 0, 0, 0, 0, & 52, 53, 190, 0, 0, 0, 0, & 56, 143, 228, 0, 0, 0, 0, & 57, 97, 197, 0, 0, 0, 0, & 58, 62, 89, 0, 0, 0, 0, & 59, 174, 194, 0, 0, 0, 0, & 60, 91, 93, 0, 0, 0, 0, & 63, 85, 96, 0, 0, 0, 0, & 64, 92, 205, 0, 0, 0, 0, & 66, 67, 164, 0, 0, 0, 0, & 69, 103, 159, 0, 0, 0, 0, & 70, 117, 122, 0, 0, 0, 0, & 71, 88, 160, 0, 0, 0, 0, & 73, 148, 180, 0, 0, 0, 0, & 74, 108, 109, 0, 0, 0, 0, & 76, 102, 151, 0, 0, 0, 0, & 78, 128, 206, 0, 0, 0, 0, & 79, 215, 239, 0, 0, 0, 0, & 80, 138, 221, 0, 0, 0, 0, & 82, 162, 195, 0, 0, 0, 0, & 84, 161, 184, 0, 0, 0, 0, & 86, 213, 218, 0, 0, 0, 0, & 87, 120, 240, 0, 0, 0, 0, & 94, 100, 157, 0, 0, 0, 0, & 95, 202, 217, 0, 0, 0, 0, & 99, 199, 201, 0, 0, 0, 0, & 101, 127, 225, 0, 0, 0, 0, & 105, 168, 185, 0, 0, 0, 0, & 107, 182, 237, 0, 0, 0, 0, & 110, 147, 208, 0, 0, 0, 0, & 111, 118, 172, 0, 0, 0, 0, & 114, 140, 165, 0, 0, 0, 0, & 115, 130, 141, 0, 0, 0, 0, & 121, 144, 173, 0, 0, 0, 0, & 123, 204, 209, 0, 0, 0, 0, & 126, 137, 188, 0, 0, 0, 0, & 129, 179, 189, 0, 0, 0, 0, & 131, 192, 210, 0, 0, 0, 0, & 132, 200, 238, 0, 0, 0, 0, & 134, 177, 191, 0, 0, 0, 0, & 135, 145, 222, 0, 0, 0, 0, & 146, 229, 236, 0, 0, 0, 0, & 154, 169, 232, 0, 0, 0, 0, & 124, 156, 163, 0, 0, 0, 0, & 166, 223, 234, 0, 0, 0, 0, & 1, 11, 170, 0, 0, 0, 0, & 3, 181, 227, 0, 0, 0, 0, & 193, 198, 220, 0, 0, 0, 0, & 10, 16, 212, 0, 0, 0, 0, & 42, 96, 216, 0, 0, 0, 0, & 2, 6, 215, 0, 0, 0, 0, & 4, 208, 219, 0, 0, 0, 0, & 5, 22, 35, 0, 0, 0, 0, & 7, 12, 20, 0, 0, 0, 0, & 8, 15, 75, 0, 0, 0, 0, & 9, 74, 83, 0, 0, 0, 0, & 13, 37, 50, 0, 0, 0, 0, & 14, 52, 86, 0, 0, 0, 0, & 17, 30, 177, 0, 0, 0, 0, & 18, 25, 97, 0, 0, 0, 0, & 19, 72, 157, 0, 0, 0, 0, & 21, 58, 116, 0, 0, 0, 0, & 23, 111, 226, 0, 0, 0, 0, & 24, 26, 180, 0, 0, 0, 0, & 27, 34, 39, 0, 0, 0, 0, & 28, 32, 161, 0, 0, 0, 0, & 29, 36, 60, 0, 0, 0, 0, & 31, 76, 154, 0, 0, 0, 0, & 33, 101, 238, 0, 0, 0, 0, & 38, 95, 162, 0, 0, 0, 0, & 40, 164, 183, 0, 0, 0, 0, & 41, 92, 196, 0, 0, 0, 0, & 43, 48, 99, 165, 190, 198, 204, & 44, 129, 138, 145, 160, 203, 237, & 45, 65, 66, 98, 127, 137, 146, & 46, 131, 149, 181, 211, 218, 224, & 47, 49, 55, 191, 194, 207, 232, & 51, 69, 106, 109, 119, 184, 217, & 53, 62, 104, 155, 166, 206, 231, & 54, 61, 63, 73, 118, 151, 163, & 56, 94, 110, 117, 185, 189, 214, & 57, 81, 91, 115, 173, 175, 227, & 59, 79, 103, 136, 171, 201, 212, & 24, 64, 77, 93, 202, 235, 236, & 67, 132, 142, 150, 156, 176, 222, & 68, 153, 159, 169, 170, 186, 221, & 70, 84, 89, 113, 174, 197, 205, & 71, 125, 130, 140, 158, 200, 210, & 8, 78, 143, 182, 192, 193, 216, & 23, 80, 82, 90, 108, 139, 228, & 85, 122, 123, 128, 141, 187, 188, & 25, 87, 100, 152, 209, 213, 234, & 88, 134, 147, 167, 172, 178, 239, & 18, 40, 102, 114, 133, 144, 179, & 4, 105, 108, 112, 148, 230, 240, & 29, 33, 50, 62, 107, 195, 199, & 3, 83, 113, 120, 126, 177, 216, & 11, 55, 116, 121, 135, 168, 225, & 1, 27, 28, 76, 187, 226, 233, & 2, 4, 7, 10, 22, 75, 222, & 5, 30, 131, 152, 156, 168, 215, & 6, 13, 19, 58, 196, 228, 229, & 9, 26, 144, 147, 158, 223, 240, & 12, 31, 66, 79, 92, 96, 155, & 14, 54, 103, 173, 202, 232, 238, & 15, 17, 37, 69, 129, 164, 209, & 16, 72, 91, 114, 163, 169, 237, & 20, 45, 89, 99, 143, 180, 208, & 21, 39, 60, 141, 171, 198, 234, & 21, 32, 52, 78, 95, 148, 199, & 34, 73, 84, 157, 200, 221, 236, & 35, 36, 63, 97, 105, 119, 220, & 38, 46, 93, 111, 136, 191, 203, & 41, 51, 151, 160, 213, 214, 231, & 42, 57, 65, 161, 167, 194, 204, & 43, 109, 162, 175, 189, 210, 212, & 44, 74, 100, 149, 170, 188, 197, & 47, 64, 88, 107, 122, 165, 211, & 48, 139, 179, 184, 218, 233, 239, & 49, 94, 106, 112, 138, 142, 205, & 53, 59, 102, 115, 134, 182, 225, & 56, 68, 101, 150, 166, 178, 207, & 61, 117, 126, 154, 195, 219, 224, & 67, 80, 118, 174, 185, 190, 235, & 70, 77, 86, 125, 153, 172, 193, & 32, 71, 87, 90, 98, 110, 135, & 41, 75, 81, 85, 124, 133, 201, & 82, 120, 128, 140, 159, 176, 183, & 22, 72, 104, 130, 146, 181, 217, & 25, 89, 96, 121, 132, 186, 230, & 118, 123, 145, 192, 196, 227, 240, & 1, 14, 35, 38, 114, 127, 192, & 7, 23, 43, 63, 116, 137, 206, & 2, 37, 52, 57, 64, 76, 120/ data Nm/ & 1, 121, 212, 265, 298, & 2, 122, 217, 266, 300, & 3, 123, 213, 263, 0, & 4, 124, 218, 261, 266, & 5, 125, 219, 267, 0, & 6, 126, 217, 268, 0, & 7, 127, 220, 266, 299, & 8, 128, 221, 255, 0, & 9, 129, 222, 269, 0, & 10, 130, 215, 266, 0, & 11, 131, 212, 264, 0, & 12, 132, 220, 270, 0, & 4, 133, 223, 268, 0, & 13, 124, 224, 271, 298, & 14, 134, 221, 272, 0, & 15, 135, 215, 273, 0, & 16, 136, 225, 272, 0, & 17, 137, 226, 260, 0, & 18, 138, 227, 268, 0, & 19, 139, 220, 274, 0, & 20, 140, 228, 275, 276, & 21, 141, 219, 266, 295, & 22, 142, 229, 256, 299, & 23, 143, 230, 250, 0, & 24, 144, 226, 258, 296, & 25, 145, 230, 269, 0, & 26, 146, 231, 265, 0, & 19, 147, 232, 265, 0, & 27, 148, 233, 262, 0, & 26, 149, 225, 267, 0, & 28, 150, 234, 270, 0, & 29, 151, 232, 276, 292, & 30, 152, 235, 262, 0, & 31, 153, 231, 277, 0, & 32, 154, 219, 278, 298, & 33, 155, 233, 278, 0, & 34, 156, 223, 272, 300, & 35, 157, 236, 279, 298, & 36, 158, 231, 275, 0, & 37, 155, 237, 260, 0, & 38, 159, 238, 280, 293, & 37, 160, 216, 281, 0, & 39, 161, 239, 282, 299, & 40, 162, 240, 283, 0, & 41, 163, 241, 274, 0, & 42, 164, 242, 279, 0, & 43, 165, 243, 284, 0, & 44, 166, 239, 285, 0, & 45, 139, 243, 286, 0, & 46, 145, 223, 262, 0, & 47, 167, 244, 280, 0, & 48, 168, 224, 276, 300, & 49, 168, 245, 287, 0, & 50, 166, 246, 271, 0, & 51, 159, 243, 264, 0, & 52, 169, 247, 288, 0, & 53, 170, 248, 281, 300, & 54, 171, 228, 268, 0, & 24, 172, 249, 287, 0, & 55, 173, 233, 275, 0, & 56, 126, 246, 289, 0, & 57, 171, 245, 262, 0, & 58, 174, 246, 278, 299, & 59, 175, 250, 284, 300, & 57, 125, 241, 281, 0, & 60, 176, 241, 270, 0, & 1, 176, 251, 290, 0, & 42, 141, 252, 288, 0, & 36, 177, 244, 272, 0, & 39, 178, 253, 291, 0, & 56, 179, 254, 292, 0, & 61, 161, 227, 273, 295, & 62, 180, 246, 277, 0, & 63, 181, 222, 283, 0, & 44, 157, 221, 266, 293, & 41, 182, 234, 265, 300, & 64, 142, 250, 291, 0, & 65, 183, 255, 276, 0, & 66, 184, 249, 270, 0, & 32, 185, 256, 290, 0, & 65, 163, 248, 293, 0, & 66, 186, 256, 294, 0, & 67, 148, 222, 263, 0, & 5, 187, 253, 277, 0, & 68, 174, 257, 293, 0, & 69, 188, 224, 291, 0, & 70, 189, 258, 292, 0, & 11, 179, 259, 284, 0, & 71, 171, 253, 274, 296, & 43, 158, 256, 292, 0, & 72, 173, 248, 273, 0, & 73, 175, 238, 270, 0, & 74, 173, 250, 279, 0, & 75, 190, 247, 286, 0, & 76, 191, 236, 276, 0, & 64, 174, 216, 270, 296, & 77, 170, 226, 278, 0, & 78, 137, 241, 292, 0, & 16, 192, 239, 274, 0, & 79, 190, 258, 283, 0, & 80, 193, 235, 288, 0, & 81, 182, 260, 287, 0, & 82, 177, 249, 271, 0, & 77, 131, 245, 295, 0, & 83, 194, 261, 278, 0, & 84, 121, 244, 286, 0, & 85, 195, 262, 284, 0, & 49, 181, 256, 261, 0, & 85, 181, 244, 282, 0, & 86, 196, 247, 292, 0, & 17, 197, 229, 279, 0, & 38, 161, 261, 286, 0, & 87, 130, 253, 263, 0, & 47, 198, 260, 273, 298, & 84, 199, 248, 287, 0, & 63, 143, 228, 264, 299, & 15, 178, 247, 289, 0, & 45, 197, 246, 290, 297, & 88, 122, 244, 278, 0, & 50, 189, 263, 294, 300, & 89, 200, 264, 296, 0, & 90, 178, 257, 284, 0, & 80, 201, 257, 297, 0, & 91, 146, 210, 293, 0, & 46, 159, 254, 291, 0, & 92, 202, 263, 289, 0, & 93, 193, 241, 298, 0, & 94, 183, 257, 294, 0, & 94, 203, 240, 272, 0, & 75, 199, 254, 295, 0, & 95, 204, 242, 267, 0, & 96, 205, 251, 296, 0, & 97, 165, 260, 293, 0, & 68, 206, 259, 287, 0, & 82, 207, 264, 292, 0, & 98, 129, 249, 279, 0, & 99, 202, 241, 299, 0, & 53, 185, 240, 286, 0, & 93, 123, 256, 285, 0, & 7, 198, 254, 294, 0, & 13, 199, 257, 275, 0, & 100, 156, 251, 286, 0, & 101, 169, 255, 274, 0, & 31, 200, 260, 269, 0, & 71, 207, 240, 297, 0, & 83, 208, 241, 295, 0, & 102, 196, 259, 269, 0, & 103, 180, 261, 276, 0, & 30, 134, 242, 283, 0, & 104, 167, 251, 288, 0, & 105, 182, 246, 280, 0, & 72, 152, 258, 267, 0, & 106, 160, 252, 291, 0, & 101, 209, 234, 289, 0, & 107, 151, 245, 270, 0, & 76, 210, 251, 267, 0, & 27, 190, 227, 277, 0, & 60, 149, 254, 269, 0, & 99, 177, 252, 294, 0, & 108, 179, 240, 280, 0, & 58, 187, 232, 281, 0, & 51, 186, 236, 282, 0, & 109, 210, 246, 273, 0, & 87, 176, 237, 272, 0, & 92, 198, 239, 284, 0, & 59, 211, 245, 288, 0, & 8, 158, 259, 281, 0, & 110, 194, 264, 267, 0, & 90, 209, 252, 273, 0, & 111, 212, 252, 283, 0, & 105, 128, 249, 275, 0, & 88, 197, 259, 291, 0, & 10, 200, 248, 271, 0, & 112, 172, 253, 290, 0, & 103, 132, 248, 282, 0, & 69, 165, 251, 294, 0, & 20, 206, 225, 263, 0, & 18, 163, 259, 288, 0, & 29, 203, 260, 285, 0, & 111, 180, 230, 274, 0, & 81, 213, 242, 295, 0, & 78, 195, 255, 287, 0, & 113, 162, 237, 294, 0, & 28, 187, 244, 285, 0, & 34, 194, 247, 290, 0, & 114, 166, 252, 296, 0, & 9, 164, 257, 265, 0, & 6, 202, 257, 283, 0, & 2, 203, 247, 282, 0, & 89, 168, 239, 290, 0, & 115, 206, 243, 279, 0, & 116, 204, 255, 297, 298, & 97, 214, 255, 291, 0, & 86, 172, 243, 281, 0, & 117, 186, 262, 289, 0, & 96, 160, 238, 268, 297, & 35, 170, 253, 283, 0, & 40, 214, 239, 275, 0, & 21, 192, 262, 276, 0, & 98, 205, 254, 277, 0, & 3, 192, 249, 293, 0, & 113, 191, 250, 271, 0, & 70, 133, 240, 279, 0, & 100, 201, 239, 281, 0, & 95, 175, 253, 286, 0, & 115, 183, 245, 299, 0, & 55, 154, 243, 288, 0, & 107, 196, 218, 274, 0, & 22, 201, 258, 272, 0, & 118, 204, 254, 282, 0, & 91, 138, 242, 284, 0, & 54, 215, 249, 282, 0, & 12, 188, 258, 280, 0, & 114, 140, 247, 280, 0, & 74, 184, 217, 267, 0, & 104, 216, 255, 263, 0, & 110, 191, 244, 295, 0, & 52, 188, 242, 285, 0, & 116, 136, 218, 289, 0, & 23, 150, 214, 278, 0, & 119, 185, 252, 277, 0, & 79, 207, 251, 266, 0, & 109, 127, 211, 269, 0, & 25, 167, 242, 289, 0, & 62, 193, 264, 287, 0, & 118, 135, 229, 265, 0, & 117, 213, 248, 297, 0, & 33, 169, 256, 268, 0, & 67, 147, 208, 268, 0, & 108, 164, 261, 296, 0, & 106, 153, 245, 280, 0, & 120, 209, 243, 271, 0, & 112, 162, 265, 285, 0, & 119, 211, 258, 275, 0, & 61, 144, 250, 290, 0, & 14, 208, 250, 277, 0, & 73, 195, 240, 273, 0, & 102, 205, 235, 271, 0, & 48, 184, 259, 285, 0, & 120, 189, 261, 269, 297/ data nrw/ & 5,5,4,5,4,4,5,4,4,4,4,4,4,5,4,4,4,4,4,4, & 5,5,5,4,5,4,4,4,4,4,4,5,4,4,5,4,5,5,4,4, & 5,4,5,4,4,4,4,4,4,4,4,5,4,4,4,4,5,4,4,4, & 4,4,5,5,4,4,4,4,4,4,4,5,4,4,5,5,4,4,4,4, & 4,4,4,4,4,4,4,4,5,4,4,4,4,4,4,5,4,4,4,4, & 4,4,4,4,4,4,4,4,4,4,4,4,4,5,4,5,4,5,4,5, & 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, & 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, & 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, & 4,4,4,4,4,4,4,4,4,4,4,5,4,4,4,5,4,4,4,4, & 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, & 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5/ data ncw/ & 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, & 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, & 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, & 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, & 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, & 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, & 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, & 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3, & 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, & 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, & 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, & 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,7,7, & 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, & 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, & 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7/ !ncw=3 toc=0 tov=0 tanhtoc=0 !write(*,*) llr ! initialize messages to checks do j=1,M do i=1,nrw(j) toc(i,j)=llr((Nm(i,j))) enddo enddo ncnt=0 do iter=0,maxiterations ! Update bit log likelihood ratios (tov=0 in iteration 0). do i=1,N if( apmask(i) .ne. 1 ) then zn(i)=llr(i)+sum(tov(1:ncw(i),i)) else zn(i)=llr(i) endif enddo ! Check to see if we have a codeword (check before we do any iteration). cw=0 where( zn .gt. 0. ) cw=1 ncheck=0 do i=1,M synd(i)=sum(cw(Nm(1:nrw(i),i))) if( mod(synd(i),2) .ne. 0 ) ncheck=ncheck+1 ! if( mod(synd(i),2) .ne. 0 ) write(*,*) 'check ',i,' unsatisfied' enddo !write(*,*) 'number of unsatisfied parity checks ',ncheck if( ncheck .eq. 0 ) then ! we have a codeword - reorder the columns and return it ! niterations=iter codeword=cw(colorder+1) decoded=codeword(M+1:N) nerr=0 do i=1,N if( (2*cw(i)-1)*llr(i) .lt. 0.0 ) nerr=nerr+1 enddo niterations=nerr return endif if( iter.gt.0 ) then ! this code block implements an early stopping criterion nd=ncheck-nclast if( nd .lt. 0 ) then ! # of unsatisfied parity checks decreased ncnt=0 ! reset counter else ncnt=ncnt+1 endif ! write(*,*) iter,ncheck,nd,ncnt if( ncnt .ge. 5 .and. iter .ge. 15 .and. ncheck .gt. 50) then niterations=-1 return endif endif nclast=ncheck ! Send messages from bits to check nodes do j=1,M do i=1,nrw(j) ibj=Nm(i,j) toc(i,j)=zn(ibj) ! do kk=1,ncw(ibj) ! subtract off what the bit had received from the check do kk=1,7 ! subtract off what the bit had received from the check if( Mn(kk,ibj) .eq. j ) then toc(i,j)=toc(i,j)-tov(kk,ibj) endif enddo enddo enddo ! send messages from check nodes to variable nodes do i=1,M tanhtoc(1:5,i)=tanh(-toc(1:5,i)/2) enddo do j=1,N do i=1,ncw(j) ichk=Mn(i,j) ! Mn(:,j) are the checks that include bit j Tmn=product(tanhtoc(1:nrw(ichk),ichk),mask=Nm(1:nrw(ichk),ichk).ne.j) call platanh(-Tmn,y) ! y=atanh(-Tmn) tov(i,j)=2*y enddo enddo enddo niterations=-1 return end subroutine bpdecode300