| 
									
										
										
										
											2015-02-01 16:23:36 +00:00
										 |  |  | subroutine jt9fano(i1SoftSymbols,limit,nlim,msg)
 | 
					
						
							| 
									
										
										
										
											2012-10-03 00:41:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! Decoder for JT9
 | 
					
						
							|  |  |  | ! Input:   i1SoftSymbols(207) - Single-bit soft symbols
 | 
					
						
							|  |  |  | ! Output:  msg                - decoded message (blank if erasure)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-22 17:48:03 +00:00
										 |  |  |   use packjt
 | 
					
						
							| 
									
										
										
										
											2012-10-03 00:41:07 +00:00
										 |  |  |   character*22 msg
 | 
					
						
							|  |  |  |   integer*4 i4DecodedBytes(9)
 | 
					
						
							|  |  |  |   integer*4 i4Decoded6BitWords(12)
 | 
					
						
							|  |  |  |   integer*1 i1DecodedBytes(13)   !72 bits and zero tail as 8-bit bytes
 | 
					
						
							|  |  |  |   integer*1 i1SoftSymbols(207)
 | 
					
						
							|  |  |  |   integer*1 i1DecodedBits(72)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-20 23:01:19 +00:00
										 |  |  |   real*4 xx0(0:262)
 | 
					
						
							| 
									
										
										
										
											2012-10-31 18:33:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-03 00:41:07 +00:00
										 |  |  |   logical first
 | 
					
						
							| 
									
										
										
										
											2015-03-04 17:07:15 +00:00
										 |  |  |   integer*4 mettab(-128:127,0:1)
 | 
					
						
							| 
									
										
										
										
											2012-10-03 00:41:07 +00:00
										 |  |  |   data first/.true./
 | 
					
						
							| 
									
										
										
										
											2013-07-08 13:17:22 +00:00
										 |  |  |   data xx0/                                                      & !Metric table
 | 
					
						
							| 
									
										
										
										
											2012-10-31 18:33:56 +00:00
										 |  |  |         1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000,  &
 | 
					
						
							|  |  |  |         1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000,  &
 | 
					
						
							|  |  |  |         1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000,  &
 | 
					
						
							|  |  |  |         1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000,  &
 | 
					
						
							|  |  |  |         1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000,  &
 | 
					
						
							|  |  |  |         1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000, 1.000,  &
 | 
					
						
							|  |  |  |         0.988, 1.000, 0.991, 0.993, 1.000, 0.995, 1.000, 0.991,  &
 | 
					
						
							|  |  |  |         1.000, 0.991, 0.992, 0.991, 0.990, 0.990, 0.992, 0.996,  &
 | 
					
						
							|  |  |  |         0.990, 0.994, 0.993, 0.991, 0.992, 0.989, 0.991, 0.987,  &
 | 
					
						
							|  |  |  |         0.985, 0.989, 0.984, 0.983, 0.979, 0.977, 0.971, 0.975,  &
 | 
					
						
							|  |  |  |         0.974, 0.970, 0.970, 0.970, 0.967, 0.962, 0.960, 0.957,  &
 | 
					
						
							|  |  |  |         0.956, 0.953, 0.942, 0.946, 0.937, 0.933, 0.929, 0.920,  &
 | 
					
						
							|  |  |  |         0.917, 0.911, 0.903, 0.895, 0.884, 0.877, 0.869, 0.858,  &
 | 
					
						
							|  |  |  |         0.846, 0.834, 0.821, 0.806, 0.790, 0.775, 0.755, 0.737,  &
 | 
					
						
							|  |  |  |         0.713, 0.691, 0.667, 0.640, 0.612, 0.581, 0.548, 0.510,  &
 | 
					
						
							|  |  |  |         0.472, 0.425, 0.378, 0.328, 0.274, 0.212, 0.146, 0.075,  &
 | 
					
						
							|  |  |  |         0.000,-0.079,-0.163,-0.249,-0.338,-0.425,-0.514,-0.606,  &
 | 
					
						
							|  |  |  |        -0.706,-0.796,-0.895,-0.987,-1.084,-1.181,-1.280,-1.376,  &
 | 
					
						
							|  |  |  |        -1.473,-1.587,-1.678,-1.790,-1.882,-1.992,-2.096,-2.201,  &
 | 
					
						
							|  |  |  |        -2.301,-2.411,-2.531,-2.608,-2.690,-2.829,-2.939,-3.058,  &
 | 
					
						
							|  |  |  |        -3.164,-3.212,-3.377,-3.463,-3.550,-3.768,-3.677,-3.975,  &
 | 
					
						
							|  |  |  |        -4.062,-4.098,-4.186,-4.261,-4.472,-4.621,-4.623,-4.608,  &
 | 
					
						
							|  |  |  |        -4.822,-4.870,-4.652,-4.954,-5.108,-5.377,-5.544,-5.995,  &
 | 
					
						
							|  |  |  |        -5.632,-5.826,-6.304,-6.002,-6.559,-6.369,-6.658,-7.016,  &
 | 
					
						
							|  |  |  |        -6.184,-7.332,-6.534,-6.152,-6.113,-6.288,-6.426,-6.313,  &
 | 
					
						
							|  |  |  |        -9.966,-6.371,-9.966,-7.055,-9.966,-6.629,-6.313,-9.966,  &
 | 
					
						
							|  |  |  |        -5.858,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,  &
 | 
					
						
							|  |  |  |        -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,  &
 | 
					
						
							|  |  |  |        -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,  &
 | 
					
						
							|  |  |  |        -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,  &
 | 
					
						
							|  |  |  |        -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,  &
 | 
					
						
							| 
									
										
										
										
											2016-06-20 23:01:19 +00:00
										 |  |  |        -9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,-9.966,  &
 | 
					
						
							|  |  |  |         1.43370769e-019,2.64031087e-006,6.25548654e+028,         &
 | 
					
						
							|  |  |  |         2.44565251e+020,4.74227538e+030,10497312.,7.74079654e-039/
 | 
					
						
							| 
									
										
										
										
											2012-10-03 00:41:07 +00:00
										 |  |  |   save
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if(first) then
 | 
					
						
							|  |  |  | ! Get the metric table
 | 
					
						
							| 
									
										
										
										
											2012-11-06 20:27:08 +00:00
										 |  |  |      bias=0.5
 | 
					
						
							| 
									
										
										
										
											2015-03-04 17:07:15 +00:00
										 |  |  |      scale=50
 | 
					
						
							|  |  |  |      ndelta=nint(3.4*scale)
 | 
					
						
							|  |  |  |      ib=160                          !Break point
 | 
					
						
							|  |  |  |      slope=2                         !Slope beyond break
 | 
					
						
							| 
									
										
										
										
											2012-10-03 00:41:07 +00:00
										 |  |  |      do i=0,255
 | 
					
						
							| 
									
										
										
										
											2015-03-04 17:07:15 +00:00
										 |  |  |         mettab(i-128,0)=nint(scale*(xx0(i)-bias))
 | 
					
						
							|  |  |  |         if(i.gt.ib) mettab(i-128,0)=mettab(ib-128,0) - slope*(i-ib)
 | 
					
						
							|  |  |  |         if(i.ge.1) mettab(128-i,1)=mettab(i-128,0)
 | 
					
						
							| 
									
										
										
										
											2012-10-03 00:41:07 +00:00
										 |  |  |      enddo
 | 
					
						
							| 
									
										
										
										
											2015-03-04 17:07:15 +00:00
										 |  |  |      mettab(-128,1)=mettab(-127,1)
 | 
					
						
							| 
									
										
										
										
											2012-10-03 00:41:07 +00:00
										 |  |  |      first=.false.
 | 
					
						
							|  |  |  |   endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   msg='                      '
 | 
					
						
							|  |  |  |   nbits=72
 | 
					
						
							|  |  |  |   call fano232(i1SoftSymbols,nbits+31,mettab,ndelta,limit,i1DecodedBytes,   &
 | 
					
						
							| 
									
										
										
										
											2012-10-20 16:37:01 +00:00
										 |  |  |        ncycles,metric,ierr)
 | 
					
						
							| 
									
										
										
										
											2012-10-03 00:41:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-09 20:59:53 +00:00
										 |  |  |   nlim=ncycles/(nbits+31)
 | 
					
						
							| 
									
										
										
										
											2015-02-27 15:38:24 +00:00
										 |  |  |   if(ncycles.lt.((nbits+31)*limit)) then
 | 
					
						
							| 
									
										
										
										
											2012-10-03 00:41:07 +00:00
										 |  |  |      nbytes=(nbits+7)/8
 | 
					
						
							|  |  |  |      do i=1,nbytes
 | 
					
						
							|  |  |  |         n=i1DecodedBytes(i)
 | 
					
						
							|  |  |  |         i4DecodedBytes(i)=iand(n,255)
 | 
					
						
							|  |  |  |      enddo
 | 
					
						
							|  |  |  |      call unpackbits(i4DecodedBytes,nbytes,8,i1DecodedBits)
 | 
					
						
							|  |  |  |      call packbits(i1DecodedBits,12,6,i4Decoded6BitWords)
 | 
					
						
							| 
									
										
										
										
											2018-07-11 10:13:42 -04:00
										 |  |  |      call unpackmsg(i4Decoded6BitWords,msg)             !Unpack decoded msg
 | 
					
						
							| 
									
										
										
										
											2012-10-30 15:02:27 +00:00
										 |  |  |      if(index(msg,'000AAA ').gt.0) msg='                      '
 | 
					
						
							| 
									
										
										
										
											2012-10-03 00:41:07 +00:00
										 |  |  |   endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return
 | 
					
						
							| 
									
										
										
										
											2015-02-01 16:23:36 +00:00
										 |  |  | end subroutine jt9fano
 |