100 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			100 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								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
							 |