mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-15 16:42:12 -05:00
More progress toward a working decoder for B2, C2 modes.
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/map65@2556 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
parent
887f0c99b4
commit
d09f8c0892
@ -1,5 +1,5 @@
|
|||||||
subroutine afc65b(cx,cy,npts,fsample,nflip,ipol,xpol,ndphi,iloop,
|
subroutine afc65b(cx,cy,npts,nfast,fsample,nflip,ipol,xpol,
|
||||||
+ a,ccfbest,dtbest)
|
+ ndphi,iloop,a,ccfbest,dtbest)
|
||||||
|
|
||||||
logical xpol
|
logical xpol
|
||||||
complex cx(npts)
|
complex cx(npts)
|
||||||
@ -26,11 +26,11 @@
|
|||||||
chisqr0=1.e6
|
chisqr0=1.e6
|
||||||
do iter=1,3 !One iteration is enough?
|
do iter=1,3 !One iteration is enough?
|
||||||
do j=1,nterms
|
do j=1,nterms
|
||||||
chisq1=fchisq(cx,cy,npts,fsample,nflip,a,ccfmax,dtmax)
|
chisq1=fchisq(cx,cy,npts,nfast,fsample,nflip,a,ccfmax,dtmax)
|
||||||
fn=0.
|
fn=0.
|
||||||
delta=deltaa(j)
|
delta=deltaa(j)
|
||||||
10 a(j)=a(j)+delta
|
10 a(j)=a(j)+delta
|
||||||
chisq2=fchisq(cx,cy,npts,fsample,nflip,a,ccfmax,dtmax)
|
chisq2=fchisq(cx,cy,npts,nfast,fsample,nflip,a,ccfmax,dtmax)
|
||||||
if(chisq2.eq.chisq1) go to 10
|
if(chisq2.eq.chisq1) go to 10
|
||||||
if(chisq2.gt.chisq1) then
|
if(chisq2.gt.chisq1) then
|
||||||
delta=-delta !Reverse direction
|
delta=-delta !Reverse direction
|
||||||
@ -41,7 +41,7 @@
|
|||||||
endif
|
endif
|
||||||
20 fn=fn+1.0
|
20 fn=fn+1.0
|
||||||
a(j)=a(j)+delta
|
a(j)=a(j)+delta
|
||||||
chisq3=fchisq(cx,cy,npts,fsample,nflip,a,ccfmax,dtmax)
|
chisq3=fchisq(cx,cy,npts,nfast,fsample,nflip,a,ccfmax,dtmax)
|
||||||
if(chisq3.lt.chisq2) then
|
if(chisq3.lt.chisq2) then
|
||||||
chisq1=chisq2
|
chisq1=chisq2
|
||||||
chisq2=chisq3
|
chisq2=chisq3
|
||||||
@ -53,7 +53,7 @@ C Find minimum of parabola defined by last three points
|
|||||||
a(j)=a(j)-delta
|
a(j)=a(j)-delta
|
||||||
deltaa(j)=deltaa(j)*fn/3.
|
deltaa(j)=deltaa(j)*fn/3.
|
||||||
enddo
|
enddo
|
||||||
chisqr=fchisq(cx,cy,npts,fsample,nflip,a,ccfmax,dtmax)
|
chisqr=fchisq(cx,cy,npts,nfast,fsample,nflip,a,ccfmax,dtmax)
|
||||||
if(chisqr/chisqr0.gt.0.9999) go to 30
|
if(chisqr/chisqr0.gt.0.9999) go to 30
|
||||||
chisqr0=chisqr
|
chisqr0=chisqr
|
||||||
enddo
|
enddo
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
subroutine ccf65(ss,nhsym,ssmax,sync1,ipol1,jpz,dt1,flipk,syncshort, &
|
subroutine ccf65(ss,nhsym,nfast,ssmax,sync1,ipol1,jpz,dt1,flipk, &
|
||||||
snr2,ipol2,dt2)
|
syncshort,snr2,ipol2,dt2)
|
||||||
|
|
||||||
parameter (NFFT=512,NH=NFFT/2)
|
parameter (NFFT=512,NH=NFFT/2)
|
||||||
real ss(4,322) !Input: half-symbol powers, 4 pol'ns
|
real ss(4,322) !Input: half-symbol powers, 4 pol'ns
|
||||||
@ -103,7 +103,7 @@ subroutine ccf65(ss,nhsym,ssmax,sync1,ipol1,jpz,dt1,flipk,syncshort, &
|
|||||||
enddo
|
enddo
|
||||||
rms=sqrt(sq/49.0)
|
rms=sqrt(sq/49.0)
|
||||||
sync1=ccfbest/rms - 4.0
|
sync1=ccfbest/rms - 4.0
|
||||||
dt1=2.5 + lagpk*(2048.0/11025.0)
|
dt1=(2.5 + lagpk*(2048.0/11025.0))/nfast
|
||||||
|
|
||||||
! Find base level for normalizing snr2.
|
! Find base level for normalizing snr2.
|
||||||
do i=1,nhsym
|
do i=1,nhsym
|
||||||
@ -112,7 +112,7 @@ subroutine ccf65(ss,nhsym,ssmax,sync1,ipol1,jpz,dt1,flipk,syncshort, &
|
|||||||
call pctile(tmp1,tmp2,nhsym,40,base)
|
call pctile(tmp1,tmp2,nhsym,40,base)
|
||||||
snr2=0.398107*ccfbest2/base !### empirical
|
snr2=0.398107*ccfbest2/base !### empirical
|
||||||
syncshort=0.5*ccfbest2/rms - 4.0 !### better normalizer than rms?
|
syncshort=0.5*ccfbest2/rms - 4.0 !### better normalizer than rms?
|
||||||
dt2=2.5 + lagpk2*(2048.0/11025.0)
|
dt2=(2.5 + lagpk2*(2048.0/11025.0))/nfast
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine ccf65
|
end subroutine ccf65
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
subroutine decode1a(dd,newdat,f0,nflip,mode65,nfsample,xpol,
|
subroutine decode1a(dd,newdat,f0,nflip,mode65,nfast,nfsample,xpol,
|
||||||
+ mycall,hiscall,hisgrid,neme,ndepth,nqd,dphi,ndphi,iloop,
|
+ mycall,hiscall,hisgrid,neme,ndepth,nqd,dphi,ndphi,iloop,
|
||||||
+ nutc,nkhz,ndf,ipol,ntol,sync2,a,dt,pol,nkv,nhist,nsum,nsave,
|
+ nutc,nkhz,ndf,ipol,ntol,sync2,a,dt,pol,nkv,nhist,nsum,nsave,
|
||||||
+ qual,decoded)
|
+ qual,decoded)
|
||||||
@ -24,7 +24,7 @@
|
|||||||
! Mix sync tone to baseband, low-pass filter, downsample to 1378.125 Hz
|
! Mix sync tone to baseband, low-pass filter, downsample to 1378.125 Hz
|
||||||
dt00=dt
|
dt00=dt
|
||||||
call timer('filbig ',0)
|
call timer('filbig ',0)
|
||||||
call filbig(dd,NMAX,f0,newdat,nfsample,xpol,cx,cy,n5)
|
call filbig(dd,NMAX,nfast,f0,newdat,nfsample,xpol,cx,cy,n5)
|
||||||
! NB: cx, cy have sample rate 96000*77125/5376000 = 1378.125 Hz
|
! NB: cx, cy have sample rate 96000*77125/5376000 = 1378.125 Hz
|
||||||
call timer('filbig ',1)
|
call timer('filbig ',1)
|
||||||
joff=0
|
joff=0
|
||||||
@ -32,17 +32,19 @@
|
|||||||
sqb=0.
|
sqb=0.
|
||||||
do i=1,n5
|
do i=1,n5
|
||||||
sqa=sqa + real(cx(i))**2 + aimag(cx(i))**2
|
sqa=sqa + real(cx(i))**2 + aimag(cx(i))**2
|
||||||
sqb=sqb + real(cy(i))**2 + aimag(cy(i))**2
|
if(xpol) sqb=sqb + real(cy(i))**2 + aimag(cy(i))**2
|
||||||
enddo
|
enddo
|
||||||
sqa=sqa/n5
|
sqa=sqa/n5
|
||||||
sqb=sqb/n5
|
sqb=sqb/n5
|
||||||
|
|
||||||
! Find best DF, f1, f2, DT, and pol. Start by downsampling to 344.53125 Hz
|
! Find best DF, f1, f2, DT, and pol. Start by downsampling to 344.53125 Hz
|
||||||
z=cmplx(cos(dphi),sin(dphi))
|
if(xpol) then
|
||||||
cy(:n5)=z*cy(:n5) !Adjust for cable length difference
|
z=cmplx(cos(dphi),sin(dphi))
|
||||||
|
cy(:n5)=z*cy(:n5) !Adjust for cable length difference
|
||||||
|
endif
|
||||||
call timer('fil6521 ',0)
|
call timer('fil6521 ',0)
|
||||||
call fil6521(cx,n5,c5x,n6)
|
call fil6521(cx,n5,c5x,n6)
|
||||||
call fil6521(cy,n5,c5y,n6)
|
if(xpol) call fil6521(cy,n5,c5y,n6)
|
||||||
call timer('fil6521 ',1)
|
call timer('fil6521 ',1)
|
||||||
|
|
||||||
! Add some zeros at start of c5 arrays -- empirical fix for negative DT's
|
! Add some zeros at start of c5 arrays -- empirical fix for negative DT's
|
||||||
@ -53,8 +55,10 @@
|
|||||||
c5tmp(1:nadd)=0.
|
c5tmp(1:nadd)=0.
|
||||||
c5tmp(1+nadd:n6+nadd)=c5x(1:n6)
|
c5tmp(1+nadd:n6+nadd)=c5x(1:n6)
|
||||||
c5x(1:n6+nadd)=c5tmp(1:n6+nadd)
|
c5x(1:n6+nadd)=c5tmp(1:n6+nadd)
|
||||||
c5tmp(1+nadd:n6+nadd)=c5y(1:n6)
|
if(xpol) then
|
||||||
c5y(1:n6+nadd)=c5tmp(1:n6+nadd)
|
c5tmp(1+nadd:n6+nadd)=c5y(1:n6)
|
||||||
|
c5y(1:n6+nadd)=c5tmp(1:n6+nadd)
|
||||||
|
endif
|
||||||
n6=n6+nadd
|
n6=n6+nadd
|
||||||
|
|
||||||
fsample=1378.125/4.
|
fsample=1378.125/4.
|
||||||
@ -71,7 +75,7 @@
|
|||||||
! factor of 1/8, say? Should be a significant execution speed-up.
|
! factor of 1/8, say? Should be a significant execution speed-up.
|
||||||
call timer('afc65b ',0)
|
call timer('afc65b ',0)
|
||||||
! Best fit for DF, f1, f2, pol
|
! Best fit for DF, f1, f2, pol
|
||||||
call afc65b(c5x(i0),c5y(i0),nz,fsample,nflip,ipol,xpol,
|
call afc65b(c5x(i0),c5y(i0),nz,nfast,fsample,nflip,ipol,xpol,
|
||||||
+ ndphi,iloop,a,ccfbest,dtbest)
|
+ ndphi,iloop,a,ccfbest,dtbest)
|
||||||
call timer('afc65b ',1)
|
call timer('afc65b ',1)
|
||||||
|
|
||||||
@ -81,6 +85,8 @@
|
|||||||
sq0=aa*aa*sqa + bb*bb*sqb
|
sq0=aa*aa*sqa + bb*bb*sqb
|
||||||
sync2=3.7*ccfbest/sq0
|
sync2=3.7*ccfbest/sq0
|
||||||
|
|
||||||
|
! print*,n6,dt00,i0,nz,a(1),sync2
|
||||||
|
|
||||||
! Apply AFC corrections to the time-domain signal
|
! Apply AFC corrections to the time-domain signal
|
||||||
! Now we are back to using the 1378.125 Hz sample rate, enough to
|
! Now we are back to using the 1378.125 Hz sample rate, enough to
|
||||||
! accommodate the full JT65C bandwidth.
|
! accommodate the full JT65C bandwidth.
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
real function fchisq(cx,cy,npts,fsample,nflip,a,ccfmax,dtmax)
|
real function fchisq(cx,cy,npts,nfast,fsample,nflip,a,
|
||||||
|
+ ccfmax,dtmax)
|
||||||
|
|
||||||
parameter (NMAX=60*96000) !Samples per 60 s
|
parameter (NMAX=60*96000) !Samples per 60 s
|
||||||
complex cx(npts),cy(npts)
|
complex cx(npts),cy(npts)
|
||||||
@ -10,7 +11,13 @@
|
|||||||
save
|
save
|
||||||
|
|
||||||
call timer('fchisq ',0)
|
call timer('fchisq ',0)
|
||||||
baud=11025.0/4096.0
|
baud=nfast*11025.0/4096.0
|
||||||
|
nsps=nint(fsample/baud) !Samples per symbol
|
||||||
|
nsph=nsps/2 !Samples per half-symbol
|
||||||
|
ndiv=16 !Output ss() steps per symbol
|
||||||
|
nout=ndiv*npts/nsps
|
||||||
|
dtstep=1.0/(ndiv*baud) !Time per output step
|
||||||
|
|
||||||
if(a(1).ne.a1 .or. a(2).ne.a2 .or. a(3).ne.a3) then
|
if(a(1).ne.a1 .or. a(2).ne.a2 .or. a(3).ne.a3) then
|
||||||
a1=a(1)
|
a1=a(1)
|
||||||
a2=a(2)
|
a2=a(2)
|
||||||
@ -42,12 +49,6 @@ C Compute 1/2-symbol powers at 1/16-symbol steps.
|
|||||||
pol=a(4)/57.2957795
|
pol=a(4)/57.2957795
|
||||||
aa=cos(pol)
|
aa=cos(pol)
|
||||||
bb=sin(pol)
|
bb=sin(pol)
|
||||||
nsps=nint(fsample/baud) !Samples per symbol
|
|
||||||
nsph=nsps/2 !Samples per half-symbol
|
|
||||||
|
|
||||||
ndiv=16 !Output ss() steps per symbol
|
|
||||||
nout=ndiv*npts/nsps
|
|
||||||
dtstep=1.0/(ndiv*baud) !Time per output step
|
|
||||||
|
|
||||||
do i=1,nout
|
do i=1,nout
|
||||||
j=i*nsps/ndiv
|
j=i*nsps/ndiv
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
subroutine filbig(dd,nmax,f0,newdat,nfsample,xpol,c4a,c4b,n4)
|
subroutine filbig(dd,nmax,nfast,f0,newdat,nfsample,xpol,
|
||||||
|
+ c4a,c4b,n4)
|
||||||
|
|
||||||
C Filter and downsample complex data stored in array dd(4,nmax).
|
C Filter and downsample complex data stored in array dd(4,nmax).
|
||||||
C Output is downsampled from 96000 Hz to 1375.125 Hz.
|
C Output is downsampled from 96000 Hz to 1375.125 Hz.
|
||||||
@ -20,11 +21,20 @@ C Output is downsampled from 96000 Hz to 1375.125 Hz.
|
|||||||
+ 5.89886379,1.59355187,-2.49138308,0.60910773,-0.04248129/
|
+ 5.89886379,1.59355187,-2.49138308,0.60910773,-0.04248129/
|
||||||
save
|
save
|
||||||
|
|
||||||
nfft1=MAXFFT1
|
if(nfast.eq.1) then
|
||||||
nfft2=MAXFFT2
|
nfft1=MAXFFT1
|
||||||
if(nfsample.eq.95238) then
|
nfft2=MAXFFT2
|
||||||
nfft1=5120000
|
if(nfsample.eq.95238) then
|
||||||
nfft2=74088
|
nfft1=5120000
|
||||||
|
nfft2=74088
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
nfft1=2621440
|
||||||
|
nfft2=37632
|
||||||
|
if(nfsample.eq.95238) then
|
||||||
|
nfft1=2560000
|
||||||
|
nfft2=37044
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
if(nmax.lt.0) go to 900
|
if(nmax.lt.0) go to 900
|
||||||
if(first) then
|
if(first) then
|
||||||
|
@ -2,7 +2,7 @@ subroutine ftnquit
|
|||||||
|
|
||||||
! Destroy the FFTW plans
|
! Destroy the FFTW plans
|
||||||
call four2a(a,-1,1,1,1)
|
call four2a(a,-1,1,1,1)
|
||||||
call filbig(id,-1,f0,newdat,nfsample,c4a,c4b,n4)
|
call filbig(id,-1,1,f0,newdat,nfsample,c4a,c4b,n4)
|
||||||
stop
|
stop
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -106,9 +106,9 @@ program m65
|
|||||||
gainy=1.0265
|
gainy=1.0265
|
||||||
phasex=0.01426
|
phasex=0.01426
|
||||||
phasey=-0.01195
|
phasey=-0.01195
|
||||||
call symspec(k,nxpol,ndiskdat,nb,nbslider,idphi,nfsample,fgreen, &
|
call symspec(k,nfast,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, &
|
||||||
iqadjust,iqapply,gainx,gainy,phasex,phasey,rejectx,rejecty, &
|
fgreen,iqadjust,iqapply,gainx,gainy,phasex,phasey,rejectx, &
|
||||||
pxdb,pydb,ssz5a,nkhz,ihsym,nzap,slimit,lstrong)
|
rejecty,pxdb,pydb,ssz5a,nkhz,ihsym,nzap,slimit,lstrong)
|
||||||
call timer('symspec ',1)
|
call timer('symspec ',1)
|
||||||
nhsym0=nhsym
|
nhsym0=nhsym
|
||||||
if(ihsym.ge.278) go to 10
|
if(ihsym.ge.278) go to 10
|
||||||
|
@ -56,6 +56,7 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, &
|
|||||||
2 if(ndphi.eq.1) dphi=30*iloop/57.2957795
|
2 if(ndphi.eq.1) dphi=30*iloop/57.2957795
|
||||||
|
|
||||||
do nqd=1,0,-1
|
do nqd=1,0,-1
|
||||||
|
! do nqd=1,1,-1
|
||||||
if(nqd.eq.1) then !Quick decode, at fQSO
|
if(nqd.eq.1) then !Quick decode, at fQSO
|
||||||
fa=1000.0*(fqso+0.001*mousedf) - ntol
|
fa=1000.0*(fqso+0.001*mousedf) - ntol
|
||||||
fb=1000.0*(fqso+0.001*mousedf) + ntol + 4*53.8330078
|
fb=1000.0*(fqso+0.001*mousedf) + ntol + 4*53.8330078
|
||||||
@ -114,8 +115,8 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, &
|
|||||||
call timer('ccf65 ',0)
|
call timer('ccf65 ',0)
|
||||||
! ssmax=4.0*(rmsdd/22.5)**2
|
! ssmax=4.0*(rmsdd/22.5)**2
|
||||||
ssmax=savg(jpmax,i)
|
ssmax=savg(jpmax,i)
|
||||||
call ccf65(ss(1,1,i),nhsym,ssmax,sync1,ipol,jpz,dt,flipk, &
|
call ccf65(ss(1,1,i),nhsym,nfast,ssmax,sync1,ipol,jpz,dt, &
|
||||||
syncshort,snr2,ipol2,dt2)
|
flipk,syncshort,snr2,ipol2,dt2)
|
||||||
call timer('ccf65 ',1)
|
call timer('ccf65 ',1)
|
||||||
|
|
||||||
! ########################### Search for Shorthand Messages #################
|
! ########################### Search for Shorthand Messages #################
|
||||||
@ -204,10 +205,11 @@ subroutine map65a(dd,ss,savg,newdat,nutc,fcenter,ntol,idphi,nfa,nfb, &
|
|||||||
ifreq=i
|
ifreq=i
|
||||||
ikHz=nint(freq+0.5*(nfa+nfb)-foffset)-nfshift
|
ikHz=nint(freq+0.5*(nfa+nfb)-foffset)-nfshift
|
||||||
idf=nint(1000.0*(freq+0.5*(nfa+nfb)-foffset-(ikHz+nfshift)))
|
idf=nint(1000.0*(freq+0.5*(nfa+nfb)-foffset-(ikHz+nfshift)))
|
||||||
call decode1a(dd,newdat,f00,nflip,mode65,nfsample,xpol, &
|
! print*,ikhz,idf,dt,sync1,dt
|
||||||
mycall,hiscall,hisgrid,neme,ndepth,nqd,dphi,ndphi, &
|
call decode1a(dd,newdat,f00,nflip,mode65,nfast,nfsample, &
|
||||||
iloop,nutc,ikHz,idf,ipol,ntol,sync2,a,dt,pol,nkv, &
|
xpol,mycall,hiscall,hisgrid,neme,ndepth,nqd,dphi, &
|
||||||
nhist,nsum,nsave,qual,decoded)
|
ndphi,iloop,nutc,ikHz,idf,ipol,ntol,sync2,a,dt, &
|
||||||
|
pol,nkv,nhist,nsum,nsave,qual,decoded)
|
||||||
dt=dt+0.8 !### empirical tweak
|
dt=dt+0.8 !### empirical tweak
|
||||||
call timer('decode1a',1)
|
call timer('decode1a',1)
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
subroutine symspec(k,nfast, nxpol,ndiskdat,nb,nbslider,idphi,nfsample, &
|
subroutine symspec(k,nfast,nxpol,ndiskdat,nb,nbslider,idphi,nfsample, &
|
||||||
fgreen,iqadjust,iqapply,gainx,gainy,phasex,phasey,rejectx,rejecty, &
|
fgreen,iqadjust,iqapply,gainx,gainy,phasex,phasey,rejectx,rejecty, &
|
||||||
pxdb,pydb,ssz5a,nkhz,ihsym,nzap,slimit,lstrong)
|
pxdb,pydb,ssz5a,nkhz,ihsym,nzap,slimit,lstrong)
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//-------------------------------------------------------------- MainWindow
|
//--------------------------------------------------------------- MainWindow
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include "ui_mainwindow.h"
|
#include "ui_mainwindow.h"
|
||||||
#include "devsetup.h"
|
#include "devsetup.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user