File: js8b_decode.f90

package info (click to toggle)
js8call 2.2.0%2Bds-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, trixie
  • size: 22,416 kB
  • sloc: cpp: 563,285; f90: 9,265; ansic: 937; python: 132; sh: 93; makefile: 7
file content (162 lines) | stat: -rw-r--r-- 4,853 bytes parent folder | download | duplicates (3)
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
155
156
157
158
159
160
161
162
module js8b_decode

  type :: js8b_decoder
     procedure(js8b_decode_callback), pointer :: callback
   contains
     procedure :: decode
  end type js8b_decoder

  abstract interface
     subroutine js8b_decode_callback (this,sync,snr,dt,freq,decoded,nap,qual)
       import js8b_decoder
       implicit none
       class(js8b_decoder), intent(inout) :: this
       real, intent(in) :: sync
       integer, intent(in) :: snr
       real, intent(in) :: dt
       real, intent(in) :: freq
       character(len=37), intent(in) :: decoded
       integer, intent(in) :: nap 
       real, intent(in) :: qual 
     end subroutine js8b_decode_callback
  end interface

contains

  subroutine decode(this,callback,iwave,nQSOProgress,nfqso,nftx,newdat,  &
       nutc,nfa,nfb,nexp_decode,ndepth,nagain,lft8apon,lapcqonly,napwid, &
       mycall12,mygrid6,hiscall12,hisgrid6,syncStats)
!    use wavhdr
    use timer_module, only: timer
!    type(hdr) h
    use js8b_module

    class(js8b_decoder), intent(inout) :: this
    procedure(js8b_decode_callback) :: callback
    real s(NH1,NHSYM)
    real sbase(NH1)
    real candidate(3,NMAXCAND)
    real dd(NMAX)
    logical, intent(in) :: lft8apon,lapcqonly,nagain
    logical newdat,lsubtract,ldupe,bcontest,syncStats
    character*12 mycall12, hiscall12
    character*6 mygrid6,hisgrid6
    integer*2 iwave(NMAX)
    integer apsym(KK)
    character datetime*13,message*22,msg37*37
    character*22 allmessages(100)
    integer allsnrs(100)
    save s,dd

    icos=int(NCOSTAS)
    bcontest=iand(nexp_decode,128).ne.0
    this%callback => callback
    write(datetime,1001) nutc        !### TEMPORARY ###
1001 format("000000_",i6.6)

    dd=iwave
    ndecodes=0
    allmessages='                      '
    allsnrs=0
    ifa=nfa
    ifb=nfb
    if(nagain) then
       ifa=nfqso-10
       ifb=nfqso+10
    endif

    ! For now:
    ! ndepth=1: no subtraction, 1 pass, belief propagation only
    ! ndepth=2: subtraction, 3 passes, belief propagation only
    ! ndepth=3: subtraction, 3 passes, bp+osd
    ! ndepth=4: subtraction, 4 passes, bp+osd
    if(ndepth.eq.1) npass=1
    if(ndepth.eq.2) npass=3
    if(ndepth.ge.3) npass=4

    do ipass=1,npass
      newdat=.true.  ! Is this a problem? I hijacked newdat.
      syncmin=ASYNCMIN
      if(ipass.eq.1) then
        lsubtract=.true.
        if(ndepth.eq.1) lsubtract=.false.
      elseif(ipass.eq.2) then
        n2=ndecodes
        if(ndecodes.eq.0) cycle
        lsubtract=.true.
      elseif(ipass.eq.3) then
        n3=ndecodes
        if((ndecodes-n2).eq.0) cycle
        lsubtract=.true. 
      elseif(ipass.eq.4) then
        if((ndecodes-n3).eq.0) cycle
        lsubtract=.false. 
      endif 

      if(NWRITELOG.eq.1) then
        write(*,*) '<DecodeDebug> pass', ipass, 'of', npass, 'subtract', lsubtract
        flush(6)
      endif

      call timer('syncjs8 ',0)
      call syncjs8(dd,icos,ifa,ifb,syncmin,nfqso,s,candidate,ncand,sbase)
      call timer('syncjs8 ',1)

      if(NWRITELOG.eq.1) then
        write(*,*) '<DecodeDebug>', ncand, "candidates"
        flush(6)
      endif

      do icand=1,ncand
        sync=candidate(3,icand)
        f1=candidate(1,icand)
        xdt=candidate(2,icand)
        xbase=10.0**(0.1*(sbase(nint(f1/(12000.0/NFFT1)))-39.0)) ! 3.125Hz

        if(NWRITELOG.eq.1) then
          write(*,*) '<DecodeDebug> candidate', icand, 'f1', f1, 'sync', sync, 'xdt', xdt, 'xbase', xbase
          flush(6)
        endif

        call timer('js8dec  ',0)
        call js8dec(dd,icos,newdat,syncStats,nQSOProgress,nfqso,nftx,ndepth,lft8apon,       &
             lapcqonly,napwid,lsubtract,nagain,iaptype,mycall12,mygrid6,   &
             hiscall12,bcontest,sync,f1,xdt,xbase,apsym,nharderrors,dmin,  &
             nbadcrc,iappass,iera,msg37,xsnr)
        message=msg37(1:22)   !###
        nsnr=nint(xsnr) 
        xdt=xdt-ASTART
        hd=nharderrors+dmin

        if(NWRITELOG.eq.1) then
          write(*,*) '<DecodeDebug> candidate', icand, 'hard', hd, 'nbadcrc', nbadcrc
          flush(6)
        endif
        
        call timer('js8dec  ',1)
        if(nbadcrc.eq.0) then
           ldupe=.false.
           do id=1,ndecodes
              if(message.eq.allmessages(id).and.nsnr.le.allsnrs(id)) ldupe=.true.
           enddo
           if(.not.ldupe) then
              ndecodes=ndecodes+1
              allmessages(ndecodes)=message
              allsnrs(ndecodes)=nsnr
           endif
           if(.not.ldupe .and. associated(this%callback)) then
              qual=1.0-(nharderrors+dmin)/60.0 ! scale qual to [0.0,1.0]
              call this%callback(sync,nsnr,xdt,f1,msg37,iaptype,qual)
           endif
        endif

        if(NWRITELOG.eq.1) then
          write(*,*) '<DecodeDebug> ---'
          flush(6)
        endif
      enddo
  enddo
  return
  end subroutine decode

end module js8b_decode