mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 20:40:28 -04:00 
			
		
		
		
	git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@8585 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
		
			
				
	
	
		
			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
 |