WSJT-X/lib/allsim.f90

123 lines
4.1 KiB
Fortran

program allsim
! Generate simulated data for WSJT-X modes: JT4, JT9, JT65, FT8, FT4, QRA64,
! and WSPR. Also unmodulated carrier and 20 WPM CW.
use wavhdr
use packjt
parameter (NMAX=60*12000)
type(hdr) h !Header for the .wav file
integer*2 iwave(NMAX) !Generated waveform (no noise)
integer itone(206) !Channel symbols (values 0-8)
integer icw(250) !Encoded CW message bits
integer*1 msgbits(101) !Encoded message bits for FST4 FT8 FT4
real dat(NMAX) !Audio waveform
complex cwave(NMAX)
real wave(NMAX)
character message*22,msgsent*22,arg*8
character*37 msg37,msgsent37
nargs=iargc()
if(nargs.ne.1 .and. nargs.ne.2) then
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 10'
print*,' Carrier CW WSPR FST4 JT9 JT4 FT8 FT4 Q65 JT65'
go to 999
endif
call getarg(1,arg)
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'
msg37=message//' '
rmsdb=25.
rms=10.0**(0.05*rmsdb)
sig=10.0**(0.05*snrdb)
call init_random_seed() !Seed Fortran RANDOM_NUMBER generator
call sgran() !Seed C rand generator (used in gran)
h=default_header(12000,NMAX)
open(10,file='000000_0000.wav',access='stream',status='unknown')
do i=1,NMAX !Generate gaussian noise
dat(i)=gran()
enddo
itone=0
if(isig.eq.0 .or. isig.eq.1) then
call addit(itone,12000,85,6912,400,sig,dat) !1 Unmodulated carrier
endif
if(isig.eq.0 .or. isig.eq.2) then
call morse('CQ CQ DE KA2ABC KA2ABC',icw,ncw)
call addcw(icw,ncw,600,sig,dat) !2 CW at 20 WPM
endif
if(isig.eq.0 .or. isig.eq.3) then
call genwspr(message,msgsent,itone)
call addit(itone,12000,86,8192,800,sig,dat) !3 WSPR (only 59 s of data)
endif
if(isig.eq.0 .or. isig.eq.4) then !4 FST4-60
iwspr=0
call genfst4(msg37,0,msgsent37,msgbits,itone,iwspr)
nwave=162*3888
call gen_fst4wave(itone,160,3888,nwave,12000.0,1,1000.0,0,cwave,wave)
dat(6001:6000+nwave)=dat(6001:6000+nwave) + sig*wave(1:nwave)
endif
if(isig.eq.0 .or. isig.eq.5) then
call gen9(message,0,msgsent,itone,itype)
call addit(itone,12000,85,6912,1200,sig,dat) !4 JT9
endif
if(isig.eq.0 .or. isig.eq.6) then
call gen4(message,0,msgsent,itone,itype)
call addit(itone,11025,206,2520,1400,sig,dat) !6 JT4
endif
if(isig.eq.0 .or. isig.eq.7) then
call genft8(msg37,i3,n3,msgsent37,msgbits,itone) !7 FT8
nwave=79*1920
call gen_ft8wave(itone,79,1920,2.0,12000.0,1600.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
if(isig.eq.0 .or. isig.eq.8) then
call genft4(msg37,0,msgsent37,msgbits,itone) !8 FT4
nwave=105*576
call gen_ft4wave(itone,103,576,12000.0,1800.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)
endif
if(isig.eq.0 .or. isig.eq.9) then
call genq65(msg37,0,msgsent37,itone,i3,n3)
call addit(itone,12000,85,7200,2000,sig,dat) !9 Q65
endif
if(isig.eq.0 .or. isig.eq.10) then
call gen65(message,0,msgsent,itone,itype)
call addit(itone,11025,126,4096,2200,sig,dat) !10 JT65A
endif
iwave=nint(rms*dat)
write(10) h,iwave
close(10)
999 end program allsim