WSJT-X/lib/fst280/gen_fst280wave.f90

78 lines
2.2 KiB
Fortran
Raw Normal View History

subroutine gen_fst280wave(itone,nsym,nsps,nwave,fsample,hmod,f0, &
icmplx,cwave,wave)
real wave(nwave)
complex cwave(nwave)
real, allocatable, save :: pulse(:)
real, allocatable :: dphi(:)
integer hmod
integer itone(nsym)
logical first
data first/.true./
data nsps0/-99/
save first,twopi,dt,tsym,nsps0
if(first.or.nsps.ne.nsps0) then
if(allocated(pulse)) deallocate(pulse)
allocate(pulse(1:3*nsps))
twopi=8.0*atan(1.0)
dt=1.0/fsample
tsym=nsps/fsample
! Compute the smoothed frequency-deviation pulse
do i=1,3*nsps
tt=(i-1.5*nsps)/real(nsps)
pulse(i)=gfsk_pulse(2.0,tt)
enddo
first=.false.
nsps0=nsps
endif
! Compute the smoothed frequency waveform.
! Length = (nsym+2)*nsps samples, zero-padded
allocate( dphi(0:(nsym+2)*nsps-1) )
dphi_peak=twopi*hmod/real(nsps)
dphi=0.0
do j=1,nsym
ib=(j-1)*nsps
ie=ib+3*nsps-1
dphi(ib:ie) = dphi(ib:ie) + dphi_peak*pulse(1:3*nsps)*itone(j)
enddo
! Calculate and insert the audio waveform
phi=0.0
dphi = dphi + twopi*(f0-1.5*hmod/tsym)*dt !Shift frequency up by f0
if(icmplx.eq.0) wave=0.
if(icmplx.eq.1) cwave=0.
k=0
do j=0,(nsym+2)*nsps-1
k=k+1
if(icmplx.eq.0) then
wave(k)=sin(phi)
else
cwave(k)=cmplx(cos(phi),sin(phi))
endif
phi=mod(phi+dphi(j),twopi)
enddo
! Compute the ramp-up and ramp-down symbols
if(icmplx.eq.0) then
wave(1:nsps/2)=0.0
wave(nsps/2+1:nsps)=wave(nsps/2+1:nsps) * &
(1.0-cos(twopi*(/(i,i=0,nsps/2-1)/)/real(nsps)))/2.0
k1=(nsym+1)*nsps+1
wave(k1+nsps/2:)=0.0
wave(k1:k1+nsps/2-1)=wave(k1:k1+nsps/2-1) * &
(1.0+cos(twopi*(/(i,i=0,nsps/2-1)/)/real(nsps)))/2.0
else
cwave(1:nsps/2)=0.0
cwave(nsps/2+1:nsps)=cwave(nsps/2+1:nsps) * &
(1.0-cos(twopi*(/(i,i=0,nsps/2-1)/)/real(nsps)))/2.0
k1=(nsym+1)*nsps+1
cwave(k1+nsps/2:)=0.0
cwave(k1:k1+nsps/2-1)=cwave(k1:k1+nsps/2-1) * &
(1.0+cos(twopi*(/(i,i=0,nsps/2-1)/)/real(nsps)))/2.0
endif
return
end subroutine gen_fst280wave