100 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
		
		
			
		
	
	
			100 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Fortran
		
	
	
	
	
	
|  | program msk144sim
 | ||
|  | 
 | ||
|  |   use wavhdr
 | ||
|  |   parameter (NMAX=15*12000)
 | ||
|  |   real pings(0:NMAX-1)
 | ||
|  |   real waveform(0:NMAX-1)
 | ||
|  |   character*6 mygrid
 | ||
|  |   character arg*8,msg*22,msgsent*22,fname*40
 | ||
|  |   real wave(0:NMAX-1)              !Simulated received waveform
 | ||
|  |   real*8 twopi,freq,phi,dphi0,dphi1,dphi
 | ||
|  |   type(hdr) h                          !Header for .wav file
 | ||
|  |   integer*2 iwave(0:NMAX-1)
 | ||
|  |   integer itone(144)                   !Message bits
 | ||
|  |   logical*1 bcontest
 | ||
|  |   data mygrid/"EN50wc"/
 | ||
|  | 
 | ||
|  |   nargs=iargc()
 | ||
|  |   if(nargs.ne.6) then
 | ||
|  |      print*,'Usage:   msk144sim       message      freq width nslow snr nfiles'
 | ||
|  |      print*,'Example: msk144sim "K1ABC W9XYZ EN37" 1500  0.12   1    2    1'
 | ||
|  |      print*,'         msk144sim "K1ABC W9XYZ EN37" 1500  2.5   32   15    1'
 | ||
|  |      go to 999
 | ||
|  |   endif
 | ||
|  |   call getarg(1,msg)
 | ||
|  |   call getarg(2,arg)
 | ||
|  |   read(arg,*) freq
 | ||
|  |   call getarg(3,arg)
 | ||
|  |   read(arg,*) width
 | ||
|  |   call getarg(4,arg)
 | ||
|  |   read(arg,*) nslow
 | ||
|  |   call getarg(5,arg)
 | ||
|  |   read(arg,*) snrdb
 | ||
|  |   call getarg(6,arg)
 | ||
|  |   read(arg,*) nfiles
 | ||
|  | 
 | ||
|  | !sig is the peak amplitude of the ping. 
 | ||
|  |   sig=sqrt(2.0)*10.0**(0.05*snrdb)
 | ||
|  |   h=default_header(12000,NMAX)
 | ||
|  |   i1=len(trim(msg))-5
 | ||
|  |   bcontest=.false.
 | ||
|  |   if(msg(i1:i1+1).eq.'R ') bcontest=.true.
 | ||
|  |   ichk=0
 | ||
|  |   call genmsk144(msg,mygrid,ichk,bcontest,msgsent,itone,itype) 
 | ||
|  |   twopi=8.d0*atan(1.d0)
 | ||
|  | 
 | ||
|  |   nsym=144
 | ||
|  |   nsps=6*nslow
 | ||
|  |   if( itone(41) .lt. 0 ) nsym=40
 | ||
|  |   baud=2000.d0/nslow
 | ||
|  |   dphi0=twopi*(freq-0.25d0*baud)/12000.d0
 | ||
|  |   dphi1=twopi*(freq+0.25d0*baud)/12000.d0
 | ||
|  |   phi=0.0
 | ||
|  |   k=0
 | ||
|  |   nreps=NMAX/(nsym*nsps)
 | ||
|  |   print*,nsym,nslow,nsps,baud,freq
 | ||
|  |   do jrep=1,nreps
 | ||
|  |     do i=1,nsym
 | ||
|  |       if( itone(i) .eq. 0 ) then
 | ||
|  |         dphi=dphi0
 | ||
|  |       else
 | ||
|  |         dphi=dphi1
 | ||
|  |       endif
 | ||
|  |       do j=1,nsps
 | ||
|  |         waveform(k)=cos(phi)
 | ||
|  |         k=k+1
 | ||
|  |         phi=mod(phi+dphi,twopi)
 | ||
|  |       enddo 
 | ||
|  |     enddo
 | ||
|  |   enddo 
 | ||
|  | 
 | ||
|  |   if(itype.lt.1 .or. itype.gt.7) then
 | ||
|  |      print*,'Illegal message'
 | ||
|  |      go to 999
 | ||
|  |   endif
 | ||
|  | 
 | ||
|  |   if(nslow.eq.1) call makepings(pings,NMAX,width,sig)
 | ||
|  | 
 | ||
|  | !  call sgran()
 | ||
|  |   do ifile=1,nfiles                  !Loop over requested number of files
 | ||
|  |      write(fname,1002) ifile         !Output filename
 | ||
|  | 1002 format('000000_',i6.6)
 | ||
|  |      open(10,file=fname(1:13)//'.wav',access='stream',status='unknown')
 | ||
|  | 
 | ||
|  |      wave=0.0
 | ||
|  |      iwave=0
 | ||
|  |      fac=sqrt(6000.0/2500.0)
 | ||
|  |      do i=0,NMAX-1
 | ||
|  |         xx=gran()
 | ||
|  |         if(nslow.eq.1) wave(i)=pings(i)*waveform(i) + fac*xx
 | ||
|  |         if(nslow.gt.1) wave(i)=sig*waveform(i) + fac*xx
 | ||
|  |         iwave(i)=30.0*wave(i)
 | ||
|  |      enddo
 | ||
|  | 
 | ||
|  |      write(10) h,iwave               !Save the .wav file
 | ||
|  |      close(10)
 | ||
|  | 
 | ||
|  |   enddo
 | ||
|  | 
 | ||
|  | 999 end program msk144sim
 |