mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 04:50:34 -04:00 
			
		
		
		
	Many changes: all-new JT9 decoder, supposedly faster and better.
Needs thorough testing, especially for drifting signals! git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@2774 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
		
							parent
							
								
									a5066037b4
								
							
						
					
					
						commit
						804e72d436
					
				
							
								
								
									
										31
									
								
								lib/afc9.f90
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								lib/afc9.f90
									
									
									
									
									
								
							| @ -1,28 +1,26 @@ | ||||
| subroutine afc9(cx,npts,nfast,fsample,nflip,ipol,xpol,           & | ||||
|      ndphi,iloop,a,ccfbest,dtbest) | ||||
| subroutine afc9(c3,npts,fsample,a,syncpk) | ||||
| 
 | ||||
|   logical xpol | ||||
|   complex cx(npts) | ||||
|   complex c3(0:npts-1) | ||||
|   real a(3),deltaa(3) | ||||
| 
 | ||||
|   a(1)=0.                                   !f0 | ||||
|   a(2)=0.                                   !f1 | ||||
|   a(3)=0.                                   !f2 | ||||
|   deltaa(1)=2.0 | ||||
|   deltaa(2)=2.0 | ||||
|   deltaa(3)=2.0 | ||||
|   deltaa(1)=0.2 | ||||
|   deltaa(2)=0.01 | ||||
|   deltaa(3)=0.01 | ||||
|   nterms=3 | ||||
| 
 | ||||
| ! Start the iteration | ||||
|   chisqr=0. | ||||
|   chisqr0=1.e6 | ||||
|   do iter=1,3                               !One iteration is enough? | ||||
|   do iter=1,4                               !One iteration is enough? | ||||
|      do j=1,nterms | ||||
|         chisq1=fchisq(cx,npts,nfast,fsample,nflip,a,ccfmax,dtmax) | ||||
|         chisq1=fchisq(c3,npts,fsample,a) | ||||
|         fn=0. | ||||
|         delta=deltaa(j) | ||||
| 10      a(j)=a(j)+delta | ||||
|         chisq2=fchisq(cx,npts,nfast,fsample,nflip,a,ccfmax,dtmax) | ||||
|         chisq2=fchisq(c3,npts,fsample,a) | ||||
|         if(chisq2.eq.chisq1) go to 10 | ||||
|         if(chisq2.gt.chisq1) then | ||||
|            delta=-delta                      !Reverse direction | ||||
| @ -33,7 +31,7 @@ subroutine afc9(cx,npts,nfast,fsample,nflip,ipol,xpol,           & | ||||
|         endif | ||||
| 20      fn=fn+1.0 | ||||
|         a(j)=a(j)+delta | ||||
|         chisq3=fchisq(cx,npts,nfast,fsample,nflip,a,ccfmax,dtmax) | ||||
|         chisq3=fchisq(c3,npts,fsample,a) | ||||
|         if(chisq3.lt.chisq2) then | ||||
|            chisq1=chisq2 | ||||
|            chisq2=chisq3 | ||||
| @ -44,14 +42,17 @@ subroutine afc9(cx,npts,nfast,fsample,nflip,ipol,xpol,           & | ||||
|         delta=delta*(1./(1.+(chisq1-chisq2)/(chisq3-chisq2))+0.5) | ||||
|         a(j)=a(j)-delta | ||||
|         deltaa(j)=deltaa(j)*fn/3. | ||||
| !        write(*,4000) iter,j,a,deltaa,-chisq2 | ||||
| !4000    format(i1,i2,6f10.4,f9.3) | ||||
|      enddo | ||||
|      chisqr=fchisq(cx,npts,nfast,fsample,nflip,a,ccfmax,dtmax) | ||||
|      if(chisqr/chisqr0.gt.0.9999) go to 30 | ||||
|      chisqr=fchisq(c3,npts,fsample,a) | ||||
|      if(chisqr/chisqr0.gt.0.9999) exit | ||||
|      chisqr0=chisqr | ||||
|   enddo | ||||
| 
 | ||||
| 30 ccfbest=ccfmax * (1378.125/fsample)**2 | ||||
|   dtbest=dtmax | ||||
|   syncpk=-chisqr | ||||
| !  write(*,4001) a,deltaa,-chisq2 | ||||
| !4001 format(3x,6f10.4,f9.3) | ||||
| 
 | ||||
|   return | ||||
| end subroutine afc9 | ||||
|  | ||||
| @ -83,7 +83,7 @@ subroutine decode9(i1SoftSymbols,limit,nlim,msg) | ||||
|      call packbits(i1DecodedBits,12,6,i4Decoded6BitWords) | ||||
|      call unpackmsg(i4Decoded6BitWords,msg)                !Unpack decoded msg | ||||
|      if(index(msg,'000AAA ').gt.0) msg='                      ' | ||||
|      if(index(msg,'15P6715P67WCV').gt.0) msg='                      ' | ||||
| !     if(index(msg,'15P6715P67WCV').gt.0) msg='                      ' | ||||
|   endif | ||||
| 
 | ||||
|   return | ||||
|  | ||||
| @ -15,6 +15,7 @@ subroutine decoder(ss,c0) | ||||
|   integer*2 id2 | ||||
|   integer ii(1) | ||||
|   complex c0(NDMAX) | ||||
|   complex c1(NDMAX) | ||||
|   common/npar/nutc,ndiskdat,ntrperiod,nfqso,newdat,npts8,nfa,nfb,ntol,  & | ||||
|        kin,nzhsym,nsave,nagain,ndepth,nrxlog,nfsample,datetime | ||||
|   common/tracer/limtrace,lu | ||||
| @ -75,37 +76,43 @@ subroutine decoder(ss,c0) | ||||
| 
 | ||||
|   nRxLog=0 | ||||
|   fgood=0. | ||||
|   df8=1500.0/(nsps/8) | ||||
|   nsps8=nsps/8 | ||||
|   df8=1500.0/nsps8 | ||||
|   sbest=0. | ||||
| 
 | ||||
| 10 ii=maxloc(ccfred(ia:ib)) | ||||
|   i=ii(1) + ia - 1 | ||||
|   f=(i-1)*df3 | ||||
|   if((i.eq.ipk .or. ccfred(i).ge.3.0) .and. abs(f-fgood).gt.10.0*df8) then | ||||
|      call timer('spec9   ',0) | ||||
|      call spec9(c0,npts8,nsps,f,fpk,xdt,snr,i1SoftSymbols) | ||||
|      call timer('spec9   ',1) | ||||
| !     call timer('spec9   ',0) | ||||
| !     call spec9(c0,npts8,nsps,f,fpk,xdt,snr,i1SoftSymbols) | ||||
| !     call timer('spec9   ',1) | ||||
| 
 | ||||
|      call timer('test9   ',0) | ||||
|      fpk=1000.0 + df3*(i-1) | ||||
|      c1(1:npts8)=conjg(c0(1:npts8)) | ||||
|      call test9(c1,npts8,nsps8,fpk,syncpk,snrdb,xdt,freq,drift,i1SoftSymbols) | ||||
|      call timer('test9   ',1) | ||||
| 
 | ||||
|      call timer('decode9 ',0) | ||||
|      call decode9(i1SoftSymbols,limit,nlim,msg) | ||||
|      call timer('decode9 ',1) | ||||
|   | ||||
|      sync=(ccfred(i)-1.0)/2.0 | ||||
|      sync=(syncpk-1.0)/2.0 | ||||
|      if(sync.lt.0.0) sync=0.0 | ||||
|      nsync=sync | ||||
|      if(nsync.gt.10) nsync=10 | ||||
|      nsnr=nint(snr) | ||||
|      drift=0.0 | ||||
|      nsnr=nint(snrdb) | ||||
| 
 | ||||
|      if(ccfred(i).gt.sbest .and. fgood.eq.0.0) then | ||||
|         sbest=ccfred(i) | ||||
|         write(line,fmt) nutc,nsync,nsnr,xdt,1000.0+fpk,drift | ||||
|      if(sync.gt.sbest .and. fgood.eq.0.0) then | ||||
|         sbest=sync | ||||
|         write(line,fmt) nutc,nsync,nsnr,xdt,freq,drift | ||||
|         if(nsync.gt.0) nsynced=1 | ||||
|      endif | ||||
| 
 | ||||
|      if(msg.ne.'                      ') then | ||||
|         write(*,fmt) nutc,nsync,nsnr,xdt,1000.0+fpk,drift,msg | ||||
|         write(14,fmt14) nutc,nsync,nsnr,xdt,1000.0+fpk,drift,ntrMinutes,nlim,msg | ||||
|         write(*,fmt) nutc,nsync,nsnr,xdt,freq,drift,msg | ||||
|         write(14,fmt14) nutc,nsync,nsnr,xdt,freq,drift,ntrMinutes,nlim,msg | ||||
|         fgood=f | ||||
|         nsynced=1 | ||||
|         ndecoded=1 | ||||
|  | ||||
| @ -1,69 +1,42 @@ | ||||
| real function fchisq(cx,npts,nfast,fsample,nflip,a,ccfmax,dtmax) | ||||
| real function fchisq(c3,npts,fsample,a) | ||||
| 
 | ||||
|   parameter (NMAX=60*96000)          !Samples per 60 s | ||||
|   complex cx(npts) | ||||
|   parameter (NMAX=85*16) | ||||
|   complex c3(npts) | ||||
|   complex c4(NMAX) | ||||
|   real a(3) | ||||
|   complex w,wstep,za,zb,z | ||||
|   real ss(3000) | ||||
|   complex csx(0:NMAX/64) | ||||
|   data twopi/6.283185307/a1,a2,a3/99.,99.,99./ | ||||
|   complex z | ||||
|   complex w,wstep | ||||
|   data a1,a2,a3/99.,99.,99./ | ||||
|   include 'jt9sync.f90' | ||||
|   save | ||||
| 
 | ||||
|   call timer('fchisq  ',0) | ||||
|   baud=nfast*11025.0/4096.0 | ||||
|   nsps=nint(fsample/baud)                  !Samples per symbol | ||||
|   nsph=nsps/2                              !Samples per half-symbol | ||||
|   ndiv=16                                  !Output ss() steps per symbol | ||||
|   nout=ndiv*npts/nsps | ||||
|   dtstep=1.0/(ndiv*baud)                   !Time per output step | ||||
| 
 | ||||
|   if(a(1).ne.a1 .or. a(2).ne.a2 .or. a(3).ne.a3) then | ||||
|      a1=a(1) | ||||
|      a2=a(2) | ||||
|      a3=a(3) | ||||
| 
 | ||||
| ! Mix and integrate the complex signal | ||||
|      csx(0)=0. | ||||
|      w=1.0 | ||||
|      x0=0.5*(npts+1) | ||||
|      s=2.0/npts | ||||
|      do i=1,npts | ||||
|         x=s*(i-x0) | ||||
|         if(mod(i,100).eq.1) then | ||||
|            p2=1.5*x*x - 0.5 | ||||
| !          p3=2.5*(x**3) - 1.5*x | ||||
| !          p4=4.375*(x**4) - 3.75*(x**2) + 0.375 | ||||
|            dphi=(a(1) + x*a(2) + p2*a(3)) * (twopi/fsample) | ||||
|            wstep=cmplx(cos(dphi),sin(dphi)) | ||||
|      call twkfreq(c3,c4,npts,fsample,a) | ||||
|   endif | ||||
|         w=w*wstep | ||||
|         csx(i)=csx(i-1) + w*cx(i) | ||||
| 
 | ||||
| ! Get sync power. | ||||
|   nspsd=16 | ||||
|   sum1=0. | ||||
|   sum0=0. | ||||
|   k=-1 | ||||
|   do i=1,85 | ||||
|      z=0. | ||||
|      do j=1,nspsd | ||||
|         k=k+1 | ||||
|         z=z+c4(k+1) | ||||
|      enddo | ||||
|   endif | ||||
| 
 | ||||
| ! Compute 1/2-symbol powers at 1/16-symbol steps. | ||||
|   fac=1.e-4 | ||||
| 
 | ||||
|   do i=1,nout | ||||
|      j=i*nsps/ndiv | ||||
|      k=j-nsph | ||||
|      ss(i)=0. | ||||
|      if(k.ge.1) then | ||||
|         za=csx(j)-csx(k) | ||||
|         ss(i)=fac*(real(za)**2 + aimag(za)**2) | ||||
|      pp=real(z)**2 + aimag(z)**2      | ||||
|      if(isync(i).eq.1) then | ||||
|         sum1=sum1+pp | ||||
|      else | ||||
|         sum0=sum0+pp | ||||
|      endif | ||||
|   enddo | ||||
|   sync=(sum1/16.0)/(sum0/69.0) - 1.0 | ||||
|   fchisq=-sync | ||||
| 
 | ||||
|   ccfmax=0. | ||||
|   call timer('ccf2    ',0) | ||||
|   call ccf2(ss,nout,nflip,ccf,lagpk) | ||||
|   call timer('ccf2    ',1) | ||||
|   if(ccf.gt.ccfmax) then | ||||
|      ccfmax=ccf | ||||
|      dtmax=lagpk*dtstep | ||||
|   endif | ||||
|   fchisq=-ccfmax | ||||
| 
 | ||||
|   call timer('fchisq  ',1) | ||||
|   return | ||||
| end function fchisq | ||||
|  | ||||
							
								
								
									
										27
									
								
								lib/getlags.f90
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								lib/getlags.f90
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | ||||
| subroutine getlags(nsps8,lag0,lag1,lag2) | ||||
|   if(nsps8.eq.864) then | ||||
|      lag1=39 | ||||
|      lag2=291 | ||||
|      lag0=123 | ||||
|   else if(nsps8.eq.1920) then | ||||
|      lag1=70 | ||||
|      lag2=184 | ||||
|      lag0=108 | ||||
|   else if(nsps8.eq.5120) then | ||||
|      lag1=84 | ||||
|      lag2=129 | ||||
|      lag0=99 | ||||
|   else if(nsps8.eq.10368) then | ||||
|      lag1=91 | ||||
|      lag2=112 | ||||
|      lag0=98 | ||||
|   else if(nsps8.eq.31500) then | ||||
|      lag1=93 | ||||
|      lag2=102 | ||||
|      lag0=96 | ||||
|   else  | ||||
|      stop 'Error in getlags' | ||||
|   endif | ||||
| 
 | ||||
|   return | ||||
| end subroutine getlags | ||||
							
								
								
									
										30
									
								
								lib/jt9.f90
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								lib/jt9.f90
									
									
									
									
									
								
							| @ -18,6 +18,7 @@ program jt9 | ||||
|   character*33 line | ||||
|   integer*2 id2 | ||||
|   complex c0 | ||||
|   complex c1(NDMAX) | ||||
|   common/jt9com/ss(184,NSMAX),savg(NSMAX),c0(NDMAX),id2(NMAX),nutc,ndiskdat,  & | ||||
|        ntr,mousefqso,newdat,nfa,nfb,ntol,kin,nzhsym,nsynced,ndecoded | ||||
|   common/tracer/limtrace,lu | ||||
| @ -122,34 +123,39 @@ program jt9 | ||||
|      call timer('sync9   ',1) | ||||
| 
 | ||||
|      fgood=0. | ||||
|      df8=1500.0/(nsps/8) | ||||
|      nsps8=nsps/8 | ||||
|      df8=1500.0/nsps8 | ||||
|      sbest=0. | ||||
|      do i=ia,ib | ||||
|         f=(i-1)*df3 | ||||
|         if((i.eq.ipk .or. ccfred(i).ge.3.0) .and. f.gt.fgood+10.0*df8) then | ||||
|            call timer('spec9   ',0) | ||||
|            call spec9(c0,npts8,nsps,f,fpk,xdt,snrdb,i1SoftSymbols) | ||||
|            call timer('spec9   ',1) | ||||
| 
 | ||||
|            call timer('test9   ',0) | ||||
|            fpk=1000.0 + df3*(i-1) | ||||
|            c1(1:npts8)=conjg(c0(1:npts8)) | ||||
|            call test9(c1,npts8,nsps8,fpk,syncpk,snrdb,xdt,freq,drift,   & | ||||
|                 i1SoftSymbols) | ||||
|            call timer('test9   ',1) | ||||
| 
 | ||||
| 
 | ||||
|            call timer('decode9 ',0) | ||||
|            call decode9(i1SoftSymbols,limit,nlim,msg) | ||||
|            call timer('decode9 ',1) | ||||
|            snr=snrdb | ||||
|            sync=ccfred(i) - 2.0 | ||||
| 
 | ||||
|            sync=(syncpk-1.0)/2.0 | ||||
|            if(sync.lt.0.0) sync=0.0 | ||||
|            nsync=sync | ||||
|            if(nsync.gt.10) nsync=10 | ||||
|            nsnr=nint(snr) | ||||
|            width=0.0 | ||||
|            nsnr=nint(snrdb) | ||||
| 
 | ||||
|            if(ccfred(i).gt.sbest .and. fgood.eq.0.0) then | ||||
|               sbest=ccfred(i) | ||||
|               write(line,1010) nutc,nsync,nsnr,xdt,1000.0+fpk,width | ||||
|            if(sync.gt.sbest .and. fgood.eq.0.0) then | ||||
|               sbest=sync | ||||
|               write(line,1010) nutc,nsync,nsnr,xdt,freq,drift | ||||
|               if(nsync.gt.0) nsynced=1 | ||||
|            endif | ||||
| 
 | ||||
|            if(msg.ne.'                      ') then | ||||
|               write(*,1010) nutc,nsync,nsnr,xdt,1000.0+fpk,width,msg | ||||
|               write(*,1010) nutc,nsync,nsnr,xdt,freq,drift,msg | ||||
| 1010          format(i4.4,i4,i5,f6.1,f8.2,f6.2,3x,a22) | ||||
|               fgood=f | ||||
|               nsynced=1 | ||||
|  | ||||
| @ -55,9 +55,9 @@ program jt9sim | ||||
|   if(minutes.eq.30) nsps=252000 | ||||
|   if(nsps.eq.0) stop 'Bad value for minutes.' | ||||
|   f0=1500.d0                         !Center frequency (MHz) | ||||
|   if(minutes.eq.5)  f0=1100. | ||||
|   if(minutes.eq.10) f0=1050. | ||||
|   if(minutes.eq.30) f0=1025. | ||||
| !  if(minutes.eq.5)  f0=1100. | ||||
| !  if(minutes.eq.10) f0=1050. | ||||
| !  if(minutes.eq.30) f0=1025. | ||||
|    | ||||
|   ihdr=0                             !Temporary ### | ||||
| 
 | ||||
|  | ||||
| @ -116,9 +116,6 @@ program jt9test | ||||
| 10   close(10) | ||||
| 
 | ||||
|      nsps8=nsps/8 | ||||
|      c1(0:npts8-1)=conjg(c0(1:npts8)) | ||||
|      call test9(c1,npts8,nsps8) | ||||
| 
 | ||||
|      iz=1000.0/df3 | ||||
|      nutc=nutc0 | ||||
| 
 | ||||
| @ -132,29 +129,33 @@ program jt9test | ||||
|      do i=ia,ib | ||||
|         f=(i-1)*df3 | ||||
|         if((i.eq.ipk .or. ccfred(i).ge.3.0) .and. f.gt.fgood+10.0*df8) then | ||||
|            call timer('spec9   ',0) | ||||
|            call spec9(c0,npts8,nsps,f,fpk,xdt,snrdb,i1SoftSymbols) | ||||
|            call timer('spec9   ',1) | ||||
| 
 | ||||
|            call timer('test9   ',0) | ||||
|            fpk=1000.0 + df3*(i-1) | ||||
|            c1(0:npts8-1)=conjg(c0(1:npts8)) | ||||
|            call test9(c1,npts8,nsps8,fpk,syncpk,snrdb,xdt,freq,drift,   & | ||||
|                 i1SoftSymbols) | ||||
|            call timer('test9   ',1) | ||||
| 
 | ||||
|            call timer('decode9 ',0) | ||||
|            call decode9(i1SoftSymbols,limit,nlim,msg) | ||||
|            call timer('decode9 ',1) | ||||
|            snr=snrdb | ||||
|            sync=ccfred(i) - 2.0 | ||||
|            sync=syncpk - 2.0 | ||||
|            if(sync.lt.0.0) sync=0.0 | ||||
|            nsync=sync | ||||
|            if(nsync.gt.10) nsync=10 | ||||
|            nsnr=nint(snr) | ||||
|            width=0.0 | ||||
| 
 | ||||
|            if(ccfred(i).gt.sbest .and. fgood.eq.0.0) then | ||||
|               sbest=ccfred(i) | ||||
|            if(sync.gt.sbest .and. fgood.eq.0.0) then | ||||
|               sbest=sync | ||||
|               write(line,1010) nutc,nsync,nsnr,xdt,1000.0+fpk,width | ||||
|               if(nsync.gt.0) nsynced=1 | ||||
|            endif | ||||
| 
 | ||||
|            if(msg.ne.'                      ') then | ||||
|               write(*,1010) nutc,nsync,nsnr,xdt,1000.0+fpk,width,msg | ||||
|               write(*,1010) nutc,nsync,nsnr,xdt,freq,drift,msg | ||||
| 1010          format(i4.4,i4,i5,f6.1,f8.2,f6.2,3x,a22) | ||||
|               fgood=f | ||||
|               nsynced=1 | ||||
|  | ||||
| @ -9,9 +9,7 @@ subroutine spec9(c0,npts8,nsps,fpk0,fpk,xdt,snrdb,i1SoftSymbols) | ||||
|   integer*1 i1SoftSymbolsScrambled(207) | ||||
|   integer*1 i1SoftSymbols(207) | ||||
|   integer*1 i1 | ||||
|   integer ig(0:7) | ||||
|   equivalence (i1,i4) | ||||
|   data ig/0,1,3,2,7,6,4,5/             !Gray code removal | ||||
|   include 'jt9sync.f90' | ||||
| 
 | ||||
| ! Fix up the data in c0() | ||||
|  | ||||
							
								
								
									
										193
									
								
								lib/test9.f90
									
									
									
									
									
								
							
							
						
						
									
										193
									
								
								lib/test9.f90
									
									
									
									
									
								
							| @ -1,24 +1,54 @@ | ||||
| subroutine test9(c0,npts8,nsps8) | ||||
| subroutine test9(c0,npts8,nsps8,fpk,syncpk,snrdb,xdt,freq,drift,i1SoftSymbols) | ||||
| 
 | ||||
|   parameter (NMAX=128*864) | ||||
|   parameter (NMAX=128*31500) | ||||
|   complex c0(0:npts8-1) | ||||
|   complex c1(0:NMAX-1) | ||||
|   complex c2(0:4096-1) | ||||
|   complex c3(0:4096-1) | ||||
|   complex c5(0:4096-1) | ||||
|   complex z | ||||
|   real p(0:3300) | ||||
|   real a(3),aa(3) | ||||
|   real ss2(0:8,85) | ||||
|   real ss3(0:7,69) | ||||
|   integer*1 i1SoftSymbolsScrambled(207) | ||||
|   integer*1 i1SoftSymbols(207) | ||||
|   integer*1 i1 | ||||
|   equivalence (i1,i4) | ||||
|   character*22 msg | ||||
| 
 | ||||
|   include 'jt9sync.f90' | ||||
| 
 | ||||
|   c1(0:npts8-1)=c0                         !Copy c0 into c1 | ||||
|   fac=1.e-4 | ||||
|   c1(0:npts8-1)=fac*c0                     !Copy c0 into c1 | ||||
|   do i=1,npts8-1,2 | ||||
|      c1(i)=-c1(i) | ||||
|   enddo | ||||
|   c1(npts8:)=0.                            !Zero the rest of c1 | ||||
|   nfft1=NMAX                               !Forward FFT length | ||||
|   nfft1=128*nsps8                          !Forward FFT length | ||||
|   nh1=nfft1/2 | ||||
|   df1=1500.0/nfft1 | ||||
|   call four2a(c1,nfft1,1,-1,1)             !Forward FFT | ||||
| 
 | ||||
|   ndown=54                                 !Downsample factor | ||||
| !  do i=0,nfft1-1 | ||||
| !     f=i*df1 | ||||
| !     pp=real(c1(i))**2 + aimag(c1(i))**2 | ||||
| !     write(50,3009) i,f,1.e-6*pp | ||||
| !3009 format(i8,f12.3,f12.3) | ||||
| !  enddo    | ||||
|    | ||||
|   ndown=nsps8/16                           !Downsample factor | ||||
|   nfft2=nfft1/ndown                        !Backward FFT length | ||||
|   nh2=nfft2/2 | ||||
|   fac=1.e-5 | ||||
|   c2(0:nh2)=fac*c1(0:nh2) | ||||
|   c2(nh2+1:nh2+nh2-1)=fac*c1(nfft1-nh2+1:nfft1-1) | ||||
|    | ||||
|   fshift=fpk-1500.0 | ||||
|   i0=nh1 + fshift/df1 | ||||
|   do i=0,nfft2-1 | ||||
|      j=i0+i | ||||
|      if(i.gt.nh2) j=j-nfft2 | ||||
|      c2(i)=c1(j) | ||||
|   enddo | ||||
| 
 | ||||
|   call four2a(c2,nfft2,1,1,1)              !Backward FFT | ||||
| 
 | ||||
|   nspsd=nsps8/ndown | ||||
| @ -28,14 +58,18 @@ subroutine test9(c0,npts8,nsps8) | ||||
|   p=0. | ||||
|   i0=5*nspsd | ||||
|   do i=0,nz-1 | ||||
|      z=sum(c2(max(i-(nspsd-1),0):i))       !Integrate | ||||
|      z=1.e-3*sum(c2(max(i-(nspsd-1),0):i))       !Integrate | ||||
|      p(i0+i)=real(z)**2 + aimag(z)**2      !Symbol power at freq=0 | ||||
| ! Option here for coherent processing ? | ||||
| !     write(53,3301) i,z,p(i0+i),atan2(aimag(z),real(z)) | ||||
| !3301 format(i6,4e12.3) | ||||
|   enddo | ||||
| 
 | ||||
|   iz=85*nspsd | ||||
|   lagmax=13*nspsd | ||||
|   do lag=0,lagmax                           | ||||
|   call getlags(nsps8,lag0,lag1,lag2) | ||||
|   tsymbol=nsps8/1500.0 | ||||
|   dtlag=tsymbol/nspsd | ||||
|   smax=0. | ||||
|   do lag=lag1,lag2 | ||||
|      sum0=0. | ||||
|      sum1=0. | ||||
|      j=-nspsd | ||||
| @ -48,9 +82,140 @@ subroutine test9(c0,npts8,nsps8) | ||||
|         endif | ||||
|      enddo | ||||
|      ss=(sum1/16.0)/(sum0/69.0) - 1.0 | ||||
|      write(52,3001) lag,ss | ||||
| 3001 format(i5,f12.3) | ||||
|      xdt=(lag-lag0)*dtlag | ||||
| !     write(52,3001) lag,xdt,ss | ||||
| !3001 format(i5,2f12.3) | ||||
|      if(ss.gt.smax) then | ||||
|         smax=ss | ||||
|         lagpk=lag | ||||
|      endif | ||||
|   enddo | ||||
| 
 | ||||
|   xdt=(lagpk-lag0)*dtlag | ||||
| 
 | ||||
|   iz=nspsd*85 | ||||
|   do i=0,iz-1 | ||||
|      j=i+lagpk-i0-nspsd+1 | ||||
|      if(j.ge.0 .and. j.le.nz) then | ||||
|         c3(i)=c2(j) | ||||
|      else | ||||
|         c3(i)=0. | ||||
|      endif | ||||
|   enddo | ||||
| 
 | ||||
|   sum1=0. | ||||
|   sum0=0. | ||||
|   k=-1 | ||||
|   do i=1,85 | ||||
|      z=0. | ||||
|      do j=1,nspsd | ||||
|         k=k+1 | ||||
|         z=z+c3(k) | ||||
|      enddo | ||||
|      pp=real(z)**2 + aimag(z)**2      | ||||
|      if(isync(i).eq.1) then | ||||
|         sum1=sum1+pp | ||||
|      else | ||||
|         sum0=sum0+pp | ||||
|      endif | ||||
|   enddo | ||||
|   ss=(sum1/16.0)/(sum0/69.0) - 1.0 | ||||
| 
 | ||||
|   fsample=1500.0/ndown | ||||
|   nptsd=nspsd*85 | ||||
|   a=0. | ||||
|   call afc9(c3,nptsd,fsample,a,syncpk) | ||||
|   call twkfreq(c3,c5,nptsd,fsample,a) | ||||
| 
 | ||||
|   aa(1)=-1500.0/nsps8 | ||||
|   aa(2)=0. | ||||
|   aa(3)=0. | ||||
|   do i=0,8 | ||||
|      if(i.ge.1) call twkfreq(c5,c5,nptsd,fsample,aa) | ||||
|      m=0 | ||||
|      k=-1 | ||||
|      do j=1,85 | ||||
|         z=0. | ||||
|         do n=1,nspsd | ||||
|            k=k+1 | ||||
|            z=z+c5(k) | ||||
|         enddo | ||||
|         ss2(i,j)=real(z)**2 + aimag(z)**2 | ||||
|         if(i.ge.1 .and. isync(j).eq.0) then | ||||
|            m=m+1 | ||||
|            ss3(i-1,m)=ss2(i,j) | ||||
|         endif | ||||
|      enddo | ||||
|   enddo | ||||
| 
 | ||||
| !### | ||||
|   ss=0. | ||||
|   sig=0. | ||||
|   do j=1,69 | ||||
|      smax=0. | ||||
|      do i=0,7 | ||||
|         smax=max(smax,ss3(i,j)) | ||||
|         ss=ss+ss3(i,j) | ||||
|      enddo | ||||
|      sig=sig+smax | ||||
|      ss=ss-smax | ||||
|   enddo | ||||
|   ave=ss/(69*7) | ||||
|   call pctile(ss2,9*85,50,xmed) | ||||
|   ss3=ss3/ave | ||||
| 
 | ||||
|   sig=sig/69. | ||||
|   df8=1500.0/nsps8 | ||||
|   t=max(1.0,sig/xmed - 1.0) | ||||
|   snrdb=db(t) - db(2500.0/df8) - 5.0 | ||||
| !  print*,'A',ave,xmed,sig,t,df8,snrdb | ||||
|       | ||||
|   m0=3 | ||||
|   k=0 | ||||
|   do j=1,69 | ||||
|         smax=0. | ||||
|         do i=0,7 | ||||
|            if(ss3(i,j).gt.smax) then | ||||
|               smax=ss3(i,j) | ||||
|               ipk=i | ||||
|            endif | ||||
|         enddo | ||||
| 
 | ||||
|      do m=m0-1,0,-1                   !Get bit-wise soft symbols | ||||
|         if(m.eq.2) then | ||||
|            r1=max(ss3(4,j),ss3(5,j),ss3(6,j),ss3(7,j)) | ||||
|            r0=max(ss3(0,j),ss3(1,j),ss3(2,j),ss3(3,j)) | ||||
|         else if(m.eq.1) then | ||||
|            r1=max(ss3(2,j),ss3(3,j),ss3(4,j),ss3(5,j)) | ||||
|            r0=max(ss3(0,j),ss3(1,j),ss3(6,j),ss3(7,j)) | ||||
|         else | ||||
|            r1=max(ss3(1,j),ss3(2,j),ss3(4,j),ss3(7,j)) | ||||
|            r0=max(ss3(0,j),ss3(3,j),ss3(5,j),ss3(6,j)) | ||||
|         endif | ||||
| 
 | ||||
|         k=k+1 | ||||
|         i4=nint(10.0*(r1-r0)) | ||||
|         if(i4.lt.-127) i4=-127 | ||||
|         if(i4.gt.127) i4=127 | ||||
|         i4=i4+128 | ||||
|         i1SoftSymbolsScrambled(k)=i1 | ||||
|      enddo | ||||
|   enddo | ||||
| 
 | ||||
|   call interleave9(i1SoftSymbolsScrambled,-1,i1SoftSymbols) | ||||
| !  limit=10000 | ||||
| !  call decode9(i1SoftSymbols,limit,nlim,msg) | ||||
| 
 | ||||
| !### | ||||
| !  do j=1,85 | ||||
| !     write(71,2101) j,nint(1.e-3*ss2(0:8,j)) | ||||
| !2101 format(i2,2x,9i6) | ||||
| !  enddo | ||||
|    | ||||
|   freq=1500.0 + fshift - a(1) | ||||
|   drift=a(2) | ||||
| !  write(*,1100) nutc,nsync,nsnr,xdt,freq,a(2),msg | ||||
| !1100 format(i4.4,i5,i5,f6.1,f9.2,f8.2,2x,a22) | ||||
| 
 | ||||
|   return | ||||
| end subroutine test9 | ||||
|  | ||||
							
								
								
									
										27
									
								
								lib/twkfreq.f90
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								lib/twkfreq.f90
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | ||||
| subroutine twkfreq(c3,c4,npts,fsample,a) | ||||
| 
 | ||||
|   complex c3(npts) | ||||
|   complex c4(npts) | ||||
|   complex w,wstep | ||||
|   real a(3) | ||||
|   data twopi/6.283185307/ | ||||
| 
 | ||||
| ! Mix the complex signal | ||||
|   w=1.0 | ||||
|   x0=0.5*(npts+1) | ||||
|   s=2.0/npts | ||||
|   do i=1,npts | ||||
|      x=s*(i-x0) | ||||
|      if(mod(i,100).eq.1) then | ||||
|         p2=1.5*x*x - 0.5 | ||||
| !          p3=2.5*(x**3) - 1.5*x | ||||
| !          p4=4.375*(x**4) - 3.75*(x**2) + 0.375 | ||||
|         dphi=(a(1) + x*a(2) + p2*a(3)) * (twopi/fsample) | ||||
|         wstep=cmplx(cos(dphi),sin(dphi)) | ||||
|      endif | ||||
|      w=w*wstep | ||||
|      c4(i)=w*c3(i) | ||||
|   enddo | ||||
| 
 | ||||
|   return | ||||
| end subroutine twkfreq | ||||
| @ -1,4 +1,4 @@ | ||||
| //-------------------------------------------------------------- MainWindow
 | ||||
| //------------------------------------------------------------- MainWindow
 | ||||
| #include "mainwindow.h" | ||||
| #include "ui_mainwindow.h" | ||||
| #include "devsetup.h" | ||||
|  | ||||
| @ -7,6 +7,7 @@ DefaultGroupName=wsjtx | ||||
| 
 | ||||
| [Files] | ||||
| Source: "c:\Users\joe\wsjt\wsjtx_install\wsjtx.exe";         DestDir: "{app}" | ||||
| Source: "c:\Users\joe\wsjt\wsjtx_install\jt9.exe";           DestDir: "{app}" | ||||
| Source: "c:\Users\joe\wsjt\wsjtx_install\wsjt.ico";          DestDir: "{app}" | ||||
| Source: "c:\Users\joe\wsjt\wsjtx_install\afmhot.dat";        DestDir: "{app}"; | ||||
| Source: "c:\Users\joe\wsjt\wsjtx_install\blue.dat";          DestDir: "{app}"; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user