Update allsim.f90 and addit.f90 for the new FT8 and FT4 waveforms.

This commit is contained in:
Joe Taylor 2019-12-04 15:44:38 -05:00
parent 5716cdbcd4
commit 61e8cb65d4
2 changed files with 91 additions and 68 deletions

View File

@ -11,34 +11,26 @@ subroutine addit(itone,nfsample,nsym,nsps,ifreq,sig,dat)
twopi=8.d0*atan(1.d0) twopi=8.d0*atan(1.d0)
dphi=0. dphi=0.
iters=1 f=ifreq
if(nsym.eq.79) iters=2 !FT8 phi=0.
if(nsym.eq.103) iters=5 !FT4 ntot=nsym*tsym/dt
k=12000 !Start audio at t = 1.0 s
do iter=1,iters t=0.
f=ifreq isym0=-1
phi=0. do i=1,ntot
ntot=nsym*tsym/dt t=t+dt
k=12000 !Start audio at t = 1.0 s isym=nint(t/tsym) + 1
t=0. if(isym.gt.nsym) exit
if(nsym.eq.79) k=12000 + (iter-1)*12000*30 !Special case for FT8 if(isym.ne.isym0) then
if(nsym.eq.103) k=12000 + (iter-1)*12000*10 !Special case for FT4 freq=f + itone(isym)*baud
isym0=-1 dphi=twopi*freq*dt
do i=1,ntot isym0=isym
t=t+dt endif
isym=nint(t/tsym) + 1 phi=phi + dphi
if(isym.gt.nsym) exit if(phi.gt.twopi) phi=phi-twopi
if(isym.ne.isym0) then xphi=phi
freq=f + itone(isym)*baud k=k+1
dphi=twopi*freq*dt dat(k)=dat(k) + sig*sin(xphi)
isym0=isym
endif
phi=phi + dphi
if(phi.gt.twopi) phi=phi-twopi
xphi=phi
k=k+1
dat(k)=dat(k) + sig*sin(xphi)
enddo
enddo enddo
return return

View File

@ -2,83 +2,114 @@ program allsim
! Generate simulated data for WSJT-X modes: JT4, JT9, JT65, FT8, FT4, QRA64, ! Generate simulated data for WSJT-X modes: JT4, JT9, JT65, FT8, FT4, QRA64,
! and WSPR. Also unmodulated carrier and 20 WPM CW. ! and WSPR. Also unmodulated carrier and 20 WPM CW.
use wavhdr use wavhdr
use packjt use packjt
parameter (NMAX=60*12000) parameter (NMAX=60*12000)
type(hdr) h type(hdr) h !Header for the .wav file
integer*2 iwave(NMAX) !Generated waveform (no noise) integer*2 iwave(NMAX) !Generated waveform (no noise)
integer itone(206) !Channel symbols (values 0-8) integer itone(206) !Channel symbols (values 0-8)
integer icw(250) integer icw(250) !Encoded CW message bits
integer*1 msgbits(87) integer*1 msgbits(77) !Encoded message bits for FT8, FT4
logical*1 bcontest real dat(NMAX) !Audio waveform
real*4 dat(NMAX) complex cwave(NMAX)
character message*22,msgsent*22,arg*8,mygrid*6 real wave(NMAX)
character message*22,msgsent*22,arg*8
character*37 msg37,msgsent37 character*37 msg37,msgsent37
nargs=iargc() nargs=iargc()
if(nargs.ne.1) then if(nargs.ne.1 .and. nargs.ne.2) then
print*,'Usage: allsim <snr>' print*,'Usage: allsim snr [isig]'
print*,'Examples: allsim -10 #Include all signal types'
print*,' allsim -10 6 #Include FT8 only'
print*,'isig order: 1 2 3 4 5 6 7 8 9'
print*,' Carrier CW WSPR JT9 JT4 FT8 FT4 QRA64 JT65'
go to 999 go to 999
endif endif
call getarg(1,arg) call getarg(1,arg)
read(arg,*) snrdb !S/N in dB (2500 hz reference BW) read(arg,*) snrdb !S/N in dB (2500 hz reference BW)
isig=0
if(nargs.eq.2) then
call getarg(2,arg)
read(arg,*) isig
endif
message='CQ KA2ABC FN20' message='CQ KA2ABC FN20'
mygrid='FN20 ' msg37=message//' '
bcontest=.false.
rmsdb=25. rmsdb=25.
rms=10.0**(0.05*rmsdb) rms=10.0**(0.05*rmsdb)
sig=10.0**(0.05*snrdb) sig=10.0**(0.05*snrdb)
npts=NMAX
call init_random_seed() !Seed Fortran RANDOM_NUMBER generator call init_random_seed() !Seed Fortran RANDOM_NUMBER generator
call sgran() !Seed C rand generator (used in gran) call sgran() !Seed C rand generator (used in gran)
h=default_header(12000,npts) h=default_header(12000,NMAX)
open(10,file='000000_0000.wav',access='stream',status='unknown') open(10,file='000000_0000.wav',access='stream',status='unknown')
do i=1,npts !Generate gaussian noise do i=1,NMAX !Generate gaussian noise
dat(i)=gran() dat(i)=gran()
enddo enddo
itone=0 itone=0
call addit(itone,12000,85,6912,400,sig,dat) !Unmodulated carrier if(isig.eq.0 .or. isig.eq.1) then
call addit(itone,12000,85,6912,400,sig,dat) !Unmodulated carrier
endif
call morse('CQ CQ DE KA2ABC KA2ABC',icw,ncw) if(isig.eq.0 .or. isig.eq.2) then
! print*,ncw call morse('CQ CQ DE KA2ABC KA2ABC',icw,ncw)
! write(*,3001) icw(1:ncw) call addcw(icw,ncw,600,sig,dat) !CW
!3001 format(50i1) endif
call addcw(icw,ncw,600,sig,dat) !CW
call genwspr(message,msgsent,itone) if(isig.eq.0 .or. isig.eq.3) then
call addit(itone,12000,86,8192,800,sig,dat) !WSPR (only 59 s of data) call genwspr(message,msgsent,itone)
call addit(itone,12000,86,8192,800,sig,dat) !WSPR (only 59 s of data)
endif
call gen9(message,0,msgsent,itone,itype) if(isig.eq.0 .or. isig.eq.4) then
call addit(itone,12000,85,6912,1000,sig,dat) !JT9 call gen9(message,0,msgsent,itone,itype)
call addit(itone,12000,85,6912,1000,sig,dat) !JT9
endif
call gen4(message,0,msgsent,itone,itype) if(isig.eq.0 .or. isig.eq.5) then
call addit(itone,11025,206,2520,1200,sig,dat) !JT4 call gen4(message,0,msgsent,itone,itype)
call addit(itone,11025,206,2520,1200,sig,dat) !JT4
endif
i3=-1 if(isig.eq.0 .or. isig.eq.6) then
n3=-1 call genft8(msg37,i3,n3,msgsent37,msgbits,itone) !FT8
call genft8(message,i3,n3,msgsent,msgbits,itone) nwave=79*1920
call addit(itone,12000,79,1920,1400,sig,dat) !FT8 call gen_ft8wave(itone,79,1920,2.0,12000.0,1400.0,cwave,wave,0,nwave)
dat(6001:6000+nwave)=dat(6001:6000+nwave) + sig*wave(1:nwave)
k=30*12000
dat(6001+k:6000+nwave+k)=dat(6001+k:6000+nwave+k) + sig*wave(1:nwave)
endif
msg37=message//' ' if(isig.eq.0 .or. isig.eq.7) then
call genft4(msg37,0,msgsent37,itone) call genft4(msg37,0,msgsent37,msgbits,itone) !FT4
call addit(itone,12000,103,512,1600,sig,dat) !FT4 nwave=105*576
call gen_ft4wave(itone,103,576,12000.0,1600.0,cwave,wave,0,nwave)
dat(6001:6000+nwave)=dat(6001:6000+nwave) + sig*wave(1:nwave)
k=15*12000
dat(6001+k:6000+nwave+k)=dat(6001+k:6000+nwave+k) + sig*wave(1:nwave)
k=30*12000
dat(6001+k:6000+nwave+k)=dat(6001+k:6000+nwave+k) + sig*wave(1:nwave)
k=45*12000
dat(6001+k:6000+nwave+k)=dat(6001+k:6000+nwave+k) + sig*wave(1:nwave)
call genqra64(message,0,msgsent,itone,itype) endif
call addit(itone,12000,84,6912,1800,sig,dat) !QRA64
call gen65(message,0,msgsent,itone,itype) if(isig.eq.0 .or. isig.eq.8) then
call addit(itone,11025,126,4096,2000,sig,dat) !JT65 call genqra64(message,0,msgsent,itone,itype)
call addit(itone,12000,84,6912,1800,sig,dat) !QRA64
endif
iwave(1:npts)=nint(rms*dat(1:npts)) if(isig.eq.0 .or. isig.eq.9) then
call gen65(message,0,msgsent,itone,itype)
write(10) h,iwave(1:npts) call addit(itone,11025,126,4096,2000,sig,dat) !JT65
endif
iwave=nint(rms*dat)
write(10) h,iwave
close(10) close(10)
999 end program allsim 999 end program allsim