mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-06 17:24:03 -05:00
97 lines
2.7 KiB
Fortran
97 lines
2.7 KiB
Fortran
|
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
|