2021-01-13 11:21:59 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								subroutine q65_loops(c00,npts2,nsps2,nsubmode,ndepth,jpk0,    &
							 | 
						
					
						
							
								
									
										
										
										
											2020-12-30 15:05:02 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								     xdt0,f0,iaptype,xdt1,f1,snr2,dat4,idec)
							 | 
						
					
						
							
								
									
										
										
										
											2020-10-27 13:08:07 -04:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  use packjt77
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  use timer_module, only: timer
							 | 
						
					
						
							
								
									
										
										
										
											2021-01-08 09:42:07 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  use q65
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-29 10:00:33 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  parameter (NN=63)
							 | 
						
					
						
							
								
									
										
										
										
											2021-01-27 13:19:39 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  parameter (LN=2176*63)           !LN=LL*NN; LL=64*(mode_q65+2), NN=63
							 | 
						
					
						
							
								
									
										
										
										
											2020-10-27 13:08:07 -04:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  complex c00(0:npts2-1)           !Analytic representation of dd(), 6000 Hz
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  complex ,allocatable :: c0(:)    !Ditto, with freq shift
							 | 
						
					
						
							
								
									
										
										
										
											2020-12-28 15:27:10 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  character decoded*37
							 | 
						
					
						
							
								
									
										
										
										
											2020-10-27 13:08:07 -04:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  real a(3)                        !twkfreq params f,f1,f2
							 | 
						
					
						
							
								
									
										
										
										
											2021-04-15 13:52:18 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  real,allocatable :: s3(:)        !Symbol spectra
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-03 15:49:11 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  integer dat4(13)                 !Decoded message (as 13 six-bit integers)
							 | 
						
					
						
							
								
									
										
										
										
											2020-10-27 13:08:07 -04:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  integer nap(0:11)                !AP return codes
							 | 
						
					
						
							
								
									
										
										
										
											2020-12-27 15:27:26 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  data nap/0,2,3,2,3,4,2,3,6,4,6,6/
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-23 14:30:36 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-04-15 13:52:18 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  LL=64*(mode_q65+2)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  allocate(s3(LL*NN))
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  allocate(c0(0:npts2-1))
							 | 
						
					
						
							
								
									
										
										
										
											2020-12-30 15:05:02 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  idec=-1
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-02 15:59:10 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  ircbest=9999
							 | 
						
					
						
							
								
									
										
										
										
											2020-10-27 13:08:07 -04:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  irc=-99
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  s3lim=20.
							 | 
						
					
						
							
								
									
										
										
										
											2021-01-13 11:07:20 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  baud=6000.0/nsps2
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-20 17:07:11 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2021-04-21 15:57:54 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  idfmax=1
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  idtmax=1
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  maxdist=4
							 | 
						
					
						
							
								
									
										
										
										
											2020-12-30 15:05:02 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  ibw0=(ibwa+ibwb)/2
							 | 
						
					
						
							
								
									
										
										
										
											2021-04-21 15:57:54 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  if(iand(ndepth,3).eq.2) then
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								     idfmax=3
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								     idtmax=3
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								     maxdist=5
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  endif
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  if(iand(ndepth,3).eq.3) then
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-20 17:07:11 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								     idfmax=5
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								     idtmax=5
							 | 
						
					
						
							
								
									
										
										
										
											2023-01-23 15:40:48 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								     maxdist=5
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-20 17:07:11 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  endif
							 | 
						
					
						
							
								
									
										
										
										
											2021-01-08 09:42:07 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2020-10-27 13:08:07 -04:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  napmin=99
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-13 13:40:16 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  xdt1=xdt0
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  f1=f0
							 | 
						
					
						
							
								
									
										
										
										
											2021-02-25 12:45:07 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  idfbest=0
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  idtbest=0
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  ndistbest=0
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-29 10:00:33 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-30 14:13:37 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								  do idf=1,idfmax
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								     ndf=idf/2
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								     if(mod(idf,2).eq.0) ndf=-ndf
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								     a=0.
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								     a(1)=-(f0+0.5*baud*ndf)
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-29 13:18:11 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								! Variable 'drift' is frequency increase over full TxT.  Therefore we want:
							 | 
						
					
						
							
								
									
										
										
										
											2021-05-27 12:20:20 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								     a(2)=-0.5*drift
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-30 14:13:37 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								     call twkfreq(c00,c0,npts2,6000.0,a)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								     do idt=1,idtmax
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        ndt=idt/2
							 | 
						
					
						
							
								
									
										
										
										
											2021-01-01 15:28:41 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        if(mod(idt,2).eq.0) ndt=-ndt
							 | 
						
					
						
							
								
									
										
										
										
											2021-01-13 11:07:20 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        jpk=jpk0 + nsps2*ndt/16              !tsym/16
							 | 
						
					
						
							
								
									
										
										
										
											2021-06-29 17:35:07 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        jpk=max(0,jpk)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        jpk=min(29000,jpk)
							 | 
						
					
						
							
								
									
										
										
										
											2021-06-30 10:40:38 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        call spec64(c0,npts2,nsps2,mode_q65,jpk,s3,LL,NN)
							 | 
						
					
						
							
								
									
										
										
										
											2021-01-01 15:28:41 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        call pctile(s3,LL*NN,40,base)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        s3=s3/base
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        where(s3(1:LL*NN)>s3lim) s3(1:LL*NN)=s3lim
							 | 
						
					
						
							
								
									
										
										
										
											2021-02-12 13:26:22 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        call q65_bzap(s3,LL)                   !Zap birdies
							 | 
						
					
						
							
								
									
										
										
										
											2020-12-30 15:05:02 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        do ibw=ibwa,ibwb
							 | 
						
					
						
							
								
									
										
										
										
											2021-02-23 16:13:46 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								           ndist=ndf**2 + ndt**2 + (ibw-ibw0)**2
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-30 14:13:37 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								           if(ndist.gt.maxdist) cycle
							 | 
						
					
						
							
								
									
										
										
										
											2020-12-30 15:05:02 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								           b90=1.72**ibw
							 | 
						
					
						
							
								
									
										
										
										
											2020-12-20 21:43:30 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								           if(b90.gt.345.0) cycle
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-30 14:13:37 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								           b90ts = b90/baud
							 | 
						
					
						
							
								
									
										
										
										
											2021-01-01 10:47:22 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								           call timer('dec2    ',0)
							 | 
						
					
						
							
								
									
										
										
										
											2020-12-28 15:27:10 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								           call q65_dec2(s3,nsubmode,b90ts,esnodb,irc,dat4,decoded)
							 | 
						
					
						
							
								
									
										
										
										
											2021-01-01 10:47:22 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								           call timer('dec2    ',1)
							 | 
						
					
						
							
								
									
										
										
										
											2020-10-27 15:51:32 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								              ! irc > 0 ==> number of iterations required to decode
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								              !  -1 = invalid params
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								              !  -2 = decode failed
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								              !  -3 = CRC mismatch
							 | 
						
					
						
							
								
									
										
										
										
											2021-02-25 12:45:07 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								           if(irc.ge.0) then
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								              idfbest=idf
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								              idtbest=idt
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								              ndistbest=ndist
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								              nrc=irc
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								              go to 100
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								           endif
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-30 14:13:37 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        enddo  ! ibw (b90 loop)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								     enddo  ! idt (DT loop)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  enddo  ! idf (f0 loop)
							 | 
						
					
						
							
								
									
										
										
										
											2020-12-27 15:27:26 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-29 10:00:33 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								100 if(irc.ge.0) then
							 | 
						
					
						
							
								
									
										
										
										
											2021-01-14 13:13:40 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								     idec=iaptype
							 | 
						
					
						
							
								
									
										
										
										
											2020-10-30 14:52:58 -04:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								     snr2=esnodb - db(2500.0/baud)
							 | 
						
					
						
							
								
									
										
										
										
											2021-01-13 11:07:20 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								     xdt1=xdt0 +  nsps2*ndt/(16.0*6000.0)
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-13 13:40:16 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								     f1=f0 + 0.5*baud*ndf
							 | 
						
					
						
							
								
									
										
										
										
											2020-10-27 13:08:07 -04:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  endif
							 | 
						
					
						
							
								
									
										
										
										
											2020-11-02 15:59:10 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2020-10-27 13:08:07 -04:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								  return
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								end subroutine q65_loops
							 |