| 
									
										
										
										
											2019-06-12 11:31:35 -04:00
										 |  |  | program rtty_spec
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Generate simulated data for standard RTTY and WSJT-X modes FT8, FT4
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   use wavhdr
 | 
					
						
							|  |  |  |   use packjt
 | 
					
						
							|  |  |  |   parameter (NMAX=15*12000)
 | 
					
						
							|  |  |  |   type(hdr) h
 | 
					
						
							|  |  |  |   complex cwave(NMAX)
 | 
					
						
							|  |  |  |   real wave(NMAX)
 | 
					
						
							|  |  |  |   real*4 dat(NMAX)             !Generated waveform
 | 
					
						
							|  |  |  |   integer*2 iwave(NMAX)        !Generated waveform
 | 
					
						
							|  |  |  |   integer itone(680)           !Channel symbols (values 0-1, 0-3, 0-7)
 | 
					
						
							|  |  |  |   integer*1 msgbits(77)
 | 
					
						
							|  |  |  |   character*37 msg37,msgsent37
 | 
					
						
							|  |  |  |   character*8 arg
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   nargs=iargc()
 | 
					
						
							|  |  |  |   if(nargs.ne.1) then
 | 
					
						
							|  |  |  |      print*,'Usage:   rtty_spec <snr>'
 | 
					
						
							|  |  |  |      go to 999
 | 
					
						
							|  |  |  |   endif
 | 
					
						
							|  |  |  |   call getarg(1,arg)
 | 
					
						
							|  |  |  |   read(arg,*) snrdb                  !S/N in dB (2500 hz reference BW)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   rmsdb=25.
 | 
					
						
							|  |  |  |   rms=10.0**(0.05*rmsdb)
 | 
					
						
							|  |  |  |   sig=10.0**(0.05*snrdb)
 | 
					
						
							|  |  |  |   npts=NMAX
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   do i=1,NMAX                   !Generate gaussian noise
 | 
					
						
							|  |  |  |      dat(i)=gran()
 | 
					
						
							|  |  |  |   enddo
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Add the RTTY signal
 | 
					
						
							|  |  |  |   fsample=12000.0                   !Sample rate (Hz)
 | 
					
						
							|  |  |  |   dt=1.0/fsample                    !Sample interval (s)
 | 
					
						
							|  |  |  |   twopi=8.0*atan(1.0)
 | 
					
						
							|  |  |  |   phi=0.
 | 
					
						
							|  |  |  |   dphi=0.
 | 
					
						
							|  |  |  |   j0=-1
 | 
					
						
							|  |  |  |   do i=6001,NMAX-6000
 | 
					
						
							|  |  |  |      j=nint(i*dt/0.022)
 | 
					
						
							|  |  |  |      if(j.ne.j0) then
 | 
					
						
							|  |  |  |         f0=1415.0
 | 
					
						
							|  |  |  |         call random_number(rr)
 | 
					
						
							|  |  |  |         if(rr.gt.0.5) f0=1585.0
 | 
					
						
							|  |  |  |         dphi=twopi*f0*dt
 | 
					
						
							|  |  |  |         j0=j
 | 
					
						
							|  |  |  |      endif
 | 
					
						
							|  |  |  |      phi=phi+dphi
 | 
					
						
							|  |  |  |      if(phi.gt.twopi) phi=phi-twopi
 | 
					
						
							|  |  |  |      dat(i)=dat(i) + sig*sin(phi)
 | 
					
						
							|  |  |  |   enddo
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-13 11:07:29 -04:00
										 |  |  | ! FT8 signal (FSK)
 | 
					
						
							|  |  |  |   i3=0
 | 
					
						
							|  |  |  |   n3=0
 | 
					
						
							|  |  |  |   msg37='WB9XYZ KA2ABC FN42'
 | 
					
						
							|  |  |  |   call genft8(msg37,i3,n3,msgsent37,msgbits,itone)
 | 
					
						
							|  |  |  |   nsym=79
 | 
					
						
							|  |  |  |   nsps=1920
 | 
					
						
							|  |  |  |   bt=99.0
 | 
					
						
							|  |  |  |   f0=3500.0
 | 
					
						
							|  |  |  |   icmplx=0
 | 
					
						
							|  |  |  |   nwave=nsym*nsps
 | 
					
						
							|  |  |  |   call gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave)
 | 
					
						
							|  |  |  |   dat(6001:6000+nwave)=dat(6001:6000+nwave) + sig*wave(1:nwave)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! FT8 signal (GFSK)
 | 
					
						
							| 
									
										
										
										
											2019-06-12 11:31:35 -04:00
										 |  |  |   i3=0
 | 
					
						
							|  |  |  |   n3=0
 | 
					
						
							|  |  |  |   msg37='WB9XYZ KA2ABC FN42'
 | 
					
						
							|  |  |  |   call genft8(msg37,i3,n3,msgsent37,msgbits,itone)
 | 
					
						
							|  |  |  |   nsym=79
 | 
					
						
							|  |  |  |   nsps=1920
 | 
					
						
							|  |  |  |   bt=2.0
 | 
					
						
							| 
									
										
										
										
											2019-06-13 11:07:29 -04:00
										 |  |  |   f0=4000.0
 | 
					
						
							| 
									
										
										
										
											2019-06-12 11:31:35 -04:00
										 |  |  |   icmplx=0
 | 
					
						
							|  |  |  |   nwave=nsym*nsps
 | 
					
						
							|  |  |  |   call gen_ft8wave(itone,nsym,nsps,bt,fsample,f0,cwave,wave,icmplx,nwave)
 | 
					
						
							|  |  |  |   dat(6001:6000+nwave)=dat(6001:6000+nwave) + sig*wave(1:nwave)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Add the FT4 signal
 | 
					
						
							|  |  |  |   ichk=0
 | 
					
						
							|  |  |  |   call genft4(msg37,ichk,msgsent37,msgbits,itone)
 | 
					
						
							|  |  |  |   nsym=103
 | 
					
						
							|  |  |  |   nsps=576
 | 
					
						
							| 
									
										
										
										
											2019-06-13 11:07:29 -04:00
										 |  |  |   f0=4500.0
 | 
					
						
							| 
									
										
										
										
											2019-06-12 11:31:35 -04:00
										 |  |  |   icmplx=0
 | 
					
						
							|  |  |  |   nwave=(nsym+2)*nsps
 | 
					
						
							|  |  |  |   call gen_ft4wave(itone,nsym,nsps,fsample,f0,cwave,wave,icmplx,nwave)
 | 
					
						
							|  |  |  |   dat(6001:6000+nwave)=dat(6001:6000+nwave) + sig*wave(1:nwave)
 | 
					
						
							| 
									
										
										
										
											2019-06-13 11:07:29 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-12 11:31:35 -04:00
										 |  |  |   h=default_header(12000,NMAX)
 | 
					
						
							| 
									
										
										
										
											2019-06-13 11:07:29 -04:00
										 |  |  |   datmax=maxval(abs(dat))
 | 
					
						
							|  |  |  |   iwave=nint(32767.0*dat/datmax)
 | 
					
						
							| 
									
										
										
										
											2019-06-12 11:31:35 -04:00
										 |  |  |   open(10,file='000000_000001.wav',access='stream',status='unknown')
 | 
					
						
							|  |  |  |   write(10) h,iwave
 | 
					
						
							|  |  |  |   close(10)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 999 end program rtty_spec
 |