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
 |