Input M, N, K from sfoxtext command line. Correct freq after sync.

This commit is contained in:
Joe Taylor 2024-02-08 12:21:36 -05:00
parent c051168a6b
commit 56d0aac243
2 changed files with 28 additions and 20 deletions

View File

@ -13,6 +13,7 @@ program sfoxtest
complex clo(NMAX) !Complex Local Oscillator complex clo(NMAX) !Complex Local Oscillator
complex cnoise(NMAX) !Complex noise complex cnoise(NMAX) !Complex noise
complex crcvd(NMAX) !Signal as received complex crcvd(NMAX) !Signal as received
real a(3)
integer, allocatable :: msg0(:) !Information symbols integer, allocatable :: msg0(:) !Information symbols
integer, allocatable :: parsym(:) !Parity symbols integer, allocatable :: parsym(:) !Parity symbols
@ -22,9 +23,9 @@ program sfoxtest
character fname*17,arg*12 character fname*17,arg*12
nargs=iargc() nargs=iargc()
if(nargs.ne.8) then if(nargs.ne.9) then
print*,'Usage: sfoxtest f0 DT fspread delay width nran nfiles snr' print*,'Usage: sfoxtest f0 DT fspread delay M N K nfiles snr'
print*,'Example: sfoxtest 1500.0 0.15 0.5 1.0 100 0 10 -10' print*,'Example: sfoxtest 1500 0.15 0.5 1.0 8 74 44 10 -10'
go to 999 go to 999
endif endif
call getarg(1,arg) call getarg(1,arg)
@ -36,15 +37,18 @@ program sfoxtest
call getarg(4,arg) call getarg(4,arg)
read(arg,*) delay read(arg,*) delay
call getarg(5,arg) call getarg(5,arg)
read(arg,*) syncwidth read(arg,*) mm0
call getarg(6,arg) call getarg(6,arg)
read(arg,*) nran read(arg,*) nn0
call getarg(7,arg) call getarg(7,arg)
read(arg,*) nfiles read(arg,*) kk0
call getarg(8,arg) call getarg(8,arg)
read(arg,*) nfiles
call getarg(9,arg)
read(arg,*) snrdb read(arg,*) snrdb
call sfox_init call sfox_init(mm0,nn0,kk0)
syncwidth=100.0
baud=12000.0/NSPS baud=12000.0/NSPS
bw=NQ*baud bw=NQ*baud
@ -125,7 +129,12 @@ program sfoxtest
ferr=f-f1 ferr=f-f1
terr=t-xdt terr=t-xdt
if(abs(ferr).lt.3.0 .and. abs(terr).lt.0.01) ngoodsync=ngoodsync+1 if(abs(ferr).lt.3.0 .and. abs(terr).lt.0.01) ngoodsync=ngoodsync+1
! if(abs(terr).lt.0.01) ngoodsync=ngoodsync+1
a=0.
a(1)=1500.0-f
call twkfreq(crcvd,crcvd,NMAX,12000.0,a)
f=1500.0
call hard_symbols(crcvd,f,t,chansym) !Get hard symbol values call hard_symbols(crcvd,f,t,chansym) !Get hard symbol values
nera=0 nera=0
chansym=mod(chansym,nq) !Enforce 0 to nq-1 chansym=mod(chansym,nq) !Enforce 0 to nq-1
@ -152,7 +161,8 @@ program sfoxtest
1120 format('Hard errors:',i4) 1120 format('Hard errors:',i4)
endif endif
if(nharderr.le.38) ngood=ngood+1 !(125-49)/2 = 38 maxerr=(nn-kk)/2
if(nharderr.le.maxerr) ngood=ngood+1
! write(13,1200) ifile,snr,ferr,terr,nharderr ! write(13,1200) ifile,snr,ferr,terr,nharderr
!1200 format(i5,3f10.3,i5) !1200 format(i5,3f10.3,i5)
enddo ! ifile enddo ! ifile

View File

@ -1,36 +1,32 @@
subroutine sync_sf(crcvd,clo,snrdb,f,t) subroutine sync_sf(crcvd,clo,snrdb,f,t)
use sfox_mod use sfox_mod
! include "sfox_params.f90"
parameter (MMAX=150,JMAX=300) parameter (MMAX=150,JMAX=300)
real ccf(-MMAX:MMAX,-JMAX:JMAX) !2D CCF: DT, dFreq offsets real s(-MMAX:MMAX,-JMAX:JMAX) !s(DT,dFreq)
complex clo(NMAX) !Complex Local Oscillator complex clo(NMAX) !Complex Local Oscillator
complex crcvd(NMAX) !Signal as received complex crcvd(NMAX) !Signal as received
complex c(0:NFFT-1) complex c(0:NFFT-1) !Work array
integer ipk(2) integer ipk(2)
character*1 line(-30:30),mark(0:5) character*1 line(-30:30),mark(0:5)
data mark/' ','.','-','+','X','$'/ data mark/' ','.','-','+','X','$'/
ccf=0. s=0.
df=12000.0/NFFT !0.366211 df=12000.0/NFFT !0.366211
i1=ND1*nsps i1=ND1*nsps
do m=-MMAX,MMAX do m=-MMAX,MMAX
lag=100*m lag=100*m
c(0:nsync-1)=crcvd(i1+1+lag:i1+nsync+lag)*clo(1:nsync) c(0:nsync-1)=crcvd(i1+1+lag:i1+nsync+lag)*clo(1:nsync)
c(nsync:)=0. c(nsync:)=0.
fac=1.e-3
c=fac*c
call four2a(c,NFFT,1,-1,1) call four2a(c,NFFT,1,-1,1)
do j=-JMAX,JMAX do j=-JMAX,JMAX
k=j k=j
if(k.lt.0) k=k+NFFT if(k.lt.0) k=k+NFFT
ccf(m,j)=real(c(k))**2 + aimag(c(k))**2 s(m,j)=real(c(k))**2 + aimag(c(k))**2
enddo enddo
enddo enddo
ccf=ccf/maxval(ccf) s=s/maxval(s)
ipk=maxloc(ccf) ipk=maxloc(s)
! print*,i0,ipk(1)
ipk(1)=ipk(1)-MMAX-1 ipk(1)=ipk(1)-MMAX-1
ipk(2)=ipk(2)-JMAX-1 ipk(2)=ipk(2)-JMAX-1
if(snrdb.ne.0.0) then if(snrdb.ne.0.0) then
@ -40,7 +36,7 @@ subroutine sync_sf(crcvd,clo,snrdb,f,t)
jb=min(JMAX,ipk(2)+30) jb=min(JMAX,ipk(2)+30)
do m=ma,mb do m=ma,mb
do j=ja,jb do j=ja,jb
k=5.999*ccf(m,j) k=5.999*s(m,j)
line(j-ipk(2))=mark(k) line(j-ipk(2))=mark(k)
enddo enddo
write(*,1300) m/120.0,line write(*,1300) m/120.0,line
@ -50,6 +46,8 @@ subroutine sync_sf(crcvd,clo,snrdb,f,t)
t=ipk(1)/120.0 t=ipk(1)/120.0
dfreq=ipk(2)*df dfreq=ipk(2)*df
f=1500.0+dfreq f=1500.0+dfreq
! write(*,3001) ipk,t,dfreq,f
!3001 format('B',2i5,f7.3,2f7.1)
return return
end subroutine sync_sf end subroutine sync_sf