Merged master 8748
This commit is contained in:
@@ -1,103 +0,0 @@
|
||||
!subroutine sync65(ss,nfa,nfb,naggressive,ntol,nqsym,ca,ncand,nrobust, &
|
||||
! bVHF)
|
||||
subroutine sync65(nfa,nfb,naggressive,ntol,nqsym,ca,ncand,nrobust, &
|
||||
bVHF)
|
||||
|
||||
parameter (NSZ=3413,NFFT=8192,MAXCAND=300)
|
||||
! real ss(322,NSZ)
|
||||
real ss(552,NSZ)
|
||||
real ccfblue(-32:82) !CCF with pseudorandom sequence
|
||||
real ccfred(NSZ) !Peak of ccfblue, as function of freq
|
||||
logical bVHF
|
||||
|
||||
type candidate
|
||||
real freq
|
||||
real dt
|
||||
real sync
|
||||
real flip
|
||||
end type candidate
|
||||
type(candidate) ca(MAXCAND)
|
||||
|
||||
common/steve/thresh0
|
||||
common/sync/ss
|
||||
|
||||
if(ntol.eq.-99) stop !Silence compiler warning
|
||||
call setup65
|
||||
|
||||
df=12000.0/NFFT !df = 12000.0/8192 = 1.465 Hz
|
||||
ia=max(2,nint(nfa/df))
|
||||
ib=min(NSZ-1,nint(nfb/df))
|
||||
! lag1=-11
|
||||
! lag2=59
|
||||
! lag1=-22
|
||||
! lag2=118
|
||||
lag1=-32
|
||||
lag2=82 !may need to be extended for EME
|
||||
nsym=126
|
||||
ncand=0
|
||||
fdot=0.
|
||||
ccfred=0.
|
||||
ccfblue=0.
|
||||
ccfmax=0.
|
||||
ipk=0
|
||||
do i=ia,ib
|
||||
! call xcor(ss,i,nqsym,nsym,lag1,lag2,ccfblue,ccf0,lagpk0,flip,fdot,nrobust)
|
||||
call xcor(i,nqsym,nsym,lag1,lag2,ccfblue,ccf0,lagpk0,flip,fdot,nrobust)
|
||||
! Remove best-fit slope from ccfblue and normalize so baseline rms=1.0
|
||||
if(.not.bVHF) call slope(ccfblue(lag1),lag2-lag1+1, &
|
||||
lagpk0-lag1+1.0)
|
||||
ccfred(i)=ccfblue(lagpk0)
|
||||
if(ccfred(i).gt.ccfmax) then
|
||||
ccfmax=ccfred(i)
|
||||
ipk=i
|
||||
endif
|
||||
enddo
|
||||
call pctile(ccfred(ia:ib),ib-ia+1,35,xmed)
|
||||
ccfred(ia:ib)=ccfred(ia:ib)-xmed
|
||||
ccfred(ia-1)=ccfred(ia)
|
||||
ccfred(ib+1)=ccfred(ib)
|
||||
|
||||
do i=ia,ib
|
||||
freq=i*df
|
||||
itry=0
|
||||
! if(naggressive.gt.0 .and. ntol.lt.1000 .and. ccfmax.ge.thresh0) then
|
||||
if(naggressive.gt.0 .and. ccfmax.ge.thresh0) then
|
||||
if(i.ne.ipk) cycle
|
||||
itry=1
|
||||
ncand=ncand+1
|
||||
else
|
||||
if(ccfred(i).ge.thresh0 .and. ccfred(i).gt.ccfred(i-1) .and. &
|
||||
ccfred(i).gt.ccfred(i+1)) then
|
||||
itry=1
|
||||
ncand=ncand+1
|
||||
endif
|
||||
endif
|
||||
if(itry.ne.0) then
|
||||
! call xcor(ss,i,nqsym,nsym,lag1,lag2,ccfblue,ccf0,lagpk,flip,fdot, &
|
||||
! nrobust)
|
||||
call xcor(i,nqsym,nsym,lag1,lag2,ccfblue,ccf0,lagpk,flip,fdot,nrobust)
|
||||
if(.not.bVHF) call slope(ccfblue(lag1),lag2-lag1+1, &
|
||||
lagpk-lag1+1.0)
|
||||
xlag=lagpk
|
||||
if(lagpk.gt.lag1 .and. lagpk.lt.lag2) then
|
||||
call peakup(ccfblue(lagpk-1),ccfmax,ccfblue(lagpk+1),dx2)
|
||||
xlag=lagpk+dx2
|
||||
endif
|
||||
! dtx=xlag*2048.0/11025.0
|
||||
dtx=xlag*1024.0/11025.0
|
||||
ccfblue(lag1)=0.
|
||||
ccfblue(lag2)=0.
|
||||
ca(ncand)%freq=freq
|
||||
ca(ncand)%dt=dtx
|
||||
ca(ncand)%flip=flip
|
||||
if(bVHF) then
|
||||
ca(ncand)%sync=db(ccfred(i)) - 16.0
|
||||
else
|
||||
ca(ncand)%sync=ccfred(i)
|
||||
endif
|
||||
endif
|
||||
if(ncand.eq.MAXCAND) exit
|
||||
enddo
|
||||
|
||||
return
|
||||
end subroutine sync65
|
||||
@@ -1,166 +0,0 @@
|
||||
subroutine hint65(s3,mrs,mrs2,nadd,nflip,mycall,hiscall,hisgrid,qual,decoded)
|
||||
|
||||
use packjt
|
||||
use prog_args
|
||||
parameter (MAXCALLS=10000,MAXRPT=63)
|
||||
parameter (MAXMSG=2*MAXCALLS + 2 + MAXRPT)
|
||||
real s3(64,63)
|
||||
integer*1 sym1(0:62,MAXMSG)
|
||||
integer*1 sym2(0:62,MAXMSG)
|
||||
integer mrs(63),mrs2(63)
|
||||
integer dgen(12),sym(0:62),sym_rev(0:62)
|
||||
character*6 mycall,hiscall,hisgrid,call2(MAXCALLS)
|
||||
character*4 grid2(MAXCALLS),rpt(MAXRPT)
|
||||
character callsign*12,grid*4
|
||||
character*180 line
|
||||
character ceme*3,msg*22,msg00*22
|
||||
character*22 msg0(MAXMSG),decoded
|
||||
logical*1 eme(MAXCALLS)
|
||||
logical first
|
||||
data first/.true./
|
||||
data rpt/'-01','-02','-03','-04','-05', &
|
||||
'-06','-07','-08','-09','-10', &
|
||||
'-11','-12','-13','-14','-15', &
|
||||
'-16','-17','-18','-19','-20', &
|
||||
'-21','-22','-23','-24','-25', &
|
||||
'-26','-27','-28','-29','-30', &
|
||||
'R-01','R-02','R-03','R-04','R-05', &
|
||||
'R-06','R-07','R-08','R-09','R-10', &
|
||||
'R-11','R-12','R-13','R-14','R-15', &
|
||||
'R-16','R-17','R-18','R-19','R-20', &
|
||||
'R-21','R-22','R-23','R-24','R-25', &
|
||||
'R-26','R-27','R-28','R-29','R-30', &
|
||||
'RO','RRR','73'/
|
||||
save first,sym1,nused,msg0,sym2
|
||||
|
||||
first=.true. !### For now, at least: always recompute hypothetical messages
|
||||
if(first) then
|
||||
neme=0
|
||||
open(23,file=trim(data_dir)//'/CALL3.TXT',status='unknown')
|
||||
icall=0
|
||||
j=0
|
||||
do i=1,MAXCALLS
|
||||
read(23,1002,end=10) line
|
||||
1002 format(a80)
|
||||
if(line(1:4).eq.'ZZZZ') cycle
|
||||
if(line(1:2).eq.'//') cycle
|
||||
i1=index(line,',')
|
||||
if(i1.lt.4) cycle
|
||||
i2=index(line(i1+1:),',')
|
||||
if(i2.lt.5) cycle
|
||||
i2=i2+i1
|
||||
i3=index(line(i2+1:),',')
|
||||
if(i3.lt.1) i3=index(line(i2+1:),' ')
|
||||
i3=i2+i3
|
||||
callsign=line(1:i1-1)
|
||||
grid=line(i1+1:i1+4)
|
||||
ceme=line(i2+1:i3-1)
|
||||
eme(i)=ceme.eq.'EME'
|
||||
if(neme.eq.1 .and. (.not.eme(i))) cycle
|
||||
j=j+1
|
||||
call2(j)=callsign(1:6) !### Fix for compound callsigns!
|
||||
grid2(j)=grid
|
||||
enddo
|
||||
10 ncalls=j
|
||||
if(ncalls.lt.10) then
|
||||
write(*,1010) ncalls
|
||||
1010 format('CALL3.TXT very short (N =',i2,') or missing?')
|
||||
endif
|
||||
close(23)
|
||||
|
||||
! NB: generation of test messages is not yet complete!
|
||||
j=0
|
||||
do i=-1,ncalls
|
||||
if(i.eq.0 .and. hiscall.eq.' ' .and. hisgrid(1:4).eq.' ') cycle
|
||||
mz=2
|
||||
if(i.eq.-1) mz=1
|
||||
if(i.eq.0) mz=65
|
||||
do m=1,mz
|
||||
j=j+1
|
||||
if(i.eq.-1) then
|
||||
msg='0123456789ABC'
|
||||
else if(i.eq.0) then
|
||||
if(m.eq.1) msg=mycall//' '//hiscall//' '//hisgrid(1:4)
|
||||
if(m.eq.2) msg='CQ '//hiscall//' '//hisgrid(1:4)
|
||||
if(m.ge.3) msg=mycall//' '//hiscall//' '//rpt(m-2)
|
||||
else
|
||||
if(m.eq.1) msg=mycall//' '//call2(i)//' '//grid2(i)
|
||||
if(m.eq.2) msg='CQ '//call2(i)//' '//grid2(i)
|
||||
endif
|
||||
call fmtmsg(msg,iz)
|
||||
call packmsg(msg,dgen,itype) !Pack message into 72 bits
|
||||
call rs_encode(dgen,sym_rev) !RS encode
|
||||
sym(0:62)=sym_rev(62:0:-1)
|
||||
sym1(0:62,j)=sym
|
||||
|
||||
call interleave63(sym_rev,1) !Interleave channel symbols
|
||||
call graycode(sym_rev,63,1,sym_rev) !Apply Gray code
|
||||
sym2(0:62,j)=sym_rev(0:62)
|
||||
msg0(j)=msg
|
||||
enddo
|
||||
enddo
|
||||
nused=j
|
||||
first=.false.
|
||||
endif
|
||||
|
||||
ref0=0.
|
||||
do j=1,63
|
||||
ref0=ref0 + s3(mrs(j)+1,j)
|
||||
enddo
|
||||
|
||||
u1=0.
|
||||
u1=-99.0
|
||||
u2=u1
|
||||
|
||||
! Find u1 and u2 (best and second-best) codeword from a list, using
|
||||
! a bank of matched filters on the symbol spectra s3(i,j).
|
||||
ipk=1
|
||||
ipk2=0
|
||||
msg00=' '
|
||||
do k=1,nused
|
||||
if(k.ge.2 .and. k.le.64 .and. nflip.lt.0) cycle
|
||||
! Test all messages if nflip=+1; skip the CQ messages if nflip=-1.
|
||||
if(nflip.gt.0 .or. msg0(k)(1:3).ne.'CQ ') then
|
||||
psum=0.
|
||||
ref=ref0
|
||||
do j=1,63
|
||||
i=sym2(j-1,k)+1
|
||||
psum=psum + s3(i,j)
|
||||
if(i.eq.mrs(j)+1) ref=ref - s3(i,j) + s3(mrs2(j)+1,j)
|
||||
enddo
|
||||
p=psum/ref
|
||||
|
||||
if(p.gt.u1) then
|
||||
if(msg0(k).ne.msg00) then
|
||||
ipk2=ipk
|
||||
u2=u1
|
||||
endif
|
||||
u1=p
|
||||
ipk=k
|
||||
msg00=msg0(k)
|
||||
endif
|
||||
if(msg0(k).ne.msg00 .and. p.gt.u2) then
|
||||
u2=p
|
||||
ipk2=k
|
||||
endif
|
||||
endif
|
||||
enddo
|
||||
|
||||
!### Just in case ???
|
||||
! rewind 77
|
||||
! write(77,*) u1,u2,ipk,ipk2
|
||||
! call flush(77)
|
||||
!###
|
||||
|
||||
decoded=' '
|
||||
bias=max(1.12*u2,0.35)
|
||||
if(nadd.ge.4) bias=max(1.08*u2,0.45)
|
||||
if(nadd.ge.8) bias=max(1.04*u2,0.60)
|
||||
qual=100.0*(u1-bias)
|
||||
! write(*,3301) u1,u2,u1/u2,bias,qual,nadd,ipk,ipk2
|
||||
!3301 format(5f6.2,i3,2i6)
|
||||
qmin=1.0
|
||||
if(qual.ge.qmin) decoded=msg0(ipk)
|
||||
|
||||
return
|
||||
end subroutine hint65
|
||||
@@ -1,183 +0,0 @@
|
||||
// Status=review
|
||||
=== Standard Exchange
|
||||
By longstanding tradition, a minimally valid QSO requires the exchange
|
||||
of callsigns, a signal report or some other information, and
|
||||
acknowledgments. _WSJT-X_ is designed to facilitate making such
|
||||
minimal QSOs using short, structured messages. The process works best
|
||||
if you use these formats and follow standard operating practices. The
|
||||
recommended basic QSO goes something like this:
|
||||
|
||||
CQ K1ABC FN42 #K1ABC calls CQ
|
||||
K1ABC G0XYZ IO91 #G0XYZ answers
|
||||
G0XYZ K1ABC –19 #K1ABC sends report
|
||||
K1ABC G0XYZ R-22 #G0XYZ sends R+report
|
||||
G0XYZ K1ABC RRR #K1ABC sends RRR
|
||||
K1ABC G0XYZ 73 #G0XYZ sends 73
|
||||
|
||||
*Standard messages* consist of two callsigns (or CQ, QRZ, or DE and
|
||||
one callsign) followed by the transmitting station’s grid locator, a
|
||||
signal report, R plus a signal report, or the final acknowledgements
|
||||
RRR or 73. These messages are compressed and encoded in a highly
|
||||
efficient and reliable way. In uncompressed form (as displayed
|
||||
on-screen) they may contain as many as 22 characters.
|
||||
|
||||
*Signal reports* are specified as signal-to-noise ratio (S/N) in dB,
|
||||
using a standard reference noise bandwidth of 2500 Hz. Thus, in the
|
||||
example message above, K1ABC is telling G0XYZ that his
|
||||
signal is 19 dB below the noise power in bandwidth 2500 Hz. In the
|
||||
message at 0004, G0XYZ acknowledges receipt of that report and
|
||||
responds with a –22 dB signal report. JT65 reports are constrained to
|
||||
lie in the range –30 to –1 dB, and values are significantly compressed
|
||||
above about -10 dB. JT9 supports the extended range –50 to +49 dB and
|
||||
assigns more reliable numbers to relatively strong signals.
|
||||
|
||||
NOTE: Signals become visible on the waterfall around S/N = –26 dB and
|
||||
audible (to someone with very good hearing) around –15 dB. Thresholds
|
||||
for decodability are around -20 dB for FT8, -23 dB for JT4, –25 dB for
|
||||
JT65, –27 dB for JT9.
|
||||
|
||||
=== Free-Text Messages
|
||||
|
||||
Users often add some friendly chit-chat at the end of a QSO.
|
||||
Free-format messages such as "`TNX ROBERT 73`" or "`5W VERT 73 GL`"
|
||||
are supported, up to a maximum of 13 characters, including spaces. In
|
||||
general you should avoid the character / in free-text messages, as the
|
||||
program may then try to interpret your construction as part of a
|
||||
compound callsign. It should be obvious that the JT4, JT9, and JT65
|
||||
protocols are not designed or well suited for extensive conversations
|
||||
or rag-chewing.
|
||||
|
||||
=== Auto-Sequencing
|
||||
|
||||
The slow modes JT4, JT9, JT65, and QRA64 allow nearly 10 seconds at
|
||||
the end of each one-minute receiving sequence -- enough time for you
|
||||
to inspect decoded messages and decide how to reply. The 15-second
|
||||
T/R cycles of FT8 allow only about two seconds for this task, which is
|
||||
often not enough. For this reason a basic auto-sequencing feature is
|
||||
offered. Check *Auto Seq* on the main window to enable this feature:
|
||||
|
||||
image::auto-seq.png[align="center",alt="AutoSeq"]
|
||||
|
||||
When calling CQ you may also choose to check the box *Call 1st*.
|
||||
_WSJT-X_ will then respond automatically to the first decoded
|
||||
responder to your CQ.
|
||||
|
||||
NOTE: When *Auto-Seq* is enabled the program de-activates *Enable
|
||||
Tx* at the end of each QSO. We do not want _WSJT-X_ to make fully
|
||||
automated QSOs.
|
||||
|
||||
|
||||
[[COMP-CALL]]
|
||||
=== Compound Callsigns
|
||||
|
||||
Compound callsigns such as xx/K1ABC or K1ABC/x are handled in
|
||||
one of two possible ways:
|
||||
|
||||
.Messages containing Type 1 compound callsigns
|
||||
|
||||
A list of about 350 of the most common prefixes and suffixes can be
|
||||
displayed from the *Help* menu. A single compound callsign involving
|
||||
one item from this list can be used in place of the standard third
|
||||
word of a message (normally a locator, signal report, RRR, or 73).
|
||||
The following examples are all acceptable messages containing *Type 1*
|
||||
compound callsigns:
|
||||
|
||||
CQ ZA/K1ABC
|
||||
CQ K1ABC/4
|
||||
ZA/K1ABC G0XYZ
|
||||
G0XYZ K1ABC/4
|
||||
|
||||
The following messages are _not_ valid, because a third word is not
|
||||
permitted in any message containing a *Type 1* compound callsign:
|
||||
|
||||
ZA/K1ABC G0XYZ -22 #These messages are invalid; each would
|
||||
G0XYZ K1ABC/4 73 # be sent without its third "word"
|
||||
|
||||
A QSO between two stations using *Type 1* compound-callsign messages
|
||||
might look like this:
|
||||
|
||||
CQ ZA/K1ABC
|
||||
ZA/K1ABC G0XYZ
|
||||
G0XYZ K1ABC –19
|
||||
K1ABC G0XYZ R–22
|
||||
G0XYZ K1ABC RRR
|
||||
K1ABC G0XYZ 73
|
||||
|
||||
Notice that the full compound callsign is sent and received in the
|
||||
first two transmissions. After that, the operators omit the add-on
|
||||
prefix or suffix and use the standard structured messages.
|
||||
|
||||
.Type 2 Compound-Callsign Messages
|
||||
|
||||
Prefixes and suffixes _not_ found in the displayable short list are
|
||||
handled by using *Type 2* compound callsigns. In this case the
|
||||
compound callsign must be the second word in a two- or three-word
|
||||
message, and the first word must be CQ, DE, or QRZ. Prefixes can be 1
|
||||
to 4 characters, suffixes 1 to 3 characters. A third word conveying a
|
||||
locator, report, RRR, or 73 is permitted. The following are valid
|
||||
messages containing *Type 2* compound callsigns:
|
||||
|
||||
CQ W4/G0XYZ FM07
|
||||
QRZ K1ABC/VE6 DO33
|
||||
DE W4/G0XYZ FM18
|
||||
DE W4/G0XYZ -22
|
||||
DE W4/G0XYZ R-22
|
||||
DE W4/G0XYZ RRR
|
||||
DE W4/G0XYZ 73
|
||||
|
||||
In each case, the compound callsign is treated as *Type 2* because the
|
||||
add-on prefix or suffix is _not_ one of those in the fixed list. Note
|
||||
that a second callsign is never permissible in these messages.
|
||||
|
||||
NOTE: During a transmission your outgoing message is displayed in the
|
||||
first label on the *Status Bar* and shown exactly as another station
|
||||
will receive it. You can check to see that you are actually
|
||||
transmitting the message you wish to send.
|
||||
|
||||
QSOs involving *Type 2* compound callsigns might look like either
|
||||
of the following sequences:
|
||||
|
||||
CQ K1ABC/VE1 FN75
|
||||
K1ABC G0XYZ IO91
|
||||
G0XYZ K1ABC –19
|
||||
K1ABC G0XYZ R–22
|
||||
G0XYZ K1ABC RRR
|
||||
K1ABC/VE1 73
|
||||
|
||||
|
||||
CQ K1ABC FN42
|
||||
DE G0XYZ/W4 FM18
|
||||
G0XYZ K1ABC –19
|
||||
K1ABC G0XYZ R–22
|
||||
G0XYZ K1ABC RRR
|
||||
DE G0XYZ/W4 73
|
||||
|
||||
Operators with a compound callsign use its full form when calling CQ
|
||||
and possibly also in a 73 transmission, as may be required by
|
||||
licensing authorities. Other transmissions during a QSO may use the
|
||||
standard structured messages without callsign prefix or suffix.
|
||||
|
||||
TIP: If you are using a compound callsign, you may want to
|
||||
experiment with the option *Message generation for type 2 compound
|
||||
callsign holders* on the *Settings | General* tab, so that messages
|
||||
will be generated that best suit your needs.
|
||||
|
||||
=== Pre-QSO Checklist
|
||||
|
||||
Before attempting your first QSO with one of the WSJT modes, be sure
|
||||
to go through the <<TUTORIAL,Basic Operating Tutorial>> above as well
|
||||
as the following checklist:
|
||||
|
||||
- Your callsign and grid locator set to correct values
|
||||
|
||||
- PTT and CAT control (if used) properly configured and tested
|
||||
|
||||
- Computer clock properly synchronized to UTC within ±1 s
|
||||
|
||||
- Radio set to *USB* (upper sideband) mode
|
||||
|
||||
- Radio filters centered and set to widest available passband (up to 5 kHz).
|
||||
|
||||
TIP: Remember that in many circumstances FT8, JT4, JT9, JT65, and WSPR
|
||||
do not require high power. Under most HF propagation conditions, QRP
|
||||
is usually the norm.
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 10 KiB |
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user