From 9a895361cf08f5a8271516b4865fab3fadd3bda2 Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Fri, 24 Feb 2017 18:20:56 +0000 Subject: [PATCH] Add a utility "allsim" to generate a wave file containing all WSJT-X slow modes as well as an unmodulated carrier and 25 WPM CW signal. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@7579 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- CMakeLists.txt | 4 +++ lib/addit.f90 | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++ lib/allsim.f90 | 70 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 lib/addit.f90 create mode 100644 lib/allsim.f90 diff --git a/CMakeLists.txt b/CMakeLists.txt index 2551389bf..cee0269ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -299,6 +299,7 @@ if (WIN32) endif (WIN32) set (wsjt_FSRCS + lib/addit.f90 lib/afc65b.f90 lib/afc9.f90 lib/ana64.f90 @@ -1048,6 +1049,9 @@ target_link_libraries (qra64sim wsjt_fort wsjt_cxx) add_executable (jt9sim lib/jt9sim.f90 wsjtx.rc) target_link_libraries (jt9sim wsjt_fort wsjt_cxx) +add_executable (allsim lib/allsim.f90 wsjtx.rc) +target_link_libraries (allsim wsjt_fort wsjt_cxx) + add_executable (jt65code lib/jt65code.f90 wsjtx.rc) target_link_libraries (jt65code wsjt_fort wsjt_cxx) diff --git a/lib/addit.f90 b/lib/addit.f90 new file mode 100644 index 000000000..7d54ff8db --- /dev/null +++ b/lib/addit.f90 @@ -0,0 +1,77 @@ +subroutine addit(itone,nfsample,nsym,nsps,ifreq,sig,dat) + + integer itone(nsym) + real dat(60*12000) + real*8 f,dt,twopi,phi,dphi,baud,fsample,freq,tsym,t + + tsym=nsps*1.d0/nfsample !Symbol duration + baud=1.d0/tsym + fsample=12000.d0 !Sample rate (Hz) + dt=1.d0/fsample !Sample interval (s) + twopi=8.d0*atan(1.d0) + + f=ifreq + phi=0. + k=12000 !Start audio at t = 1.0 s + ntot=nsym*tsym/dt + t=0. + isym0=-1 + do i=1,ntot + t=t+dt + isym=nint(t/tsym) + 1 + if(isym.ne.isym0) then + freq=f + itone(isym)*baud + dphi=twopi*freq*dt + 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 + + return +end subroutine addit + +subroutine addcw(icw,ncw,ifreq,sig,dat) + + integer icw(ncw) + real dat(60*12000) + real s(60*12000) + real x(60*12000) + real y(60*12000) + real*8 dt,twopi,phi,dphi,fsample,tdit,t + + wpm=25.0 + nspd=nint(1.2*12000.0/wpm) + fsample=12000.d0 !Sample rate (Hz) + dt=1.d0/fsample !Sample interval (s) + tdit=nspd*dt + twopi=8.d0*atan(1.d0) + dphi=twopi*ifreq*dt + phi=0. + k=12000 !Start audio at t = 1.0 s + t=0. + npts=60*12000 + x=0. + do i=1,npts + t=t+dt + j=nint(t/tdit) + 1 + j=mod(j-1,ncw) + 1 + phi=phi + dphi + if(phi.gt.twopi) phi=phi-twopi + xphi=phi + k=k+1 + x(k)=icw(j) + s(k)=sin(xphi) + if(t.ge.59.5) exit + enddo + + nadd=0.004/dt + call smo(x,npts,y,nadd) + y=y/nadd + dat=dat + sig*y*s + + return +end subroutine addcw diff --git a/lib/allsim.f90 b/lib/allsim.f90 new file mode 100644 index 000000000..0aa156864 --- /dev/null +++ b/lib/allsim.f90 @@ -0,0 +1,70 @@ +program allsim + +! Generate simulated data for WSJT-X slow modes: JT4, JT9, JT65, QRA64, +! and WSPR. Also unmodulated carrier and 20 WPM CW. + + + use wavhdr + use packjt + parameter (NMAX=60*12000) + type(hdr) h + integer*2 iwave(NMAX) !Generated waveform (no noise) + integer itone(206) !Channel symbols (values 0-8) + integer icw(250) + real*4 dat(NMAX) + character message*22,msgsent*22,arg*8 + + nargs=iargc() + if(nargs.ne.1) then + print*,'Usage: allsim ' + go to 999 + endif + + call getarg(1,arg) + read(arg,*) snrdb !S/N in dB (2500 hz reference BW) + + message='CQ KA2ABC FN20' + rmsdb=25. + rms=10.0**(0.05*rmsdb) + sig=10.0**(0.05*snrdb) + npts=NMAX + + call init_random_seed() !Seed Fortran RANDOM_NUMBER generator + call sgran() !Seed C rand generator (used in gran) + + h=default_header(12000,npts) + open(10,file='000000_0000.wav',access='stream',status='unknown') + do i=1,npts !Generate gaussian noise + dat(i)=gran() + enddo + + itone=0 + call addit(itone,12000,85,6912,400,sig,dat) !Unmodulated carrier + + call morse('CQ CQ DE KA2ABC KA2ABC',icw,ncw) +! print*,ncw +! write(*,3001) icw(1:ncw) +!3001 format(50i1) + call addcw(icw,ncw,600,sig,dat) !CW + + call genwspr(message,msgsent,itone) + call addit(itone,12000,86,8192,800,sig,dat) !WSPR (only 59 s of data) + + call gen9(message,0,msgsent,itone,itype) + call addit(itone,12000,85,6912,1000,sig,dat) !JT9 + + call gen4(message,0,msgsent,itone,itype) + call addit(itone,11025,206,2520,1200,sig,dat) !JT4 + + call genqra64(message,0,msgsent,itone,itype) + call addit(itone,12000,84,6912,1400,sig,dat) !QRA64 + + call gen65(message,0,msgsent,itone,itype) + call addit(itone,11025,126,4096,1600,sig,dat) !JT65 + + iwave(1:npts)=nint(rms*dat(1:npts)) + + write(10) h,iwave(1:npts) + close(10) + +999 end program allsim