mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-26 02:20:20 -04:00 
			
		
		
		
	
		
			
	
	
		
			483 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
		
		
			
		
	
	
			483 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
|  | subroutine bpdecode204(llr,apmask,maxiterations,decoded,cw,nharderror,iter)
 | ||
|  | !
 | ||
|  | ! A log-domain belief propagation decoder for the (204,68) code.
 | ||
|  | !
 | ||
|  | integer, parameter:: N=204, K=68, M=N-K
 | ||
|  | integer*1 codeword(N),cw(N),apmask(N)
 | ||
|  | integer  colorder(N)
 | ||
|  | integer*1 decoded(K)
 | ||
|  | integer Nm(6,M)  ! 4, 5, or 6 bits per check 
 | ||
|  | integer Mn(3,N)  ! 3 checks per bit
 | ||
|  | integer synd(M)
 | ||
|  | real tov(3,N)
 | ||
|  | real toc(6,M)
 | ||
|  | real tanhtoc(6,M)
 | ||
|  | real zn(N)
 | ||
|  | real llr(N)
 | ||
|  | real Tmn
 | ||
|  | integer nrw(M)
 | ||
|  | 
 | ||
|  | data colorder/                                                              &
 | ||
|  |          0,  1,  2,  3,  4,  5, 47,  6,  7,  8,  9, 10, 11, 12, 58, 55, 13, &
 | ||
|  |         14, 15, 46, 17, 18, 60, 19, 20, 21, 22, 23, 24, 25, 57, 26, 27, 49, &
 | ||
|  |         28, 52, 65, 16, 50, 73, 59, 68, 63, 29, 30, 31, 32, 51, 62, 56, 66, &
 | ||
|  |         45, 33, 34, 53, 67, 35, 36, 37, 61, 69, 54, 38, 71, 82, 39, 77, 80, &
 | ||
|  |         83, 78, 84, 48, 41, 85, 40, 64, 75, 96, 74, 72, 76, 86, 87, 89, 90, &
 | ||
|  |         79, 70, 92, 99, 93,101, 95,100, 97, 94, 42, 98,103,105,102, 43,104, &
 | ||
|  |         88, 44,106, 81,107,110,108,111,112,109,113,114,117,118,116,121,115, &
 | ||
|  |        119,122,120,125,129,124,127,126,128, 91,123,133,131,130,134,135,137, &
 | ||
|  |        136,132,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,174,175,176,177,178,179,180,181,182,183,184,185,186, &
 | ||
|  |        187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203/
 | ||
|  | 
 | ||
|  | data Mn/       &
 | ||
|  |    1,  38, 107, &
 | ||
|  |    2,   7, 114, &
 | ||
|  |    3,  48, 106, &
 | ||
|  |    4,  79,  94, &
 | ||
|  |    5,  97, 108, &
 | ||
|  |    6,  50, 122, &
 | ||
|  |    8,  78, 134, &
 | ||
|  |    9,  55,  65, &
 | ||
|  |   10,  62, 100, &
 | ||
|  |   11,  16,  99, &
 | ||
|  |   12, 113, 119, &
 | ||
|  |   13,  31, 125, &
 | ||
|  |   14,  15, 127, &
 | ||
|  |   17,  87, 103, &
 | ||
|  |   18,  81,  98, &
 | ||
|  |   19,  43,  77, &
 | ||
|  |   20, 102, 130, &
 | ||
|  |   21,  36, 111, &
 | ||
|  |   22,  23,  60, &
 | ||
|  |   24,  39, 112, &
 | ||
|  |   25,  37,  42, &
 | ||
|  |   26,  41,  51, &
 | ||
|  |   27,  67,  70, &
 | ||
|  |   28,  64, 136, &
 | ||
|  |   29,  61,  68, &
 | ||
|  |   30,  91, 124, &
 | ||
|  |   32,  80, 121, &
 | ||
|  |   33,  40, 117, &
 | ||
|  |   34,  35,  90, &
 | ||
|  |   44,  88,  93, &
 | ||
|  |   45, 128, 133, &
 | ||
|  |   46,  56,  69, &
 | ||
|  |   47,  49,  52, &
 | ||
|  |   53,  76, 131, &
 | ||
|  |   54, 104, 116, &
 | ||
|  |   57,  84,  86, &
 | ||
|  |   58, 120, 135, &
 | ||
|  |   59,  75,  92, &
 | ||
|  |   63,  71, 109, &
 | ||
|  |   66,  74, 126, &
 | ||
|  |   72,  85, 105, &
 | ||
|  |   73,  82,  95, &
 | ||
|  |   83,  89, 123, &
 | ||
|  |   96, 115, 118, &
 | ||
|  |  101, 110, 129, &
 | ||
|  |   52,  99, 132, &
 | ||
|  |    1,   3,  20, &
 | ||
|  |    2,  77,  89, &
 | ||
|  |    4,  72,  75, &
 | ||
|  |    5,  34,  79, &
 | ||
|  |    6,  24, 130, &
 | ||
|  |    7,  48,  88, &
 | ||
|  |    8,  36, 116, &
 | ||
|  |    9,  71, 114, &
 | ||
|  |   10,  87, 101, &
 | ||
|  |   11,  22, 121, &
 | ||
|  |   12,  50,  64, &
 | ||
|  |   13,  39,  53, &
 | ||
|  |   14,  41,  78, &
 | ||
|  |   15,  68,  96, &
 | ||
|  |   16,  83,  90, &
 | ||
|  |   17,  23,  45, &
 | ||
|  |   18,  47, 126, &
 | ||
|  |   19,  70,  91, &
 | ||
|  |   21,  57,  76, &
 | ||
|  |   25, 110, 117, &
 | ||
|  |   26,  82, 135, &
 | ||
|  |   27,  46,  58, &
 | ||
|  |   28,  37,  56, &
 | ||
|  |   29,  66, 102, &
 | ||
|  |   30,  62, 125, &
 | ||
|  |   31,  85,  93, &
 | ||
|  |   32, 104, 113, &
 | ||
|  |   33,  81,  92, &
 | ||
|  |   35, 100, 118, &
 | ||
|  |   38,  95, 133, &
 | ||
|  |   40,  86, 109, &
 | ||
|  |   42,  61, 124, &
 | ||
|  |   43,  59, 119, &
 | ||
|  |   44,  49, 134, &
 | ||
|  |   51,  97, 122, &
 | ||
|  |   54, 105, 107, &
 | ||
|  |   55, 128, 136, &
 | ||
|  |   60,  67,  84, &
 | ||
|  |   63, 112, 115, &
 | ||
|  |   65,  74, 131, &
 | ||
|  |   69,  80,  94, &
 | ||
|  |   73,  98, 123, &
 | ||
|  |  103, 130, 134, &
 | ||
|  |   46, 106, 111, &
 | ||
|  |    1,  84, 108, &
 | ||
|  |  120, 129, 132, &
 | ||
|  |   65,  75, 127, &
 | ||
|  |    2,  80, 101, &
 | ||
|  |    3, 118, 119, &
 | ||
|  |    4,  52, 124, &
 | ||
|  |    5,  13,  68, &
 | ||
|  |    6,  27,  81, &
 | ||
|  |    7,  51,  76, &
 | ||
|  |    8,  77, 108, &
 | ||
|  |    9,  31,  58, &
 | ||
|  |   10,  18,  57, &
 | ||
|  |   11,  63, 105, &
 | ||
|  |   12,  14, 132, &
 | ||
|  |   15,  56, 123, &
 | ||
|  |   16,  21, 128, &
 | ||
|  |   17,  37,  59, &
 | ||
|  |   19,  85, 126, &
 | ||
|  |   20,  71,  91, &
 | ||
|  |   22,  26, 117, &
 | ||
|  |   23,  79,  98, &
 | ||
|  |   24,  32,  95, &
 | ||
|  |   25,  90,  93, &
 | ||
|  |   28,  49, 109, &
 | ||
|  |   29, 116, 120, &
 | ||
|  |   30,  54, 136, &
 | ||
|  |   33,  53, 107, &
 | ||
|  |   34,  64, 103, &
 | ||
|  |   35,  39,  67, &
 | ||
|  |   36,  71,  73, &
 | ||
|  |   38,  47, 125, &
 | ||
|  |   40,  66,  94, &
 | ||
|  |   41,  70, 104, &
 | ||
|  |   42,  55, 112, &
 | ||
|  |   43,  44,  82, &
 | ||
|  |   29,  45,  88, &
 | ||
|  |   48,  86, 127, &
 | ||
|  |   50,  72, 135, &
 | ||
|  |   60,  74,  96, &
 | ||
|  |   61, 121, 131, &
 | ||
|  |   62,  78,  92, &
 | ||
|  |   69, 100, 133, &
 | ||
|  |   83, 122, 129, &
 | ||
|  |   87,  97, 106, &
 | ||
|  |   89, 102, 113, &
 | ||
|  |   24,  99, 108, &
 | ||
|  |   20,  72, 110, &
 | ||
|  |  111, 115, 117, &
 | ||
|  |   35,  52, 114, &
 | ||
|  |    1,  44,  94, &
 | ||
|  |    2,  23, 107, &
 | ||
|  |    3,  81, 136, &
 | ||
|  |    4,   8,  96, &
 | ||
|  |    5,  37,  70, &
 | ||
|  |    6,  43, 131, &
 | ||
|  |    7, 103, 115, &
 | ||
|  |    9,  94, 122, &
 | ||
|  |   10,  68,  82, &
 | ||
|  |   11,  56,  88, &
 | ||
|  |   12,  46, 126, &
 | ||
|  |   13,  16,  75, &
 | ||
|  |   14,  79, 112, &
 | ||
|  |   15,  47, 110, &
 | ||
|  |   17,  36,  39, &
 | ||
|  |   18,  63, 120, &
 | ||
|  |   19,  22,  55, &
 | ||
|  |   21,  49, 113, &
 | ||
|  |   25,  54,  57, &
 | ||
|  |   26,  89, 125, &
 | ||
|  |   27, 101, 109, &
 | ||
|  |   28,  31,  60, &
 | ||
|  |   30,  74,  97, &
 | ||
|  |   32,  92,  93, &
 | ||
|  |   33,  83,  91, &
 | ||
|  |   34,  58, 121, &
 | ||
|  |   38,  65, 111, &
 | ||
|  |   40,  99, 118, &
 | ||
|  |    3,  41,  61, &
 | ||
|  |   42,  50, 100, &
 | ||
|  |   45,  78, 106, &
 | ||
|  |   48,  95, 129, &
 | ||
|  |   51,  85, 133, &
 | ||
|  |   53,  59,  69, &
 | ||
|  |   11,  62,  66, &
 | ||
|  |   64,  73, 124, &
 | ||
|  |   67, 123, 134, &
 | ||
|  |   76, 104, 132, &
 | ||
|  |   77, 100, 127, &
 | ||
|  |   36,  80, 119, &
 | ||
|  |   84, 102, 135, &
 | ||
|  |   86, 105, 124, &
 | ||
|  |    4,  87, 128, &
 | ||
|  |   90, 106, 116, &
 | ||
|  |   65,  98, 130, &
 | ||
|  |   92, 108, 114, &
 | ||
|  |    1,  52, 121, &
 | ||
|  |    2,  84, 117, &
 | ||
|  |    5,  83, 105, &
 | ||
|  |    6,  15,  63, &
 | ||
|  |    7,  28,  82, &
 | ||
|  |    8,  32, 135, &
 | ||
|  |    9, 104, 134, &
 | ||
|  |    9,  10,  89, &
 | ||
|  |   12,  62, 107, &
 | ||
|  |   13,  40, 103, &
 | ||
|  |   14,  31,  95, &
 | ||
|  |   16,  27,  74, &
 | ||
|  |   17,  90, 132, &
 | ||
|  |   18,  34,  69, &
 | ||
|  |   19, 103, 129, &
 | ||
|  |   20,  76,  87, &
 | ||
|  |   21,  22, 130, &
 | ||
|  |   23,  25,  99, &
 | ||
|  |   24, 101, 126/
 | ||
|  | 
 | ||
|  | data Nm/               &
 | ||
|  |    1,  47,  91, 140, 186,   0, &
 | ||
|  |    2,  48,  94, 141, 187,   0, &
 | ||
|  |    3,  47,  95, 142, 168,   0, &
 | ||
|  |    4,  49,  96, 143, 182,   0, &
 | ||
|  |    5,  50,  97, 144, 188,   0, &
 | ||
|  |    6,  51,  98, 145, 189,   0, &
 | ||
|  |    2,  52,  99, 146, 190,   0, &
 | ||
|  |    7,  53, 100, 143, 191,   0, &
 | ||
|  |    8,  54, 101, 147, 192, 193, &
 | ||
|  |    9,  55, 102, 148, 193,   0, &
 | ||
|  |   10,  56, 103, 149, 174,   0, &
 | ||
|  |   11,  57, 104, 150, 194,   0, &
 | ||
|  |   12,  58,  97, 151, 195,   0, &
 | ||
|  |   13,  59, 104, 152, 196,   0, &
 | ||
|  |   13,  60, 105, 153, 189,   0, &
 | ||
|  |   10,  61, 106, 151, 197,   0, &
 | ||
|  |   14,  62, 107, 154, 198,   0, &
 | ||
|  |   15,  63, 102, 155, 199,   0, &
 | ||
|  |   16,  64, 108, 156, 200,   0, &
 | ||
|  |   17,  47, 109, 137, 201,   0, &
 | ||
|  |   18,  65, 106, 157, 202,   0, &
 | ||
|  |   19,  56, 110, 156, 202,   0, &
 | ||
|  |   19,  62, 111, 141, 203,   0, &
 | ||
|  |   20,  51, 112, 136, 204,   0, &
 | ||
|  |   21,  66, 113, 158, 203,   0, &
 | ||
|  |   22,  67, 110, 159,   0,   0, &
 | ||
|  |   23,  68,  98, 160, 197,   0, &
 | ||
|  |   24,  69, 114, 161, 190,   0, &
 | ||
|  |   25,  70, 115, 126,   0,   0, &
 | ||
|  |   26,  71, 116, 162,   0,   0, &
 | ||
|  |   12,  72, 101, 161, 196,   0, &
 | ||
|  |   27,  73, 112, 163, 191,   0, &
 | ||
|  |   28,  74, 117, 164,   0,   0, &
 | ||
|  |   29,  50, 118, 165, 199,   0, &
 | ||
|  |   29,  75, 119, 139,   0,   0, &
 | ||
|  |   18,  53, 120, 154, 179,   0, &
 | ||
|  |   21,  69, 107, 144,   0,   0, &
 | ||
|  |    1,  76, 121, 166,   0,   0, &
 | ||
|  |   20,  58, 119, 154,   0,   0, &
 | ||
|  |   28,  77, 122, 167, 195,   0, &
 | ||
|  |   22,  59, 123, 168,   0,   0, &
 | ||
|  |   21,  78, 124, 169,   0,   0, &
 | ||
|  |   16,  79, 125, 145,   0,   0, &
 | ||
|  |   30,  80, 125, 140,   0,   0, &
 | ||
|  |   31,  62, 126, 170,   0,   0, &
 | ||
|  |   32,  68,  90, 150,   0,   0, &
 | ||
|  |   33,  63, 121, 153,   0,   0, &
 | ||
|  |    3,  52, 127, 171,   0,   0, &
 | ||
|  |   33,  80, 114, 157,   0,   0, &
 | ||
|  |    6,  57, 128, 169,   0,   0, &
 | ||
|  |   22,  81,  99, 172,   0,   0, &
 | ||
|  |   33,  46,  96, 139, 186,   0, &
 | ||
|  |   34,  58, 117, 173,   0,   0, &
 | ||
|  |   35,  82, 116, 158,   0,   0, &
 | ||
|  |    8,  83, 124, 156,   0,   0, &
 | ||
|  |   32,  69, 105, 149,   0,   0, &
 | ||
|  |   36,  65, 102, 158,   0,   0, &
 | ||
|  |   37,  68, 101, 165,   0,   0, &
 | ||
|  |   38,  79, 107, 173,   0,   0, &
 | ||
|  |   19,  84, 129, 161,   0,   0, &
 | ||
|  |   25,  78, 130, 168,   0,   0, &
 | ||
|  |    9,  71, 131, 174, 194,   0, &
 | ||
|  |   39,  85, 103, 155, 189,   0, &
 | ||
|  |   24,  57, 118, 175,   0,   0, &
 | ||
|  |    8,  86,  93, 166, 184,   0, &
 | ||
|  |   40,  70, 122, 174,   0,   0, &
 | ||
|  |   23,  84, 119, 176,   0,   0, &
 | ||
|  |   25,  60,  97, 148,   0,   0, &
 | ||
|  |   32,  87, 132, 173, 199,   0, &
 | ||
|  |   23,  64, 123, 144,   0,   0, &
 | ||
|  |   39,  54, 109, 120,   0,   0, &
 | ||
|  |   41,  49, 128, 137,   0,   0, &
 | ||
|  |   42,  88, 120, 175,   0,   0, &
 | ||
|  |   40,  86, 129, 162, 197,   0, &
 | ||
|  |   38,  49,  93, 151,   0,   0, &
 | ||
|  |   34,  65,  99, 177, 201,   0, &
 | ||
|  |   16,  48, 100, 178,   0,   0, &
 | ||
|  |    7,  59, 131, 170,   0,   0, &
 | ||
|  |    4,  50, 111, 152,   0,   0, &
 | ||
|  |   27,  87,  94, 179,   0,   0, &
 | ||
|  |   15,  74,  98, 142,   0,   0, &
 | ||
|  |   42,  67, 125, 148, 190,   0, &
 | ||
|  |   43,  61, 133, 164, 188,   0, &
 | ||
|  |   36,  84,  91, 180, 187,   0, &
 | ||
|  |   41,  72, 108, 172,   0,   0, &
 | ||
|  |   36,  77, 127, 181,   0,   0, &
 | ||
|  |   14,  55, 134, 182, 201,   0, &
 | ||
|  |   30,  52, 126, 149,   0,   0, &
 | ||
|  |   43,  48, 135, 159, 193,   0, &
 | ||
|  |   29,  61, 113, 183, 198,   0, &
 | ||
|  |   26,  64, 109, 164,   0,   0, &
 | ||
|  |   38,  74, 131, 163, 185,   0, &
 | ||
|  |   30,  72, 113, 163,   0,   0, &
 | ||
|  |    4,  87, 122, 140, 147,   0, &
 | ||
|  |   42,  76, 112, 171, 196,   0, &
 | ||
|  |   44,  60, 129, 143,   0,   0, &
 | ||
|  |    5,  81, 134, 162,   0,   0, &
 | ||
|  |   15,  88, 111, 184,   0,   0, &
 | ||
|  |   10,  46, 136, 167, 203,   0, &
 | ||
|  |    9,  75, 132, 169, 178,   0, &
 | ||
|  |   45,  55,  94, 160, 204,   0, &
 | ||
|  |   17,  70, 135, 180,   0,   0, &
 | ||
|  |   14,  89, 118, 146, 195, 200, &
 | ||
|  |   35,  73, 123, 177, 192,   0, &
 | ||
|  |   41,  82, 103, 181, 188,   0, &
 | ||
|  |    3,  90, 134, 170, 183,   0, &
 | ||
|  |    1,  82, 117, 141, 194,   0, &
 | ||
|  |    5,  91, 100, 136, 185,   0, &
 | ||
|  |   39,  77, 114, 160,   0,   0, &
 | ||
|  |   45,  66, 137, 153,   0,   0, &
 | ||
|  |   18,  90, 138, 166,   0,   0, &
 | ||
|  |   20,  85, 124, 152,   0,   0, &
 | ||
|  |   11,  73, 135, 157,   0,   0, &
 | ||
|  |    2,  54, 139, 185,   0,   0, &
 | ||
|  |   44,  85, 138, 146,   0,   0, &
 | ||
|  |   35,  53, 115, 183,   0,   0, &
 | ||
|  |   28,  66, 110, 138, 187,   0, &
 | ||
|  |   44,  75,  95, 167,   0,   0, &
 | ||
|  |   11,  79,  95, 179,   0,   0, &
 | ||
|  |   37,  92, 115, 155,   0,   0, &
 | ||
|  |   27,  56, 130, 165, 186,   0, &
 | ||
|  |    6,  81, 133, 147,   0,   0, &
 | ||
|  |   43,  88, 105, 176,   0,   0, &
 | ||
|  |   26,  78,  96, 175, 181,   0, &
 | ||
|  |   12,  71, 121, 159,   0,   0, &
 | ||
|  |   40,  63, 108, 150, 204,   0, &
 | ||
|  |   13,  93, 127, 178,   0,   0, &
 | ||
|  |   31,  83, 106, 182,   0,   0, &
 | ||
|  |   45,  92, 133, 171, 200,   0, &
 | ||
|  |   17,  51,  89, 184, 202,   0, &
 | ||
|  |   34,  86, 130, 145,   0,   0, &
 | ||
|  |   46,  92, 104, 177, 198,   0, &
 | ||
|  |   31,  76, 132, 172,   0,   0, &
 | ||
|  |    7,  80,  89, 176, 192,   0, &
 | ||
|  |   37,  67, 128, 180, 191,   0, &
 | ||
|  |   24,  83, 116, 142,   0,   0/
 | ||
|  | 
 | ||
|  | data nrw/    &
 | ||
|  |   5,5,5,5,5,5,5,5,6,5,5,5,5,5,5,5,5, &
 | ||
|  |   5,5,5,5,5,5,5,5,4,5,5,4,4,5,5,4,5, &
 | ||
|  |   4,5,4,4,4,5,4,4,4,4,4,4,4,4,4,4,4, &
 | ||
|  |   5,4,4,4,4,4,4,4,4,4,5,5,4,5,4,4,4, &
 | ||
|  |   5,4,4,4,4,5,4,5,4,4,4,4,4,5,5,5,4, &
 | ||
|  |   4,5,4,5,5,4,5,4,5,5,4,4,4,5,5,5,4, &
 | ||
|  |   6,5,5,5,5,5,4,4,4,4,4,4,4,4,5,4,4, &
 | ||
|  |   4,5,4,4,5,4,5,4,4,5,5,4,5,4,5,5,4/
 | ||
|  | 
 | ||
|  | ncw=3
 | ||
|  | 
 | ||
|  | decoded=0
 | ||
|  | toc=0
 | ||
|  | tov=0
 | ||
|  | tanhtoc=0
 | ||
|  | ! 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))
 | ||
|  |     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
 | ||
|  |     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
 | ||
|  |     nharderror=nerr
 | ||
|  |     return
 | ||
|  |   endif
 | ||
|  | 
 | ||
|  |   if( iter.gt.0 ) then  ! this code block implements an early stopping criterion
 | ||
|  | !  if( iter.gt.10000 ) 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. 10 .and. ncheck .gt. 15) then
 | ||
|  |       nharderror=-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 ! 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:6,i)=tanh(-toc(1:6,i)/2)
 | ||
|  |   enddo
 | ||
|  | 
 | ||
|  |   do j=1,N
 | ||
|  |     do i=1,ncw
 | ||
|  |       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
 | ||
|  | nharderror=-1
 | ||
|  | return
 | ||
|  | end subroutine bpdecode204
 |