133 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			133 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | program wsprcode | ||
|  | 
 | ||
|  | ! This program provides examples of the source encoding, convolutional | ||
|  | ! error-control coding, bit and symbol ordering, and synchronizing | ||
|  | ! information contained in WSPR messages. | ||
|  | 
 | ||
|  |   parameter (NSYM=162) | ||
|  |   parameter (MAXSYM=176) | ||
|  |   character*22 msg,msg2 | ||
|  |   integer*1 data0(7) | ||
|  |   integer*1 data1(7) | ||
|  |   integer*1 dat(NSYM) | ||
|  |   integer*1 softsym(NSYM) | ||
|  | 
 | ||
|  | ! Define the sync vector: | ||
|  |   integer*1 sync(NSYM) | ||
|  |   data sync/                                      & | ||
|  |        1,1,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,0,   & | ||
|  |        0,1,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,1,0,1,   & | ||
|  |        0,0,0,0,0,0,1,0,1,1,0,0,1,1,0,1,0,0,0,1,   & | ||
|  |        1,0,1,0,0,0,0,1,1,0,1,0,1,0,1,0,1,0,0,1,   & | ||
|  |        0,0,1,0,1,1,0,0,0,1,1,0,1,0,1,0,0,0,1,0,   & | ||
|  |        0,0,0,0,1,0,0,1,0,0,1,1,1,0,1,1,0,0,1,1,   & | ||
|  |        0,1,0,0,0,1,1,1,0,0,0,0,0,1,0,1,0,0,1,1,   & | ||
|  |        0,0,0,0,0,0,0,1,1,0,1,0,1,1,0,0,0,1,1,0,   & | ||
|  |        0,0/ | ||
|  | 
 | ||
|  | ! Metric table for decoding from soft symbols | ||
|  |   integer mettab(0:255,0:1) | ||
|  |   data mettab/                                            & | ||
|  |          5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   & | ||
|  |          5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   & | ||
|  |          5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   & | ||
|  |          5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   & | ||
|  |          5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   & | ||
|  |          5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   & | ||
|  |          5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   & | ||
|  |          5,   5,   5,   5,   5,   5,   5,   5,   5,   4,   & | ||
|  |          4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   & | ||
|  |          4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   & | ||
|  |          3,   3,   3,   3,   3,   3,   3,   3,   3,   2,   & | ||
|  |          2,   2,   2,   2,   1,   1,   1,   1,   0,   0,   & | ||
|  |         -1,  -1,  -1,  -2,  -2,  -3,  -4,  -4,  -5,  -6,   & | ||
|  |         -7,  -7,  -8,  -9, -10, -11, -12, -12, -13, -14,   & | ||
|  |        -15, -16, -17, -17, -18, -19, -20, -21, -22, -22,   & | ||
|  |        -23, -24, -25, -26, -26, -27, -28, -29, -30, -30,   & | ||
|  |        -31, -32, -33, -33, -34, -35, -36, -36, -37, -38,   & | ||
|  |        -38, -39, -40, -41, -41, -42, -43, -43, -44, -45,   & | ||
|  |        -45, -46, -47, -47, -48, -49, -49, -50, -51, -51,   & | ||
|  |        -52, -53, -53, -54, -54, -55, -56, -56, -57, -57,   & | ||
|  |        -58, -59, -59, -60, -60, -61, -62, -62, -62, -63,   & | ||
|  |        -64, -64, -65, -65, -66, -67, -67, -67, -68, -69,   & | ||
|  |        -69, -70, -70, -71, -72, -72, -72, -72, -73, -74,   & | ||
|  |        -75, -75, -75, -77, -76, -76, -78, -78, -80, -81,   & | ||
|  |        -80, -79, -83, -82, -81, -82, -82, -83, -84, -84,   & | ||
|  |        -84, -87, -86, -87, -88, -89, -89, -89, -88, -87,   & | ||
|  |        -86, -87, -84, -84, -84, -83, -82, -82, -81, -82,   & | ||
|  |        -83, -79, -80, -81, -80, -78, -78, -76, -76, -77,   & | ||
|  |        -75, -75, -75, -74, -73, -72, -72, -72, -72, -71,   & | ||
|  |        -70, -70, -69, -69, -68, -67, -67, -67, -66, -65,   & | ||
|  |        -65, -64, -64, -63, -62, -62, -62, -61, -60, -60,   & | ||
|  |        -59, -59, -58, -57, -57, -56, -56, -55, -54, -54,   & | ||
|  |        -53, -53, -52, -51, -51, -50, -49, -49, -48, -47,   & | ||
|  |        -47, -46, -45, -45, -44, -43, -43, -42, -41, -41,   & | ||
|  |        -40, -39, -38, -38, -37, -36, -36, -35, -34, -33,   & | ||
|  |        -33, -32, -31, -30, -30, -29, -28, -27, -26, -26,   & | ||
|  |        -25, -24, -23, -22, -22, -21, -20, -19, -18, -17,   & | ||
|  |        -17, -16, -15, -14, -13, -12, -12, -11, -10,  -9,   & | ||
|  |         -8,  -7,  -7,  -6,  -5,  -4,  -4,  -3,  -2,  -2,   & | ||
|  |         -1,  -1,  -1,   0,   0,   1,   1,   1,   1,   2,   & | ||
|  |          2,   2,   2,   2,   3,   3,   3,   3,   3,   3,   & | ||
|  |          3,   3,   3,   4,   4,   4,   4,   4,   4,   4,   & | ||
|  |          4,   4,   4,   4,   4,   4,   4,   4,   4,   4,   & | ||
|  |          4,   4,   4,   4,   5,   5,   5,   5,   5,   5,   & | ||
|  |          5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   & | ||
|  |          5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   & | ||
|  |          5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   & | ||
|  |          5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   & | ||
|  |          5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   & | ||
|  |          5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   & | ||
|  |          5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   & | ||
|  |          5,   5/ | ||
|  | 
 | ||
|  | ! Get command-line argument(s) | ||
|  |   nargs=iargc() | ||
|  |   if(nargs.ne.1) then | ||
|  |      print*,'Usage: WSPRcode "message"' | ||
|  |      go to 999 | ||
|  |   endif | ||
|  |   call getarg(1,msg)                             !Get message from command line | ||
|  |   write(*,1000) msg | ||
|  | 1000 format('Message: ',a22) | ||
|  | 
 | ||
|  |   nbits=50+31               !User bits=50, constraint length=32 | ||
|  |   nbytes=(nbits+7)/8 | ||
|  |   ndelta=50 | ||
|  |   limit=20000 | ||
|  | 
 | ||
|  |   data0=0 | ||
|  |   call wqencode(msg,ntype0,data0)             !Source encoding | ||
|  |   write(*,1002) data0 | ||
|  | 1002 format(/'Source-encoded message (50 bits, hex):',7z3.2) | ||
|  | 
 | ||
|  |   call encode232(data0,nbytes,dat,MAXSYM)     !Convolutional encoding | ||
|  |   call inter_mept(dat,1)                      !Interleaving | ||
|  | 
 | ||
|  |   write(*,1004) | ||
|  | 1004 format(/'Data symbols:') | ||
|  |   write(*,1006) (dat(i),i=1,NSYM) | ||
|  | 1006 format(5x,30i2) | ||
|  | 
 | ||
|  |   write(*,1008) | ||
|  | 1008 format(/'Sync symbols:') | ||
|  |   write(*,1006) (sync(i),i=1,NSYM) | ||
|  | 
 | ||
|  |   write(*,1010) | ||
|  | 1010 format(/'Channel symbols:') | ||
|  |   write(*,1006) (2*dat(i)+sync(i),i=1,NSYM) | ||
|  | 
 | ||
|  |   call inter_mept(dat,-1)                     !Remove interleaving | ||
|  |   softsym=-dat                                !Simulate soft symbols | ||
|  | 
 | ||
|  | ! Call the sequential (Fano algorithm) decoder | ||
|  |   call fano232(softsym,nbits,mettab,ndelta,limit,data1,ncycles,metric,nerr) | ||
|  |   call wqdecode(data1,msg2,ntype1)          | ||
|  | 
 | ||
|  |   write(*,1020) ntype1 | ||
|  | 1020 format(/'Message type: ',i7) | ||
|  |   write(*,1030) msg2 | ||
|  | 1030 format('Decoded message:  ',a22) | ||
|  | 
 | ||
|  | 999 end program wsprcode |