Tweak decoder for better decodes under poor conditions
This commit is contained in:
parent
4321bd5e75
commit
6201de8c12
@ -1,126 +0,0 @@
|
|||||||
Quick Start for DXpedition Mode
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
These notes are intended for operators already familiar with WSJT-X
|
|
||||||
and FT8 mode. QSOs between the Dxpedition ("Fox") and other stations
|
|
||||||
("Hounds") are completed with as little as one transmission per Hound,
|
|
||||||
as in the following examples:
|
|
||||||
|
|
||||||
----------------------------------------------------------------------------
|
|
||||||
Fox (300-600 Hz) Hounds
|
|
||||||
----------------------------------------------------------------------------
|
|
||||||
1. CQ KH1DX AJ10
|
|
||||||
2. KH1DX K1ABC FN42, KH1DX W9XYZ EN37, ...
|
|
||||||
3. K1ABC KH1DX -13
|
|
||||||
4. KH1DX K1ABC R-11
|
|
||||||
5. K1ABC RR73; W9XYZ <KH1DX> -17
|
|
||||||
6. KH1DX W9XYZ R-16
|
|
||||||
7. W9XYZ RR73; G4AAA <KH1DX> -09
|
|
||||||
8. ...
|
|
||||||
----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Everybody sets dial frequency to an agreed number and uses CAT control
|
|
||||||
with Split Operation (either *Rig* or *Fake It*). Fox transmits up to
|
|
||||||
5 signals simultaneously, at audio frequencies 300, 360, ... 540
|
|
||||||
Hz. Hounds make initial calls (e.g., line 2 above) anywhere in the
|
|
||||||
range 1000 - 4000 Hz. They send "R+rpt" 350 Hz above the frequency
|
|
||||||
where Fox called them.
|
|
||||||
|
|
||||||
|
|
||||||
INSTRUCTIONS FOR FOX
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
1. Start WSJT-X in FT8 mode. Select *Fox* on the *Settings ->
|
|
||||||
Advanced tab*. On the main window, check *Tx even/1st*, *Auto Seq*,
|
|
||||||
and *Hold Tx Freq*; uncheck *Call 1st*. Set *Tx 300 Hz* and select
|
|
||||||
Tab 3.
|
|
||||||
|
|
||||||
2. In Fox mode the left window (called "Band Activity" in normal FT8
|
|
||||||
mode) is labeled "Stations calling DXpedition <MyCall>". It will be
|
|
||||||
filled with a sorted list of calling Hounds. You can sort by Call,
|
|
||||||
Grid, S/N, Distance, or Random order by using the comboBox at top
|
|
||||||
right of Tab 3. You can limit the displayed Hound callsigns to those
|
|
||||||
no stronger than *Max dB*. Fox might use this feature to discourage
|
|
||||||
Hounds from engaging in a QRO arms race.
|
|
||||||
|
|
||||||
3. *N Slots* sets the number of simultaneous Fox signals to be used.
|
|
||||||
Fox carries out as many as *N Slots* QSOs simultaneously.
|
|
||||||
|
|
||||||
4. *Repeats* sets the maximum number of repeat transmissions of the
|
|
||||||
same message. A QSO is aborted when this number would be exceeded.
|
|
||||||
|
|
||||||
5. The *CQ* comboBox on Tab 3 offers a selection of directed CQ
|
|
||||||
messages. *Reset* clears the QSO queue.
|
|
||||||
|
|
||||||
6. The Fox operator's main task is to select Hounds to be called and
|
|
||||||
worked. The text box on Tab 3 holds the "QSO queue": a list of Hound
|
|
||||||
calls to be worked. Hit Enter to select the top callsign from the
|
|
||||||
sorted list of callers (left window), or double-click on any
|
|
||||||
particular call. Either actiion moves that Hound into the "QSO
|
|
||||||
queue".
|
|
||||||
|
|
||||||
7. The right window displays decodes of signals below 1000 Hz.
|
|
||||||
Normally these should include only Hound messages containing "R+rpt"
|
|
||||||
and Fox's own transmissions.
|
|
||||||
|
|
||||||
8. To get things started, toggle *Enable Tx* to red. If a Hound call
|
|
||||||
is available in the QSO queue, that station will be called. If the
|
|
||||||
QSO queue is empty, Fox calls CQ.
|
|
||||||
|
|
||||||
9. If you're using Nslots = 2 or higher, your signal no longer has
|
|
||||||
a constant envelope. To avoid producing intermod sidebands you need
|
|
||||||
to ensure linearity in your Tx system. One way to get things about right
|
|
||||||
is to use the WSJT-X *Tune* button to generate a pure tone. Reduce the
|
|
||||||
Tx audio level until your power output decreases by 10% or so. Use this
|
|
||||||
level for your Fox transmissions.
|
|
||||||
|
|
||||||
NOTE: If you are generating Nslots signals, the average power in each one
|
|
||||||
will be 1/Nslots^2 of its normal value for single-signal transmissions.
|
|
||||||
|
|
||||||
Nslots Relative dB
|
|
||||||
-------------------
|
|
||||||
1 0
|
|
||||||
2 -6
|
|
||||||
3 -9.5
|
|
||||||
4 -12
|
|
||||||
5 -14
|
|
||||||
|
|
||||||
|
|
||||||
The following features are not yet implemented for Fox:
|
|
||||||
|
|
||||||
1. Enforce all required settings
|
|
||||||
2. Tx message timeout
|
|
||||||
3. Manual abort of selected QSO
|
|
||||||
4. All Tx and Rx messages to all.txt
|
|
||||||
5. Additional sort criteria for Hound calls
|
|
||||||
6. Selectable timeout for keeping Hounds in the sorted list
|
|
||||||
7. Display number of active callers
|
|
||||||
8. Display QSO rate
|
|
||||||
|
|
||||||
|
|
||||||
INSTRUCTIONS FOR HOUND
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
1. Start WSJT-X in FT8 mode. Select *Hound* On the *Settings ->
|
|
||||||
Advanced* tab. On the main window check *Auto Seq* and uncheck *Tx
|
|
||||||
even/1st*, *Call 1st*, and *Hold Tx Freq*. Set *Tx nnnn Hz* to some
|
|
||||||
frequency between 1000 and 4000 Hz, and select *Tab 1*. Enter Fox's
|
|
||||||
callsign and locator in DX Call and DX Grid, select Tx1, and start
|
|
||||||
*Monitor*.
|
|
||||||
|
|
||||||
2. When you have copied Fox, hit *Enable Tx* to call him. You may
|
|
||||||
keep calling until he answers. You may wish to move your TxFreq
|
|
||||||
around, hoping to find a clear calling frequency.
|
|
||||||
|
|
||||||
3. When you are called by Fox with a signal report, your next
|
|
||||||
transmission will automatically be sent as Tx3 ("R+rpt"). When Fox
|
|
||||||
receives that message he responds with "RR73", and your QSO is
|
|
||||||
complete!
|
|
||||||
|
|
||||||
|
|
||||||
The following features are not yet implemented for Hound:
|
|
||||||
|
|
||||||
1. Force all required settings
|
|
||||||
2. React properly to directed CQs from Fox
|
|
||||||
3. Disable Tx2, 4, 5, 6
|
|
||||||
4. For Tx1, enforce TxFreq >= 1000 Hz
|
|
@ -5,15 +5,23 @@ subroutine ft8_downsample(dd,newdat,f0,c1)
|
|||||||
parameter (NMAX=15*12000,NSPS=1920)
|
parameter (NMAX=15*12000,NSPS=1920)
|
||||||
parameter (NFFT1=192000,NFFT2=3200) !192000/60 = 3200
|
parameter (NFFT1=192000,NFFT2=3200) !192000/60 = 3200
|
||||||
|
|
||||||
logical newdat
|
logical newdat,first
|
||||||
complex c1(0:NFFT2-1)
|
complex c1(0:NFFT2-1)
|
||||||
complex cx(0:NFFT1/2)
|
complex cx(0:NFFT1/2)
|
||||||
real dd(NMAX),x(NFFT1)
|
real dd(NMAX),x(NFFT1),taper(0:100)
|
||||||
equivalence (x,cx)
|
equivalence (x,cx)
|
||||||
save cx
|
data first/.true./
|
||||||
|
save cx,first,taper
|
||||||
|
|
||||||
|
if(first) then
|
||||||
|
pi=4.0*atan(1.0)
|
||||||
|
do i=0,100
|
||||||
|
taper(i)=0.5*(1.0+cos(i*pi/100))
|
||||||
|
enddo
|
||||||
|
first=.false.
|
||||||
|
endif
|
||||||
if(newdat) then
|
if(newdat) then
|
||||||
! Data in dd have changed, recompute the long FFT
|
! Data in dd have changed, recompute the long FFT
|
||||||
x(1:NMAX)=dd
|
x(1:NMAX)=dd
|
||||||
x(NMAX+1:NFFT1)=0. !Zero-pad the x array
|
x(NMAX+1:NFFT1)=0. !Zero-pad the x array
|
||||||
call four2a(cx,NFFT1,1,-1,0) !r2c FFT to freq domain
|
call four2a(cx,NFFT1,1,-1,0) !r2c FFT to freq domain
|
||||||
@ -23,9 +31,9 @@ subroutine ft8_downsample(dd,newdat,f0,c1)
|
|||||||
df=12000.0/NFFT1
|
df=12000.0/NFFT1
|
||||||
baud=12000.0/NSPS
|
baud=12000.0/NSPS
|
||||||
i0=nint(f0/df)
|
i0=nint(f0/df)
|
||||||
ft=f0+8.0*baud
|
ft=f0+8.5*baud
|
||||||
it=min(nint(ft/df),NFFT1/2)
|
it=min(nint(ft/df),NFFT1/2)
|
||||||
fb=f0-1.0*baud
|
fb=f0-1.5*baud
|
||||||
ib=max(1,nint(fb/df))
|
ib=max(1,nint(fb/df))
|
||||||
k=0
|
k=0
|
||||||
c1=0.
|
c1=0.
|
||||||
@ -33,6 +41,8 @@ subroutine ft8_downsample(dd,newdat,f0,c1)
|
|||||||
c1(k)=cx(i)
|
c1(k)=cx(i)
|
||||||
k=k+1
|
k=k+1
|
||||||
enddo
|
enddo
|
||||||
|
c1(0:100)=c1(0:100)*taper(100:0:-1)
|
||||||
|
c1(k-1-100:k-1)=c1(k-1-100:k-1)*taper
|
||||||
c1=cshift(c1,i0-ib)
|
c1=cshift(c1,i0-ib)
|
||||||
call four2a(c1,NFFT2,1,1,1) !c2c FFT back to time domain
|
call four2a(c1,NFFT2,1,1,1) !c2c FFT back to time domain
|
||||||
fac=1.0/sqrt(float(NFFT1)*NFFT2)
|
fac=1.0/sqrt(float(NFFT1)*NFFT2)
|
||||||
|
@ -28,7 +28,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
|
|||||||
integer nappasses(0:5) !Number of decoding passes to use for each QSO state
|
integer nappasses(0:5) !Number of decoding passes to use for each QSO state
|
||||||
integer naptypes(0:5,4) ! (nQSOProgress, decoding pass) maximum of 4 passes for now
|
integer naptypes(0:5,4) ! (nQSOProgress, decoding pass) maximum of 4 passes for now
|
||||||
integer*1, target:: i1hiscall(12)
|
integer*1, target:: i1hiscall(12)
|
||||||
complex cd0(3200)
|
complex cd0(0:3199)
|
||||||
complex ctwk(32)
|
complex ctwk(32)
|
||||||
complex csymb(32)
|
complex csymb(32)
|
||||||
logical first,newdat,lsubtract,lapon,lapcqonly,nagain
|
logical first,newdat,lsubtract,lapon,lapcqonly,nagain
|
||||||
@ -126,7 +126,8 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
|
|||||||
do k=1,NN
|
do k=1,NN
|
||||||
i1=ibest+(k-1)*32
|
i1=ibest+(k-1)*32
|
||||||
csymb=cmplx(0.0,0.0)
|
csymb=cmplx(0.0,0.0)
|
||||||
if( i1.ge.1 .and. i1+31 .le. NP2 ) csymb=cd0(i1:i1+31)
|
!if( i1.ge.1 .and. i1+31 .le. NP2 ) csymb=cd0(i1:i1+31)
|
||||||
|
if( i1.ge.0 .and. i1+31 .le. NP2-1 ) csymb=cd0(i1:i1+31)
|
||||||
call four2a(csymb,32,1,-1,1)
|
call four2a(csymb,32,1,-1,1)
|
||||||
s2(0:7,k)=abs(csymb(1:8))/1e3
|
s2(0:7,k)=abs(csymb(1:8))/1e3
|
||||||
enddo
|
enddo
|
||||||
@ -181,7 +182,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, &
|
|||||||
bmetap(i2)=r2
|
bmetap(i2)=r2
|
||||||
bmetap(i1)=r1
|
bmetap(i1)=r1
|
||||||
! Max log metric
|
! Max log metric
|
||||||
psl=log(ps)
|
psl=log(ps+1e-32)
|
||||||
r1=max(psl(1),psl(3),psl(5),psl(7))-max(psl(0),psl(2),psl(4),psl(6))
|
r1=max(psl(1),psl(3),psl(5),psl(7))-max(psl(0),psl(2),psl(4),psl(6))
|
||||||
r2=max(psl(2),psl(3),psl(6),psl(7))-max(psl(0),psl(1),psl(4),psl(5))
|
r2=max(psl(2),psl(3),psl(6),psl(7))-max(psl(0),psl(1),psl(4),psl(5))
|
||||||
r4=max(psl(4),psl(5),psl(6),psl(7))-max(psl(0),psl(1),psl(2),psl(3))
|
r4=max(psl(4),psl(5),psl(6),psl(7))-max(psl(0),psl(1),psl(2),psl(3))
|
||||||
|
@ -37,11 +37,6 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,s,candidate,ncand,sbase)
|
|||||||
savg=savg + s(1:NH1,j) !Average spectrum
|
savg=savg + s(1:NH1,j) !Average spectrum
|
||||||
enddo
|
enddo
|
||||||
call baseline(savg,nfa,nfb,sbase)
|
call baseline(savg,nfa,nfb,sbase)
|
||||||
! savg=savg/NHSYM
|
|
||||||
! do i=1,NH1
|
|
||||||
! write(51,3051) i*df,savg(i),db(savg(i))
|
|
||||||
!3051 format(f10.3,e12.3,f12.3)
|
|
||||||
! enddo
|
|
||||||
|
|
||||||
ia=max(1,nint(nfa/df))
|
ia=max(1,nint(nfa/df))
|
||||||
ib=nint(nfb/df)
|
ib=nint(nfb/df)
|
||||||
@ -49,6 +44,9 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,s,candidate,ncand,sbase)
|
|||||||
nfos=NFFT1/NSPS ! # frequency bin oversampling factor
|
nfos=NFFT1/NSPS ! # frequency bin oversampling factor
|
||||||
jstrt=0.5/tstep
|
jstrt=0.5/tstep
|
||||||
|
|
||||||
|
candidate0=0.
|
||||||
|
k=0
|
||||||
|
|
||||||
do i=ia,ib
|
do i=ia,ib
|
||||||
do j=-JZ,+JZ
|
do j=-JZ,+JZ
|
||||||
ta=0.
|
ta=0.
|
||||||
@ -95,20 +93,18 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,s,candidate,ncand,sbase)
|
|||||||
iz=ib-ia+1
|
iz=ib-ia+1
|
||||||
call indexx(red(ia:ib),iz,indx)
|
call indexx(red(ia:ib),iz,indx)
|
||||||
ibase=indx(nint(0.40*iz)) - 1 + ia
|
ibase=indx(nint(0.40*iz)) - 1 + ia
|
||||||
|
if(ibase.lt.1) ibase=1
|
||||||
|
if(ibase.gt.nh1) ibase=nh1
|
||||||
base=red(ibase)
|
base=red(ibase)
|
||||||
red=red/base
|
red=red/base
|
||||||
|
|
||||||
candidate0=0.
|
do i=1,min(200,iz)
|
||||||
k=0
|
n=ia + indx(iz+1-i) - 1
|
||||||
do i=1,200
|
if(red(n).lt.syncmin.or.isnan(red(n)).or.k.eq.200) exit
|
||||||
ji=iz+1-1
|
k=k+1
|
||||||
if(ji.eq.0) exit
|
candidate0(1,k)=n*df
|
||||||
n=ia + indx(ji) - 1
|
candidate0(2,k)=(jpeak(n)-1)*tstep
|
||||||
if(red(n).lt.syncmin) exit
|
candidate0(3,k)=red(n)
|
||||||
if(k.lt.200) k=k+1
|
|
||||||
candidate0(1,k)=n*df
|
|
||||||
candidate0(2,k)=(jpeak(n)-1)*tstep
|
|
||||||
candidate0(3,k)=red(n)
|
|
||||||
enddo
|
enddo
|
||||||
ncand=k
|
ncand=k
|
||||||
|
|
||||||
@ -123,9 +119,6 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,s,candidate,ncand,sbase)
|
|||||||
if(candidate0(3,i).lt.candidate0(3,j)) candidate0(3,i)=0.
|
if(candidate0(3,i).lt.candidate0(3,j)) candidate0(3,i)=0.
|
||||||
endif
|
endif
|
||||||
enddo
|
enddo
|
||||||
! write(*,3001) i,candidate0(1,i-1),candidate0(1,i),candidate0(3,i-1), &
|
|
||||||
! candidate0(3,i)
|
|
||||||
!3001 format(i2,4f8.1)
|
|
||||||
endif
|
endif
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user