From 6bfe2ed7099275705bd5bb54d5bb22ac3f6cd95c Mon Sep 17 00:00:00 2001 From: Joe Taylor Date: Tue, 28 Aug 2012 13:48:46 +0000 Subject: [PATCH] First cut at program "mapsim". (Frequency stuff is not right, yet.) git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/map65@2531 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- libm65/Makefile.MinGW | 6 ++- libm65/cgen65.f90 | 96 +++++++++++++++++++++++++++++++++++++++++++ libm65/mapsim.f90 | 77 ++++++++++++++++++++++++++++++++++ libm65/noisegen.f90 | 13 ++++++ 4 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 libm65/cgen65.f90 create mode 100644 libm65/mapsim.f90 create mode 100644 libm65/noisegen.f90 diff --git a/libm65/Makefile.MinGW b/libm65/Makefile.MinGW index 9257546bc..04e68d8f0 100644 --- a/libm65/Makefile.MinGW +++ b/libm65/Makefile.MinGW @@ -17,7 +17,7 @@ CFLAGS = -I. -fbounds-check %.o: %.F90 ${FC} ${FFLAGS} -c $< -all: libm65.a m65.exe JT65code.exe +all: libm65.a m65.exe JT65code.exe mapsim.exe OBJS1 = trimlist.o display.o getdphi.o pctile.o ccf65.o \ decode1a.o sort.o filbig.o fil6521.o afc65b.o \ @@ -50,6 +50,10 @@ OBJS2 = JT65code.o JT65code.exe: $(OBJS2) libm65.a $(FC) -o JT65code.exe $(OBJS2) libm65.a +OBJS6 = mapsim.o cgen65.o noisegen.o gran.o +mapsim.exe: $(OBJS6) libm65.a + $(FC) -o mapsim.exe $(OBJS6) libm65.a + INCPATH = -I'c:/QtSDK/Desktop/Qt/4.7.4/mingw/include/QtCore' \ -I'c:/QtSDK/Desktop/Qt/4.7.4/mingw/include' \ -I'c:/QtSDK/Desktop/Qt/4.7.4/mingw/include/ActiveQt' \ diff --git a/libm65/cgen65.f90 b/libm65/cgen65.f90 new file mode 100644 index 000000000..60f228f32 --- /dev/null +++ b/libm65/cgen65.f90 @@ -0,0 +1,96 @@ +subroutine cgen65(message,mode65,samfac,nsendingsh,msgsent,cwave,nwave) + +! Encodes a JT65 message into a wavefile. +! Executes in 17 ms on opti-745. + + parameter (NMAX=60*96000) !Max length of wave file + character*22 message !Message to be generated + character*22 msgsent !Message as it will be received + character*3 cok !' ' or 'OOO' + real*8 dt,phi,f,f0,dfgen,dphi,twopi,samfac + complex cwave(NMAX) !Generated complex wave file + integer dgen(12) + integer sent(63) + logical first + integer nprc(126) + real pr(126) + data nprc/1,0,0,1,1,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0, & + 0,1,0,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1, & + 0,1,1,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1, & + 0,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,0,0,1, & + 1,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1, & + 0,1,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1, & + 1,1,1,1,1,1/ + data twopi/6.283185307179586476d0/,first/.true./ + save + + if(first) then + do i=1,126 + pr(i)=2*nprc(i)-1 + enddo + first=.false. + endif + + call chkmsg(message,cok,nspecial,flip) + if(nspecial.eq.0) then + call packmsg(message,dgen) !Pack message into 72 bits + nsendingsh=0 + if(iand(dgen(10),8).ne.0) nsendingsh=-1 !Plain text flag + + call rs_encode(dgen,sent) + call interleave63(sent,1) !Apply interleaving + call graycode(sent,63,1) !Apply Gray code + nsym=126 !Symbols per transmission + nsps=4096 + else + nsym=32 + nsps=16384 + nsendingsh=1 !Flag for shorthand message + endif + if(mode65.eq.0) go to 900 + + nsps=nint(nsps*96000.d0/11025.d0) + +! Set up necessary constants + dt=1.d0/(samfac*96000.d0) + f0=118*11025.d0/1024 + dfgen=mode65*11025.d0/4096.d0 + phi=0.d0 + i=0 + k=0 + do j=1,nsym + f=f0 + if(nspecial.ne.0 .and. mod(j,2).eq.0) f=f0+10*nspecial*dfgen + if(nspecial.eq.0 .and. flip*pr(j).lt.0.0) then + k=k+1 + f=f0+(sent(k)+2)*dfgen + endif + dphi=twopi*dt*f + do ii=1,nsps + phi=phi+dphi + if(phi.gt.twopi) phi=phi-twopi + xphi=phi + i=i+1 +! iwave(i)=32767.0*sin(xphi) + cwave(i)=cmplx(cos(xphi),-sin(xphi)) + enddo + enddo + + cwave(nsym*nsps+1:)=0 + nwave=nsym*nsps + 5512 + call unpackmsg(dgen,msgsent) + if(flip.lt.0.0) then + do i=22,1,-1 + if(msgsent(i:i).ne.' ') goto 10 + enddo +10 msgsent=msgsent(1:i)//' OOO' + endif + + if(nsendingsh.eq.1) then + if(nspecial.eq.2) msgsent='RO' + if(nspecial.eq.3) msgsent='RRR' + if(nspecial.eq.4) msgsent='73' + endif + +900 return +end subroutine cgen65 diff --git a/libm65/mapsim.f90 b/libm65/mapsim.f90 new file mode 100644 index 000000000..cf887f54a --- /dev/null +++ b/libm65/mapsim.f90 @@ -0,0 +1,77 @@ +program mapsim + + parameter (NMAX=96000*60) + integer*2 id2(2,NMAX) + integer*2 id4(4,NMAX) + real*4 d4(4,NMAX) + complex cwave(NMAX) + complex z,zx,zy + real*8 fcenter,fsample,samfac,f,dt,twopi,phi,dphi + character message*22,msgsent*22,arg*8 + + nargs=iargc() + if(nargs.ne.2) then + print*,'Usage: mapsim "message" pol' + go to 999 + endif + call getarg(1,message) + call getarg(2,arg) + read(arg,*) pol + + open(10,file='000000_0000.iq',access='stream',status='unknown') + open(11,file='000000_0000.tf2',access='stream',status='unknown') + + call noisegen(d4,NMAX) + mode65=2 + samfac=1.d0 + call cgen65(message,mode65,samfac,nsendingsh,msgsent,cwave,nwave) + + fcenter=144.125d0 + fsample=96000.d0 + twopi=8.d0*atan(1.d0) + rad=360.0/twopi + a=cos(pol/rad) + b=sin(pol/rad) + dt=1.d0/fsample + + do isig=10,10 + f=-23 + 3*isig + dt=0.05d0*(isig-1) +! snrdb=-(19.0 + (isig-1)/2.0) + snrdb=-20.0 + sig=sqrt(2500.0/96000.0) * 10.0**(0.05*snrdb) + sig=1.6*sig + dphi=twopi*f*dt + phi=0. + i0=fsample*(3.5d0+dt) + print*,f,dt,dphi,i0,sig + + do i=1,nwave + phi=phi + dphi +! if(phi.gt.twopi) phi=phi-twopi +! xphi=phi + z=sig*cwave(i)*cmplx(cos(phi),sin(phi)) + zx=a*z + zy=b*z + j=i+i0 + d4(1,j)=d4(1,j) + real(zx) + d4(2,j)=d4(2,j) + aimag(zx) + d4(3,j)=d4(3,j) + real(zy) + d4(4,j)=d4(4,j) + aimag(zy) + enddo + enddo + + s=31.6 + do i=1,NMAX + id4(1,i)=nint(s*d4(1,i)) + id4(2,i)=nint(s*d4(2,i)) + id4(3,i)=nint(s*d4(3,i)) + id4(4,i)=nint(s*d4(4,i)) + id2(1,i)=id4(1,i) + id2(2,i)=id4(2,i) + enddo + + write(10) fcenter,id2 + write(11) fcenter,id4 + +999 end program mapsim diff --git a/libm65/noisegen.f90 b/libm65/noisegen.f90 new file mode 100644 index 000000000..f92a9df01 --- /dev/null +++ b/libm65/noisegen.f90 @@ -0,0 +1,13 @@ +subroutine noisegen(d4,nmax) + + real*4 d4(4,nmax) + + do i=1,nmax + d4(1,i)=gran() + d4(2,i)=gran() + d4(3,i)=gran() + d4(4,i)=gran() + enddo + + return +end subroutine noisegen