mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-21 19:55:20 -05:00
Implement NB=-1%, NB=-2%. Fix a startup problem with WideGraps's fMax value.
This commit is contained in:
parent
375a869a51
commit
52bdd57e57
@ -226,308 +226,311 @@ contains
|
||||
|
||||
ndropmax=1
|
||||
single_decode=iand(nexp_decode,32).ne.0
|
||||
npct=0
|
||||
nb=nexp_decode/256 - 2
|
||||
if(nb.ge.0) npct=nb
|
||||
inb0=0
|
||||
inb1=0
|
||||
if((single_decode .or. lagain) .and. (ntol.le.20 .or. iwspr.ne.0)) then
|
||||
inb1=20
|
||||
inb1=20
|
||||
inb2=5
|
||||
if(nb.eq.-1) then
|
||||
inb2=5 !Try NB = 0, 5, 10, 15, 20%
|
||||
else if(nb.eq.-2) then
|
||||
inb2=2 !Try NB = 0, 2, 4,... 20%
|
||||
else
|
||||
ipct(0)=nexp_decode/256
|
||||
inb1=0 !Fixed NB value, 0 to 25%
|
||||
ipct(0)=npct
|
||||
endif
|
||||
|
||||
ndecodes=0
|
||||
decodes=' '
|
||||
|
||||
do inb=inb0,inb1,2
|
||||
! npct=ipct(inb)
|
||||
do inb=inb0,inb1,inb2
|
||||
npct=inb
|
||||
write(*,3001) inb,inb1,lagain,single_decode,npct,ntol
|
||||
3001 format(2i4,2L3,2i5)
|
||||
call blanker(iwave,nfft1,ndropmax,npct,c_bigfft)
|
||||
call blanker(iwave,nfft1,ndropmax,npct,c_bigfft)
|
||||
|
||||
! The big fft is done once and is used for calculating the smoothed spectrum
|
||||
! and also for downconverting/downsampling each candidate.
|
||||
call four2a(c_bigfft,nfft1,1,-1,0) !r2c
|
||||
call four2a(c_bigfft,nfft1,1,-1,0) !r2c
|
||||
|
||||
nhicoh=1
|
||||
nsyncoh=8
|
||||
if(iwspr.eq.1) then !FST4W
|
||||
nfa=max(100,nint(nfqso+1.5*baud-150)) ! 300 Hz wide noise-fit window
|
||||
nfb=min(4800,nint(nfqso+1.5*baud+150))
|
||||
fa=max(100,nint(nfqso+1.5*baud-ntol)) ! signal search window
|
||||
fb=min(4800,nint(nfqso+1.5*baud+ntol))
|
||||
else if(single_decode) then
|
||||
fa=max(100,nint(nfa+1.5*baud))
|
||||
fb=min(4800,nint(nfb+1.5*baud))
|
||||
nfa=max(100,nfa-100) ! extend noise fit 100 Hz outside of search window
|
||||
nfb=min(4800,nfb+100)
|
||||
else
|
||||
fa=max(100,nint(nfa+1.5*baud))
|
||||
fb=min(4800,nint(nfb+1.5*baud))
|
||||
nfa=max(100,nfa-100) ! extend noise fit 100 Hz outside of search window
|
||||
nfb=min(4800,nfb+100)
|
||||
endif
|
||||
minsync=1.20
|
||||
if(ntrperiod.eq.15) minsync=1.15
|
||||
nhicoh=1
|
||||
nsyncoh=8
|
||||
if(iwspr.eq.1) then !FST4W
|
||||
nfa=max(100,nint(nfqso+1.5*baud-150)) !300 Hz wide noise-fit window
|
||||
nfb=min(4800,nint(nfqso+1.5*baud+150))
|
||||
fa=max(100,nint(nfqso+1.5*baud-ntol)) ! signal search window
|
||||
fb=min(4800,nint(nfqso+1.5*baud+ntol))
|
||||
else if(single_decode) then
|
||||
fa=max(100,nint(nfa+1.5*baud))
|
||||
fb=min(4800,nint(nfb+1.5*baud))
|
||||
nfa=max(100,nfa-100) ! extend noise fit 100 Hz outside of search window
|
||||
nfb=min(4800,nfb+100)
|
||||
else
|
||||
fa=max(100,nint(nfa+1.5*baud))
|
||||
fb=min(4800,nint(nfb+1.5*baud))
|
||||
nfa=max(100,nfa-100) ! extend noise fit 100 Hz outside of search window
|
||||
nfb=min(4800,nfb+100)
|
||||
endif
|
||||
minsync=1.20
|
||||
if(ntrperiod.eq.15) minsync=1.15
|
||||
|
||||
! Get first approximation of candidate frequencies
|
||||
call get_candidates_fst4(c_bigfft,nfft1,nsps,hmod,fs,fa,fb,nfa,nfb, &
|
||||
minsync,ncand,candidates0)
|
||||
call get_candidates_fst4(c_bigfft,nfft1,nsps,hmod,fs,fa,fb,nfa,nfb, &
|
||||
minsync,ncand,candidates0)
|
||||
|
||||
isbest=0
|
||||
fc2=0.
|
||||
do icand=1,ncand
|
||||
fc0=candidates0(icand,1)
|
||||
detmet=candidates0(icand,2)
|
||||
isbest=0
|
||||
fc2=0.
|
||||
do icand=1,ncand
|
||||
fc0=candidates0(icand,1)
|
||||
if(iwspr.eq.0 .and. nb.lt.0 .and. &
|
||||
abs(fc0-(nfqso+1.5*baud)).gt.ntol) cycle
|
||||
detmet=candidates0(icand,2)
|
||||
|
||||
! Downconvert and downsample a slice of the spectrum centered on the
|
||||
! rough estimate of the candidates frequency.
|
||||
! Output array c2 is complex baseband sampled at 12000/ndown Sa/sec.
|
||||
! The size of the downsampled c2 array is nfft2=nfft1/ndown
|
||||
|
||||
call timer('dwnsmpl ',0)
|
||||
call fst4_downsample(c_bigfft,nfft1,ndown,fc0,sigbw,c2)
|
||||
call timer('dwnsmpl ',1)
|
||||
call timer('dwnsmpl ',0)
|
||||
call fst4_downsample(c_bigfft,nfft1,ndown,fc0,sigbw,c2)
|
||||
call timer('dwnsmpl ',1)
|
||||
|
||||
call timer('sync240 ',0)
|
||||
call fst4_sync_search(c2,nfft2,hmod,fs2,nss,ntrperiod,nsyncoh,emedelay,sbest,fcbest,isbest)
|
||||
call timer('sync240 ',1)
|
||||
call timer('sync240 ',0)
|
||||
call fst4_sync_search(c2,nfft2,hmod,fs2,nss,ntrperiod,nsyncoh,emedelay,sbest,fcbest,isbest)
|
||||
call timer('sync240 ',1)
|
||||
|
||||
fc_synced = fc0 + fcbest
|
||||
dt_synced = (isbest-fs2)*dt2 !nominal dt is 1 second so frame starts at sample fs2
|
||||
candidates0(icand,3)=fc_synced
|
||||
candidates0(icand,4)=isbest
|
||||
enddo
|
||||
fc_synced = fc0 + fcbest
|
||||
dt_synced = (isbest-fs2)*dt2 !nominal dt is 1 second so frame starts at sample fs2
|
||||
candidates0(icand,3)=fc_synced
|
||||
candidates0(icand,4)=isbest
|
||||
enddo
|
||||
|
||||
! remove duplicate candidates
|
||||
do icand=1,ncand
|
||||
fc=candidates0(icand,3)
|
||||
isbest=nint(candidates0(icand,4))
|
||||
do ic2=1,ncand
|
||||
fc2=candidates0(ic2,3)
|
||||
isbest2=nint(candidates0(ic2,4))
|
||||
if(ic2.ne.icand .and. fc2.gt.0.0) then
|
||||
if(abs(fc2-fc).lt.0.10*baud) then ! same frequency
|
||||
if(abs(isbest2-isbest).le.2) then
|
||||
candidates0(ic2,3)=-1
|
||||
do icand=1,ncand
|
||||
fc=candidates0(icand,3)
|
||||
isbest=nint(candidates0(icand,4))
|
||||
do ic2=1,ncand
|
||||
fc2=candidates0(ic2,3)
|
||||
isbest2=nint(candidates0(ic2,4))
|
||||
if(ic2.ne.icand .and. fc2.gt.0.0) then
|
||||
if(abs(fc2-fc).lt.0.10*baud) then ! same frequency
|
||||
if(abs(isbest2-isbest).le.2) then
|
||||
candidates0(ic2,3)=-1
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
enddo
|
||||
enddo
|
||||
ic=0
|
||||
do icand=1,ncand
|
||||
if(candidates0(icand,3).gt.0) then
|
||||
ic=ic+1
|
||||
candidates0(ic,:)=candidates0(icand,:)
|
||||
endif
|
||||
enddo
|
||||
enddo
|
||||
ic=0
|
||||
do icand=1,ncand
|
||||
if(candidates0(icand,3).gt.0) then
|
||||
ic=ic+1
|
||||
candidates0(ic,:)=candidates0(icand,:)
|
||||
endif
|
||||
enddo
|
||||
ncand=ic
|
||||
ncand=ic
|
||||
|
||||
! If FST4 and Single Decode is not checked, then find candidates within
|
||||
! 20 Hz of nfqso and put them at the top of the list
|
||||
if(iwspr.eq.0 .and. .not.single_decode) then
|
||||
nclose=count(abs(candidates0(:,3)-(nfqso+1.5*baud)).le.20)
|
||||
k=0
|
||||
do i=1,ncand
|
||||
if(abs(candidates0(i,3)-(nfqso+1.5*baud)).le.20) then
|
||||
k=k+1
|
||||
candidates(k,:)=candidates0(i,:)
|
||||
endif
|
||||
enddo
|
||||
do i=1,ncand
|
||||
if(abs(candidates0(i,3)-(nfqso+1.5*baud)).gt.20) then
|
||||
k=k+1
|
||||
candidates(k,:)=candidates0(i,:)
|
||||
endif
|
||||
enddo
|
||||
else
|
||||
candidates=candidates0
|
||||
endif
|
||||
|
||||
xsnr=0.
|
||||
!write(*,*) 'ncand ',ncand
|
||||
do icand=1,ncand
|
||||
sync=candidates(icand,2)
|
||||
fc_synced=candidates(icand,3)
|
||||
isbest=nint(candidates(icand,4))
|
||||
xdt=(isbest-nspsec)/fs2
|
||||
if(ntrperiod.eq.15) xdt=(isbest-real(nspsec)/2.0)/fs2
|
||||
! write(*,*) icand,sync,fc_synced,isbest,xdt
|
||||
call timer('dwnsmpl ',0)
|
||||
call fst4_downsample(c_bigfft,nfft1,ndown,fc_synced,sigbw,c2)
|
||||
call timer('dwnsmpl ',1)
|
||||
|
||||
do ijitter=0,jittermax
|
||||
if(ijitter.eq.0) ioffset=0
|
||||
if(ijitter.eq.1) ioffset=1
|
||||
if(ijitter.eq.2) ioffset=-1
|
||||
is0=isbest+ioffset
|
||||
if(is0.lt.0) cycle
|
||||
cframe=c2(is0:is0+160*nss-1)
|
||||
bitmetrics=0
|
||||
call timer('bitmetrc',0)
|
||||
call get_fst4_bitmetrics(cframe,nss,nblock,nhicoh,bitmetrics, &
|
||||
s4,nsync_qual,badsync)
|
||||
call timer('bitmetrc',1)
|
||||
if(badsync) cycle
|
||||
|
||||
do il=1,4
|
||||
llrs( 1: 60,il)=bitmetrics( 17: 76, il)
|
||||
llrs( 61:120,il)=bitmetrics( 93:152, il)
|
||||
llrs(121:180,il)=bitmetrics(169:228, il)
|
||||
llrs(181:240,il)=bitmetrics(245:304, il)
|
||||
if(iwspr.eq.0 .and. .not.single_decode) then
|
||||
nclose=count(abs(candidates0(:,3)-(nfqso+1.5*baud)).le.20)
|
||||
k=0
|
||||
do i=1,ncand
|
||||
if(abs(candidates0(i,3)-(nfqso+1.5*baud)).le.20) then
|
||||
k=k+1
|
||||
candidates(k,:)=candidates0(i,:)
|
||||
endif
|
||||
enddo
|
||||
do i=1,ncand
|
||||
if(abs(candidates0(i,3)-(nfqso+1.5*baud)).gt.20) then
|
||||
k=k+1
|
||||
candidates(k,:)=candidates0(i,:)
|
||||
endif
|
||||
enddo
|
||||
else
|
||||
candidates=candidates0
|
||||
endif
|
||||
|
||||
apmag=maxval(abs(llrs(:,1)))*1.1
|
||||
ntmax=nblock+nappasses(nQSOProgress)
|
||||
if(lapcqonly) ntmax=nblock+1
|
||||
if(ndepth.eq.1) ntmax=nblock
|
||||
apmask=0
|
||||
xsnr=0.
|
||||
do icand=1,ncand
|
||||
sync=candidates(icand,2)
|
||||
fc_synced=candidates(icand,3)
|
||||
isbest=nint(candidates(icand,4))
|
||||
xdt=(isbest-nspsec)/fs2
|
||||
if(ntrperiod.eq.15) xdt=(isbest-real(nspsec)/2.0)/fs2
|
||||
call timer('dwnsmpl ',0)
|
||||
call fst4_downsample(c_bigfft,nfft1,ndown,fc_synced,sigbw,c2)
|
||||
call timer('dwnsmpl ',1)
|
||||
|
||||
if(iwspr.eq.1) then ! 50-bit msgs, no ap decoding
|
||||
nblock=4
|
||||
ntmax=nblock
|
||||
endif
|
||||
do ijitter=0,jittermax
|
||||
if(ijitter.eq.0) ioffset=0
|
||||
if(ijitter.eq.1) ioffset=1
|
||||
if(ijitter.eq.2) ioffset=-1
|
||||
is0=isbest+ioffset
|
||||
if(is0.lt.0) cycle
|
||||
cframe=c2(is0:is0+160*nss-1)
|
||||
bitmetrics=0
|
||||
call timer('bitmetrc',0)
|
||||
call get_fst4_bitmetrics(cframe,nss,nblock,nhicoh,bitmetrics, &
|
||||
s4,nsync_qual,badsync)
|
||||
call timer('bitmetrc',1)
|
||||
if(badsync) cycle
|
||||
|
||||
do itry=1,ntmax
|
||||
if(itry.eq.1) llr=llrs(:,1)
|
||||
if(itry.eq.2.and.itry.le.nblock) llr=llrs(:,2)
|
||||
if(itry.eq.3.and.itry.le.nblock) llr=llrs(:,3)
|
||||
if(itry.eq.4.and.itry.le.nblock) llr=llrs(:,4)
|
||||
if(itry.le.nblock) then
|
||||
apmask=0
|
||||
iaptype=0
|
||||
do il=1,4
|
||||
llrs( 1: 60,il)=bitmetrics( 17: 76, il)
|
||||
llrs( 61:120,il)=bitmetrics( 93:152, il)
|
||||
llrs(121:180,il)=bitmetrics(169:228, il)
|
||||
llrs(181:240,il)=bitmetrics(245:304, il)
|
||||
enddo
|
||||
|
||||
apmag=maxval(abs(llrs(:,1)))*1.1
|
||||
ntmax=nblock+nappasses(nQSOProgress)
|
||||
if(lapcqonly) ntmax=nblock+1
|
||||
if(ndepth.eq.1) ntmax=nblock
|
||||
apmask=0
|
||||
|
||||
if(iwspr.eq.1) then ! 50-bit msgs, no ap decoding
|
||||
nblock=4
|
||||
ntmax=nblock
|
||||
endif
|
||||
|
||||
if(itry.gt.nblock) then ! do ap passes
|
||||
llr=llrs(:,nblock) ! Use largest blocksize as the basis for AP passes
|
||||
iaptype=naptypes(nQSOProgress,itry-nblock)
|
||||
if(lapcqonly) iaptype=1
|
||||
if(iaptype.ge.2 .and. apbits(1).gt.1) cycle ! No, or nonstandard, mycall
|
||||
if(iaptype.ge.3 .and. apbits(30).gt.1) cycle ! No, or nonstandard, dxcall
|
||||
if(iaptype.eq.1) then ! CQ
|
||||
do itry=1,ntmax
|
||||
if(itry.eq.1) llr=llrs(:,1)
|
||||
if(itry.eq.2.and.itry.le.nblock) llr=llrs(:,2)
|
||||
if(itry.eq.3.and.itry.le.nblock) llr=llrs(:,3)
|
||||
if(itry.eq.4.and.itry.le.nblock) llr=llrs(:,4)
|
||||
if(itry.le.nblock) then
|
||||
apmask=0
|
||||
apmask(1:29)=1
|
||||
llr(1:29)=apmag*mcq(1:29)
|
||||
iaptype=0
|
||||
endif
|
||||
|
||||
if(iaptype.eq.2) then ! MyCall ??? ???
|
||||
apmask=0
|
||||
apmask(1:29)=1
|
||||
llr(1:29)=apmag*apbits(1:29)
|
||||
endif
|
||||
if(itry.gt.nblock) then ! do ap passes
|
||||
llr=llrs(:,nblock) ! Use largest blocksize as the basis for AP passes
|
||||
iaptype=naptypes(nQSOProgress,itry-nblock)
|
||||
if(lapcqonly) iaptype=1
|
||||
if(iaptype.ge.2 .and. apbits(1).gt.1) cycle ! No, or nonstandard, mycall
|
||||
if(iaptype.ge.3 .and. apbits(30).gt.1) cycle ! No, or nonstandard, dxcall
|
||||
if(iaptype.eq.1) then ! CQ
|
||||
apmask=0
|
||||
apmask(1:29)=1
|
||||
llr(1:29)=apmag*mcq(1:29)
|
||||
endif
|
||||
|
||||
if(iaptype.eq.3) then ! MyCall DxCall ???
|
||||
apmask=0
|
||||
apmask(1:58)=1
|
||||
llr(1:58)=apmag*apbits(1:58)
|
||||
endif
|
||||
if(iaptype.eq.2) then ! MyCall ??? ???
|
||||
apmask=0
|
||||
apmask(1:29)=1
|
||||
llr(1:29)=apmag*apbits(1:29)
|
||||
endif
|
||||
|
||||
if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype .eq.6) then
|
||||
apmask=0
|
||||
apmask(1:77)=1
|
||||
llr(1:58)=apmag*apbits(1:58)
|
||||
if(iaptype.eq.4) llr(59:77)=apmag*mrrr(1:19)
|
||||
if(iaptype.eq.5) llr(59:77)=apmag*m73(1:19)
|
||||
if(iaptype.eq.6) llr(59:77)=apmag*mrr73(1:19)
|
||||
endif
|
||||
endif
|
||||
|
||||
dmin=0.0
|
||||
nharderrors=-1
|
||||
unpk77_success=.false.
|
||||
if(iwspr.eq.0) then
|
||||
maxosd=2
|
||||
Keff=91
|
||||
norder=3
|
||||
call timer('d240_101',0)
|
||||
call decode240_101(llr,Keff,maxosd,norder,apmask,message101, &
|
||||
cw,ntype,nharderrors,dmin)
|
||||
call timer('d240_101',1)
|
||||
elseif(iwspr.eq.1) then
|
||||
maxosd=2
|
||||
call timer('d240_74 ',0)
|
||||
Keff=64
|
||||
norder=4
|
||||
call decode240_74(llr,Keff,maxosd,norder,apmask,message74,cw, &
|
||||
ntype,nharderrors,dmin)
|
||||
call timer('d240_74 ',1)
|
||||
endif
|
||||
|
||||
if(nharderrors .ge.0) then
|
||||
if(count(cw.eq.1).eq.0) then
|
||||
nharderrors=-nharderrors
|
||||
cycle
|
||||
if(iaptype.eq.3) then ! MyCall DxCall ???
|
||||
apmask=0
|
||||
apmask(1:58)=1
|
||||
llr(1:58)=apmag*apbits(1:58)
|
||||
endif
|
||||
|
||||
if(iaptype.eq.4 .or. iaptype.eq.5 .or. iaptype .eq.6) then
|
||||
apmask=0
|
||||
apmask(1:77)=1
|
||||
llr(1:58)=apmag*apbits(1:58)
|
||||
if(iaptype.eq.4) llr(59:77)=apmag*mrrr(1:19)
|
||||
if(iaptype.eq.5) llr(59:77)=apmag*m73(1:19)
|
||||
if(iaptype.eq.6) llr(59:77)=apmag*mrr73(1:19)
|
||||
endif
|
||||
endif
|
||||
|
||||
dmin=0.0
|
||||
nharderrors=-1
|
||||
unpk77_success=.false.
|
||||
if(iwspr.eq.0) then
|
||||
write(c77,'(77i1)') mod(message101(1:77)+rvec,2)
|
||||
call unpack77(c77,1,msg,unpk77_success)
|
||||
else
|
||||
write(c77,'(50i1)') message74(1:50)
|
||||
c77(51:77)='000000000000000000000110000'
|
||||
call unpack77(c77,1,msg,unpk77_success)
|
||||
maxosd=2
|
||||
Keff=91
|
||||
norder=3
|
||||
call timer('d240_101',0)
|
||||
call decode240_101(llr,Keff,maxosd,norder,apmask,message101, &
|
||||
cw,ntype,nharderrors,dmin)
|
||||
call timer('d240_101',1)
|
||||
elseif(iwspr.eq.1) then
|
||||
maxosd=2
|
||||
call timer('d240_74 ',0)
|
||||
Keff=64
|
||||
norder=4
|
||||
call decode240_74(llr,Keff,maxosd,norder,apmask,message74,cw, &
|
||||
ntype,nharderrors,dmin)
|
||||
call timer('d240_74 ',1)
|
||||
endif
|
||||
if(unpk77_success) then
|
||||
idupe=0
|
||||
do i=1,ndecodes
|
||||
if(decodes(i).eq.msg) idupe=1
|
||||
enddo
|
||||
if(idupe.eq.1) goto 2002
|
||||
ndecodes=ndecodes+1
|
||||
decodes(ndecodes)=msg
|
||||
|
||||
|
||||
if(nharderrors .ge.0) then
|
||||
if(count(cw.eq.1).eq.0) then
|
||||
nharderrors=-nharderrors
|
||||
cycle
|
||||
endif
|
||||
if(iwspr.eq.0) then
|
||||
call get_fst4_tones_from_bits(message101,itone,0)
|
||||
write(c77,'(77i1)') mod(message101(1:77)+rvec,2)
|
||||
call unpack77(c77,1,msg,unpk77_success)
|
||||
else
|
||||
call get_fst4_tones_from_bits(message74,itone,1)
|
||||
write(c77,'(50i1)') message74(1:50)
|
||||
c77(51:77)='000000000000000000000110000'
|
||||
call unpack77(c77,1,msg,unpk77_success)
|
||||
endif
|
||||
inquire(file='plotspec',exist=ex)
|
||||
fmid=-999.0
|
||||
call timer('dopsprd ',0)
|
||||
if(unpk77_success) then
|
||||
idupe=0
|
||||
do i=1,ndecodes
|
||||
if(decodes(i).eq.msg) idupe=1
|
||||
enddo
|
||||
if(idupe.eq.1) goto 2002
|
||||
ndecodes=ndecodes+1
|
||||
decodes(ndecodes)=msg
|
||||
|
||||
if(iwspr.eq.0) then
|
||||
call get_fst4_tones_from_bits(message101,itone,0)
|
||||
else
|
||||
call get_fst4_tones_from_bits(message74,itone,1)
|
||||
endif
|
||||
inquire(file='plotspec',exist=ex)
|
||||
fmid=-999.0
|
||||
call timer('dopsprd ',0)
|
||||
if(ex) then
|
||||
call dopspread(itone,iwave,nsps,nmax,ndown,hmod, &
|
||||
isbest,fc_synced,fmid,w50)
|
||||
endif
|
||||
call timer('dopsprd ',1)
|
||||
xsig=0
|
||||
do i=1,NN
|
||||
xsig=xsig+s4(itone(i),i)
|
||||
enddo
|
||||
base=candidates(icand,5)
|
||||
arg=600.0*(xsig/base)-1.0
|
||||
if(arg.gt.0.0) then
|
||||
xsnr=10*log10(arg)-35.5-12.5*log10(nsps/8200.0)
|
||||
if(ntrperiod.eq. 15) xsnr=xsnr+2
|
||||
if(ntrperiod.eq. 30) xsnr=xsnr+1
|
||||
if(ntrperiod.eq. 900) xsnr=xsnr+1
|
||||
if(ntrperiod.eq.1800) xsnr=xsnr+2
|
||||
else
|
||||
xsnr=-99.9
|
||||
endif
|
||||
else
|
||||
cycle
|
||||
endif
|
||||
nsnr=nint(xsnr)
|
||||
qual=0.
|
||||
fsig=fc_synced - 1.5*baud
|
||||
if(ex) then
|
||||
call dopspread(itone,iwave,nsps,nmax,ndown,hmod, &
|
||||
isbest,fc_synced,fmid,w50)
|
||||
write(21,3021) nutc,icand,itry,nsyncoh,iaptype, &
|
||||
ijitter,ntype,nsync_qual,nharderrors,dmin, &
|
||||
sync,xsnr,xdt,fsig,w50,trim(msg)
|
||||
3021 format(i6.6,6i3,2i4,f6.1,f7.2,f6.1,f6.2,f7.1,f7.3,1x,a)
|
||||
flush(21)
|
||||
endif
|
||||
call timer('dopsprd ',1)
|
||||
xsig=0
|
||||
do i=1,NN
|
||||
xsig=xsig+s4(itone(i),i)
|
||||
enddo
|
||||
base=candidates(icand,5)
|
||||
arg=600.0*(xsig/base)-1.0
|
||||
if(arg.gt.0.0) then
|
||||
xsnr=10*log10(arg)-35.5-12.5*log10(nsps/8200.0)
|
||||
if(ntrperiod.eq. 15) xsnr=xsnr+2
|
||||
if(ntrperiod.eq. 30) xsnr=xsnr+1
|
||||
if(ntrperiod.eq. 900) xsnr=xsnr+1
|
||||
if(ntrperiod.eq.1800) xsnr=xsnr+2
|
||||
else
|
||||
xsnr=-99.9
|
||||
endif
|
||||
else
|
||||
cycle
|
||||
call this%callback(nutc,smax1,nsnr,xdt,fsig,msg, &
|
||||
iaptype,qual,ntrperiod,lwspr,fmid,w50)
|
||||
goto 2002
|
||||
endif
|
||||
nsnr=nint(xsnr)
|
||||
qual=0.
|
||||
fsig=fc_synced - 1.5*baud
|
||||
if(ex) then
|
||||
write(21,3021) nutc,icand,itry,nsyncoh,iaptype, &
|
||||
ijitter,ntype,nsync_qual,nharderrors,dmin, &
|
||||
sync,xsnr,xdt,fsig,w50,trim(msg)
|
||||
3021 format(i6.6,6i3,2i4,f6.1,f7.2,f6.1,f6.2,f7.1,f7.3,1x,a)
|
||||
flush(21)
|
||||
endif
|
||||
call this%callback(nutc,smax1,nsnr,xdt,fsig,msg, &
|
||||
iaptype,qual,ntrperiod,lwspr,fmid,w50)
|
||||
goto 2002
|
||||
endif
|
||||
enddo ! metrics
|
||||
enddo ! istart jitter
|
||||
2002 enddo !candidate list
|
||||
enddo ! metrics
|
||||
enddo ! istart jitter
|
||||
2002 enddo !candidate list
|
||||
enddo
|
||||
|
||||
|
||||
return
|
||||
end subroutine decode
|
||||
end subroutine decode
|
||||
|
||||
subroutine sync_fst4(cd0,i0,f0,hmod,ncoh,np,nss,ntr,fs,sync)
|
||||
|
||||
|
@ -3127,7 +3127,7 @@ void MainWindow::decode() //decode()
|
||||
dec_data.params.nexp_decode = static_cast<int> (m_config.special_op_id());
|
||||
if(m_config.single_decode()) dec_data.params.nexp_decode += 32;
|
||||
if(m_config.enable_VHF_features()) dec_data.params.nexp_decode += 64;
|
||||
if(m_mode.startsWith("FST4")) dec_data.params.nexp_decode += 256*ui->sbNB->value();
|
||||
if(m_mode.startsWith("FST4")) dec_data.params.nexp_decode += 256*(ui->sbNB->value()+2);
|
||||
|
||||
::memcpy(dec_data.params.datetime, m_dateTime.toLatin1()+" ", sizeof dec_data.params.datetime);
|
||||
::memcpy(dec_data.params.mycall, (m_config.my_callsign()+" ").toLatin1(), sizeof dec_data.params.mycall);
|
||||
@ -4241,7 +4241,7 @@ void MainWindow::guiUpdate()
|
||||
//Once per second (onesec)
|
||||
if(nsec != m_sec0) {
|
||||
// qDebug() << "AAA" << nsec;
|
||||
if(m_mode=="FST4") chk_FST4_freq_range();
|
||||
if(m_mode=="FST4" and m_bOK_to_chk) chk_FST4_freq_range();
|
||||
m_currentBand=m_config.bands()->find(m_freqNominal);
|
||||
if( SpecOp::HOUND == m_config.special_op_id() ) {
|
||||
qint32 tHound=QDateTime::currentMSecsSinceEpoch()/1000 - m_tAutoOn;
|
||||
@ -5931,9 +5931,6 @@ void MainWindow::on_actionFST4_triggered()
|
||||
ui->sbFtol->setValue(20);
|
||||
}
|
||||
setup_status_bar(false);
|
||||
ui->sbTR->values ({15, 30, 60, 120, 300, 900, 1800});
|
||||
on_sbTR_valueChanged (ui->sbTR->value());
|
||||
chk_FST4_freq_range();
|
||||
ui->cbAutoSeq->setChecked(true);
|
||||
m_wideGraph->setMode(m_mode);
|
||||
m_wideGraph->setModeTx(m_modeTx);
|
||||
@ -5942,9 +5939,13 @@ void MainWindow::on_actionFST4_triggered()
|
||||
m_wideGraph->setTol(ui->sbFtol->value());
|
||||
m_wideGraph->setTxFreq(ui->TxFreqSpinBox->value());
|
||||
m_wideGraph->setFST4_FreqRange(ui->sbF_Low->value(),ui->sbF_High->value());
|
||||
chk_FST4_freq_range();
|
||||
switch_mode (Modes::FST4);
|
||||
m_wideGraph->setMode(m_mode);
|
||||
ui->sbTR->values ({15, 30, 60, 120, 300, 900, 1800});
|
||||
on_sbTR_valueChanged (ui->sbTR->value());
|
||||
statusChanged();
|
||||
m_bOK_to_chk=true;
|
||||
}
|
||||
|
||||
void MainWindow::on_actionFST4W_triggered()
|
||||
@ -7528,7 +7529,7 @@ void MainWindow::on_sbTR_valueChanged(int value)
|
||||
m_wideGraph->setPeriod (value, m_nsps);
|
||||
progressBar.setMaximum (value);
|
||||
}
|
||||
if(m_mode=="FST4") chk_FST4_freq_range();
|
||||
if(m_mode=="FST4" and m_bOK_to_chk) chk_FST4_freq_range();
|
||||
if(m_monitoring) {
|
||||
on_stopButton_clicked();
|
||||
on_monitorButton_clicked(true);
|
||||
|
@ -527,6 +527,7 @@ private:
|
||||
bool m_bWarnedSplit=false;
|
||||
bool m_bTUmsg;
|
||||
bool m_bBestSPArmed=false;
|
||||
bool m_bOK_to_chk=false;
|
||||
|
||||
enum
|
||||
{
|
||||
|
@ -1018,28 +1018,6 @@ When not checked you can view the calibration results.</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QSpinBox" name="sbF_Low">
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
<property name="prefix">
|
||||
<string>F Low </string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>5000</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>600</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="QSpinBox" name="sbF_High">
|
||||
<property name="alignment">
|
||||
@ -1065,6 +1043,53 @@ When not checked you can view the calibration results.</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QSpinBox" name="sbF_Low">
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
<property name="prefix">
|
||||
<string>F Low </string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>5000</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>600</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QSpinBox" name="RxFreqSpinBox">
|
||||
<property name="toolTip">
|
||||
<string>Audio Rx frequency</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> Hz</string>
|
||||
</property>
|
||||
<property name="prefix">
|
||||
<string>Rx </string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>200</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>5000</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>1500</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item>
|
||||
@ -1153,31 +1178,6 @@ When not checked you can view the calibration results.</string>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QSpinBox" name="RxFreqSpinBox">
|
||||
<property name="toolTip">
|
||||
<string>Audio Rx frequency</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> Hz</string>
|
||||
</property>
|
||||
<property name="prefix">
|
||||
<string>Rx </string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>200</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>5000</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>1500</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QSpinBox" name="rptSpinBox">
|
||||
<property name="toolTip">
|
||||
@ -2470,6 +2470,9 @@ Yellow when too low</string>
|
||||
<property name="prefix">
|
||||
<string>NB </string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-2</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>25</number>
|
||||
</property>
|
||||
|
Loading…
Reference in New Issue
Block a user