File: decode65a.f90

package info (click to toggle)
wsjtx 2.7.0%2Brepack-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 70,440 kB
  • sloc: cpp: 75,379; f90: 46,460; python: 27,241; ansic: 13,367; fortran: 2,382; makefile: 197; sh: 133
file content (154 lines) | stat: -rwxr-xr-x 4,303 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
subroutine decode65a(dd,npts,newdat,nqd,f0,nflip,mode65,ntrials,     &
     naggressive,ndepth,ntol,mycall,hiscall,hisgrid,nQSOProgress,    &
     ljt65apon,bVHF,sync2,a,dt,nft,nspecial,qual,nhist,nsmo,decoded)

! Apply AFC corrections to a candidate JT65 signal, then decode it.

  use jt65_mod
  use timer_module, only: timer

  parameter (NMAX=60*12000)          !Samples per 60 s
  real*4  dd(NMAX)                   !92 MB: raw data from Linrad timf2
  complex cx(NMAX/8)                 !Data at 1378.125 sps
  complex cx1(NMAX/8)                !Data at 1378.125 sps, offset by 355.3 Hz
  complex c5x(NMAX/32)               !Data at 344.53125 Hz
  complex c5a(512)
  real s2(66,126)
  real a(5)
  logical bVHF,first,ljt65apon
  character decoded*22,decoded_best*22
  character mycall*12,hiscall*12,hisgrid*6
  character*27 cr
  data first/.true./,jjjmin/1000/,jjjmax/-1000/,cr/'(C) 2016, Joe Taylor - K1JT'/
  save

! Mix sync tone to baseband, low-pass filter, downsample to 1378.125 Hz
  call timer('filbig  ',0)
  call filbig(dd,npts,f0,newdat,cx,n5,sq0)
  if(mode65.eq.4) call filbig(dd,npts,f0+355.297852,newdat,cx1,n5,sq0)
  call timer('filbig  ',1)
! NB: cx has sample rate 12000*77125/672000 = 1378.125 Hz

! Check for a shorthand message
  if(bVHF .and. mode65.ne.101) then
     call sh65(cx,n5,mode65,ntol,xdf,nspecial,sync2)
     if(nspecial.gt.0) then
        a=0.
        a(1)=xdf
        nflip=0
     endif
  endif
  if(nflip.eq.0) go to 900

! Find best DF, drift, curvature, and DT.  Start by downsampling to 344.53125 Hz
  call fil6521(cx,n5,c5x,n6)

  fsample=1378.125/4.

  call timer('afc65b  ',0)
! Best fit for DF, drift, and dt. fsample = 344.53125 S/s
  dtbest=dt
  call afc65b(c5x,n6,fsample,nflip,mode65,a,ccfbest,dtbest)
  call timer('afc65b  ',1)
  dtbest=dtbest+0.003628 !Remove decimation filter and coh. integrator delay
  dt=dtbest              !Return new, improved estimate of dt
  sync2=3.7e-4*ccfbest/sq0                    !Constant is empirical 
  if(mode65.eq.4) cx=cx1

! Apply AFC corrections to the time-domain signal
! Now we are back to using the 1378.125 Hz sample rate, enough to 
! accommodate the full JT65C bandwidth.
  a(3)=0
  call twkfreq65(cx,n5,a)

! Compute spectrum for each symbol.
  nsym=126
  nfft=512
  df=1378.125/nfft
  j=int(dtbest*1378.125)

  c5a=cmplx(0.0,0.0)
  do k=1,nsym
     do i=1,nfft
        j=j+1
        if(j.ge.1 .and. j.le.NMAX/8) then
           c5a(i)=cx(j)
        else
           c5a(i)=0.
        endif
     enddo
     call four2a(c5a,nfft,1,1,1)
     do i=1,512
        jj=i
        if(i.gt.256) jj=i-512
        s1(jj,k)=real(c5a(i))**2 + aimag(c5a(i))**2
     enddo
  enddo

  call timer('dec65b  ',0)
  qualbest=0.
  nftbest=0
  qual0=-1.e30
  minsmo=0
  maxsmo=0
  if(mode65.ge.2 .and. mode65.ne.101) then
     minsmo=nint(width/df)-1
     maxsmo=2*nint(width/df)
  endif
  nn=0
  do ismo=minsmo,maxsmo
     if(ismo.gt.0) then
        do j=1,126
           call smo121(s1(-255,j),512)
           if(j.eq.1) nn=nn+1
           if(nn.ge.4) then
              call smo121(s1(-255,j),512)
              if(j.eq.1) nn=nn+1
           endif
        enddo
     endif

     do i=1,66
        jj=i
        if(mode65.eq.2) jj=2*i-1
        if(mode65.eq.4) then
           ff=4*(i-1)*df - 355.297852
           jj=nint(ff/df)+1
        endif
        s2(i,1:126)=s1(jj,1:126)
     enddo
     nadd=ismo  !### ??? ###
     call decode65b(s2,nflip,nadd,mode65,ntrials,naggressive,ndepth,        &
          mycall,hiscall,hisgrid,nQSOProgress,ljt65apon,nqd,nft,qual,       &
          nhist,decoded)
     if(nft.eq.1) then
        nsmo=ismo
        param(9)=nsmo
        nsum=1
        exit
     else if(nft.eq.2) then
        if(qual.gt.qualbest) then
           decoded_best=decoded
           qualbest=qual
           nnbest=nn
           nsmobest=ismo
           nftbest=nft
        endif
     endif
     if(qual.lt.qual0) exit
     qual0=qual
  enddo

  if(nftbest.eq.2) then
     decoded=decoded_best
     qual=qualbest
     nsmo=nsmobest
     param(9)=nsmo
     nn=nnbest
     nft=nftbest
  endif

  call timer('dec65b  ',1)

900 return
end subroutine decode65a