mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-09-03 21:57:48 -04:00
Work in progress toward trying a Q65-style sync.
This commit is contained in:
parent
b25e7fce8c
commit
4491da67f7
@ -4,43 +4,31 @@ subroutine sfox_gen(idat,f0,fsample,isync,cdat)
|
|||||||
complex cdat(NMAX) !Generated complex waveform
|
complex cdat(NMAX) !Generated complex waveform
|
||||||
complex w,wstep
|
complex w,wstep
|
||||||
integer idat(NN)
|
integer idat(NN)
|
||||||
integer isync(50)
|
integer isync(44)
|
||||||
|
integer itone(171)
|
||||||
|
|
||||||
twopi=8.0*atan(1.0)
|
twopi=8.0*atan(1.0)
|
||||||
tsync=NS*NSPS/fsample
|
|
||||||
|
! Create the itone sequence: data symbols and interspersed sync symbols
|
||||||
|
j=1
|
||||||
|
k=0
|
||||||
|
do i=1,NDS
|
||||||
|
if(j.le.NS .and. i.eq.isync(min(j,NS))) then
|
||||||
|
j=j+1 !Index for next sync symbol
|
||||||
|
itone(i)=0 !Insert sync symbol at tone 0
|
||||||
|
else
|
||||||
|
k=k+1
|
||||||
|
itone(i)=idat(k) + 1 !Symbol value 0 is transmitted at tone 1, etc.
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
|
||||||
df=fsample/NSPS
|
df=fsample/NSPS
|
||||||
w=1.0
|
w=1.0
|
||||||
j=0
|
j=0
|
||||||
k=0
|
|
||||||
i0=NQ/2
|
i0=NQ/2
|
||||||
! First group of data symbols:
|
! Generate the waveform
|
||||||
do n=1,ND1
|
do k=1,NDS
|
||||||
k=k+1
|
dphi=(f0 + (itone(k)-i0)*df)*(twopi/fsample)
|
||||||
dphi=(f0 + (idat(k)-i0)*df)*(twopi/fsample)
|
|
||||||
wstep=cmplx(cos(dphi),sin(dphi))
|
|
||||||
do i=1,NSPS
|
|
||||||
j=j+1
|
|
||||||
w=w*wstep
|
|
||||||
cdat(j)=w
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
|
|
||||||
! Insert sync symbols
|
|
||||||
do n=1,NS
|
|
||||||
dphi=(f0 + (isync(n)-i0)*df)*(twopi/fsample)
|
|
||||||
wstep=cmplx(cos(dphi),sin(dphi))
|
|
||||||
do i=1,NSPS
|
|
||||||
j=j+1
|
|
||||||
w=w*wstep
|
|
||||||
cdat(j)=w
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
|
|
||||||
|
|
||||||
! Final group of data symbols:
|
|
||||||
do n=1,ND2
|
|
||||||
k=k+1
|
|
||||||
dphi=(f0 + (idat(k)-i0)*df)*(twopi/fsample)
|
|
||||||
wstep=cmplx(cos(dphi),sin(dphi))
|
wstep=cmplx(cos(dphi),sin(dphi))
|
||||||
do i=1,NSPS
|
do i=1,NSPS
|
||||||
j=j+1
|
j=j+1
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
module sfox_mod
|
module sfox_mod
|
||||||
|
|
||||||
parameter (NMAX=15*12000) !Samples in iwave (180,000)
|
parameter (NMAX=15*12000) !Samples in iwave (180,000)
|
||||||
integer MM,NQ,NN,KK,ND1,ND2,NFZ,NSPS,NS,NSYNC,NZ,NFFT,NFFT1
|
integer MM,NQ,NN,KK,NS,NDS,NFZ,NSPS,NSYNC,NZ,NFFT,NFFT1
|
||||||
|
|
||||||
contains
|
contains
|
||||||
subroutine sfox_init(mm0,nn0,kk0,itu,fspread,delay,fsample,ts)
|
subroutine sfox_init(mm0,nn0,kk0,itu,fspread,delay,fsample,ns0)
|
||||||
|
|
||||||
character*2 itu
|
character*2 itu
|
||||||
integer isps(54)
|
integer isps(54)
|
||||||
@ -18,19 +18,17 @@ contains
|
|||||||
|
|
||||||
MM=mm0 !Bits per symbol
|
MM=mm0 !Bits per symbol
|
||||||
NQ=2**MM !Q, number of MFSK tones
|
NQ=2**MM !Q, number of MFSK tones
|
||||||
NN=nn0 !Number of channel symbols
|
NN=nn0 !Codeword length
|
||||||
KK=kk0 !Information symbols
|
KK=kk0 !Number of information symbols
|
||||||
ND1=25 !Data symbols before sync
|
NS=ns0 !Number of sync symbols
|
||||||
ND2=NN-ND1 !Data symbols after sync
|
NDS=NN+NS !Total number of channel symbols
|
||||||
NFZ=3 !First zero
|
NFZ=3 !First zero
|
||||||
|
|
||||||
jsps=nint((12.8-ts)*fsample/NN)
|
jsps=nint(12.8*fsample/NDS)
|
||||||
iloc=minloc(abs(isps-jsps))
|
iloc=minloc(abs(isps-jsps))
|
||||||
NSPS=isps(iloc(1)) !Samples per symbol
|
NSPS=isps(iloc(1)) !Samples per symbol
|
||||||
NS=nint(ts*fsample/NSPS)
|
|
||||||
if(mod(NS,2).eq.1) NS=NS+1
|
|
||||||
NSYNC=NS*NSPS !Samples in sync waveform
|
NSYNC=NS*NSPS !Samples in sync waveform
|
||||||
NZ=NSPS*(NN+NS) !Samples in full Tx waveform
|
NZ=NSPS*NDS !Samples in full Tx waveform
|
||||||
NFFT=32768 !Length of FFT for sync waveform
|
NFFT=32768 !Length of FFT for sync waveform
|
||||||
NFFT1=2*NSPS !Length of FFTs for symbol spectra
|
NFFT1=2*NSPS !Length of FFTs for symbol spectra
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ program sfoxtest
|
|||||||
type(hdr) h !Header for .wav file
|
type(hdr) h !Header for .wav file
|
||||||
integer*2 iwave(NMAX) !Generated i*2 waveform
|
integer*2 iwave(NMAX) !Generated i*2 waveform
|
||||||
integer param(0:8)
|
integer param(0:8)
|
||||||
integer isync(50)
|
integer isync(44)
|
||||||
real*4 xnoise(NMAX) !Random noise
|
real*4 xnoise(NMAX) !Random noise
|
||||||
real*4 dat(NMAX) !Generated real data
|
real*4 dat(NMAX) !Generated real data
|
||||||
complex cdat(NMAX) !Generated complex waveform
|
complex cdat(NMAX) !Generated complex waveform
|
||||||
@ -31,21 +31,24 @@ program sfoxtest
|
|||||||
logical hard_sync
|
logical hard_sync
|
||||||
character fname*17,arg*12,itu*2
|
character fname*17,arg*12,itu*2
|
||||||
|
|
||||||
! Shortcut: this is OK for NS <= 24 only
|
data isync/ 1, 2, 5, 11, 19, 24, 26, 28, 29, 35, &
|
||||||
data isync(1:24)/ 21, 94, 55,125, 94, 29, 11, 64, 63, 6, &
|
39, 48, 51, 53, 55, 56, 66, 71, 74, 78, &
|
||||||
59, 67, 52, 39,116, 98, 67, 68, 75, 87, &
|
80, 82, 84, 85, 92, 98, 103, 107, 109, 111, &
|
||||||
116, 22,113,105/
|
116, 122, 130, 131, 134, 136, 137, 140, 146, 154, &
|
||||||
|
159, 161, 163, 165/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
nargs=iargc()
|
nargs=iargc()
|
||||||
if(nargs.ne.11) then
|
if(nargs.ne.11) then
|
||||||
print*,'Usage: sfoxtest f0 DT ITU M N K ts v hs nfiles snr'
|
print*,'Usage: sfoxtest f0 DT ITU M N K NS v hs nfiles snr'
|
||||||
print*,'Example: sfoxtest 1500 0.15 MM 7 127 48 3 0 F 10 -10'
|
print*,'Example: sfoxtest 1500 0.15 MM 7 127 48 33 0 F 10 -10'
|
||||||
print*,' f0=0 means f0, DT will assume suitable random values'
|
print*,' f0=0 means f0, DT will assume suitable random values'
|
||||||
print*,' LQ: Low Latitude Quiet'
|
print*,' LQ: Low Latitude Quiet'
|
||||||
print*,' MM: Mid Latitude Moderate'
|
print*,' MM: Mid Latitude Moderate'
|
||||||
print*,' HD: High Latitude Disturbed'
|
print*,' HD: High Latitude Disturbed'
|
||||||
print*,' ... and similarly for LM LD MQ MD HQ HM'
|
print*,' ... and similarly for LM LD MQ MD HQ HM'
|
||||||
print*,' ts: approximate sync duration (s)'
|
print*,' NS: number of sync symbols'
|
||||||
print*,' v=1 for .wav files, 2 for verbose output, 3 for both'
|
print*,' v=1 for .wav files, 2 for verbose output, 3 for both'
|
||||||
print*,' hs = T for hard-wired sync'
|
print*,' hs = T for hard-wired sync'
|
||||||
print*,' snr=0 means loop over SNRs'
|
print*,' snr=0 means loop over SNRs'
|
||||||
@ -63,7 +66,7 @@ program sfoxtest
|
|||||||
call getarg(6,arg)
|
call getarg(6,arg)
|
||||||
read(arg,*) kk0
|
read(arg,*) kk0
|
||||||
call getarg(7,arg)
|
call getarg(7,arg)
|
||||||
read(arg,*) ts
|
read(arg,*) ns0
|
||||||
call getarg(8,arg)
|
call getarg(8,arg)
|
||||||
read(arg,*) nv
|
read(arg,*) nv
|
||||||
call getarg(9,arg)
|
call getarg(9,arg)
|
||||||
@ -77,7 +80,7 @@ program sfoxtest
|
|||||||
call timer('sfoxtest',0)
|
call timer('sfoxtest',0)
|
||||||
|
|
||||||
fsample=12000.0 !Sample rate (Hz)
|
fsample=12000.0 !Sample rate (Hz)
|
||||||
call sfox_init(mm0,nn0,kk0,itu,fspread,delay,fsample,ts)
|
call sfox_init(mm0,nn0,kk0,itu,fspread,delay,fsample,ns0)
|
||||||
baud=fsample/NSPS
|
baud=fsample/NSPS
|
||||||
tsym=1.0/baud
|
tsym=1.0/baud
|
||||||
bw=NQ*baud
|
bw=NQ*baud
|
||||||
@ -107,7 +110,6 @@ program sfoxtest
|
|||||||
baud=fsample/nsps !Keying rate, 11.719 baud for nsps=1024
|
baud=fsample/nsps !Keying rate, 11.719 baud for nsps=1024
|
||||||
bandwidth_ratio=2500.0/fsample
|
bandwidth_ratio=2500.0/fsample
|
||||||
fgood0=1.0
|
fgood0=1.0
|
||||||
! isync(NS-3:NS)=NQ/2 !Set last few sync symbols to NQ/2
|
|
||||||
|
|
||||||
! Generate a message
|
! Generate a message
|
||||||
msg0=0
|
msg0=0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user