From 6201de8c126f04657d65993867c2751604d4ef24 Mon Sep 17 00:00:00 2001 From: Jordan Sherer Date: Mon, 29 Oct 2018 01:09:17 -0400 Subject: [PATCH] Tweak decoder for better decodes under poor conditions --- lib/ft8/DXpedQuickStart.txt | 126 ------------------------------------ lib/ft8/ft8_downsample.f90 | 22 +++++-- lib/ft8/ft8b.f90 | 7 +- lib/ft8/sync8.f90 | 31 ++++----- 4 files changed, 32 insertions(+), 154 deletions(-) delete mode 100644 lib/ft8/DXpedQuickStart.txt diff --git a/lib/ft8/DXpedQuickStart.txt b/lib/ft8/DXpedQuickStart.txt deleted file mode 100644 index 1d6ac3e..0000000 --- a/lib/ft8/DXpedQuickStart.txt +++ /dev/null @@ -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 -17 -6. KH1DX W9XYZ R-16 -7. W9XYZ RR73; G4AAA -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 ". 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 diff --git a/lib/ft8/ft8_downsample.f90 b/lib/ft8/ft8_downsample.f90 index 7919141..f355225 100644 --- a/lib/ft8/ft8_downsample.f90 +++ b/lib/ft8/ft8_downsample.f90 @@ -5,15 +5,23 @@ subroutine ft8_downsample(dd,newdat,f0,c1) parameter (NMAX=15*12000,NSPS=1920) parameter (NFFT1=192000,NFFT2=3200) !192000/60 = 3200 - logical newdat + logical newdat,first complex c1(0:NFFT2-1) complex cx(0:NFFT1/2) - real dd(NMAX),x(NFFT1) + real dd(NMAX),x(NFFT1),taper(0:100) 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 -! Data in dd have changed, recompute the long FFT +! Data in dd have changed, recompute the long FFT x(1:NMAX)=dd x(NMAX+1:NFFT1)=0. !Zero-pad the x array 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 baud=12000.0/NSPS i0=nint(f0/df) - ft=f0+8.0*baud + ft=f0+8.5*baud it=min(nint(ft/df),NFFT1/2) - fb=f0-1.0*baud + fb=f0-1.5*baud ib=max(1,nint(fb/df)) k=0 c1=0. @@ -33,6 +41,8 @@ subroutine ft8_downsample(dd,newdat,f0,c1) c1(k)=cx(i) k=k+1 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) call four2a(c1,NFFT2,1,1,1) !c2c FFT back to time domain fac=1.0/sqrt(float(NFFT1)*NFFT2) diff --git a/lib/ft8/ft8b.f90 b/lib/ft8/ft8b.f90 index aa462ef..26f2c1a 100644 --- a/lib/ft8/ft8b.f90 +++ b/lib/ft8/ft8b.f90 @@ -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 naptypes(0:5,4) ! (nQSOProgress, decoding pass) maximum of 4 passes for now integer*1, target:: i1hiscall(12) - complex cd0(3200) + complex cd0(0:3199) complex ctwk(32) complex csymb(32) 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 i1=ibest+(k-1)*32 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) s2(0:7,k)=abs(csymb(1:8))/1e3 enddo @@ -181,7 +182,7 @@ subroutine ft8b(dd0,newdat,nQSOProgress,nfqso,nftx,ndepth,lapon,lapcqonly, & bmetap(i2)=r2 bmetap(i1)=r1 ! 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)) 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)) diff --git a/lib/ft8/sync8.f90 b/lib/ft8/sync8.f90 index 777292e..58bfaa2 100644 --- a/lib/ft8/sync8.f90 +++ b/lib/ft8/sync8.f90 @@ -37,11 +37,6 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,s,candidate,ncand,sbase) savg=savg + s(1:NH1,j) !Average spectrum enddo 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)) 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 jstrt=0.5/tstep + candidate0=0. + k=0 + do i=ia,ib do j=-JZ,+JZ ta=0. @@ -95,20 +93,18 @@ subroutine sync8(dd,nfa,nfb,syncmin,nfqso,s,candidate,ncand,sbase) iz=ib-ia+1 call indexx(red(ia:ib),iz,indx) ibase=indx(nint(0.40*iz)) - 1 + ia + if(ibase.lt.1) ibase=1 + if(ibase.gt.nh1) ibase=nh1 base=red(ibase) red=red/base - candidate0=0. - k=0 - do i=1,200 - ji=iz+1-1 - if(ji.eq.0) exit - n=ia + indx(ji) - 1 - if(red(n).lt.syncmin) exit - if(k.lt.200) k=k+1 - candidate0(1,k)=n*df - candidate0(2,k)=(jpeak(n)-1)*tstep - candidate0(3,k)=red(n) + do i=1,min(200,iz) + n=ia + indx(iz+1-i) - 1 + if(red(n).lt.syncmin.or.isnan(red(n)).or.k.eq.200) exit + k=k+1 + candidate0(1,k)=n*df + candidate0(2,k)=(jpeak(n)-1)*tstep + candidate0(3,k)=red(n) enddo 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. endif enddo -! write(*,3001) i,candidate0(1,i-1),candidate0(1,i),candidate0(3,i-1), & -! candidate0(3,i) -!3001 format(i2,4f8.1) endif enddo