mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-25 05:38:46 -05:00
70 lines
1.8 KiB
Fortran
70 lines
1.8 KiB
Fortran
subroutine watterson(c,npts,nsig,fs,delay,fspread)
|
|
!
|
|
! npts is the total length of the simulated data vector
|
|
! nsig is the number of points that are occupied by signal
|
|
!
|
|
complex c(0:npts-1)
|
|
complex c2(0:npts-1)
|
|
complex cs1(0:npts-1)
|
|
complex cs2(0:npts-1)
|
|
|
|
nonzero=0
|
|
df=fs/npts
|
|
if(fspread.gt.0.0) then
|
|
do i=0,npts-1
|
|
xx=gran()
|
|
yy=gran()
|
|
cs1(i)=0.707*cmplx(xx,yy)
|
|
xx=gran()
|
|
yy=gran()
|
|
cs2(i)=0.707*cmplx(xx,yy)
|
|
enddo
|
|
call four2a(cs1,npts,1,-1,1) !To freq domain
|
|
call four2a(cs2,npts,1,-1,1)
|
|
do i=0,npts-1
|
|
f=i*df
|
|
if(i.gt.npts/2) f=(i-npts)*df
|
|
x=(f/(0.5*fspread))**2
|
|
a=0.
|
|
if(x.le.50.0) then
|
|
a=exp(-x)
|
|
endif
|
|
cs1(i)=a*cs1(i)
|
|
cs2(i)=a*cs2(i)
|
|
if(abs(f).lt.10.0) then
|
|
p1=real(cs1(i))**2 + aimag(cs1(i))**2
|
|
p2=real(cs2(i))**2 + aimag(cs2(i))**2
|
|
if(p1.gt.0.0) nonzero=nonzero+1
|
|
! write(62,3101) f,p1,p2,db(p1+1.e-12)-60,db(p2+1.e-12)-60
|
|
!3101 format(f10.3,2f12.3,2f10.3)
|
|
endif
|
|
enddo
|
|
call four2a(cs1,npts,1,1,1) !Back to time domain
|
|
call four2a(cs2,npts,1,1,1)
|
|
cs1(0:npts-1)=cs1(0:npts-1)/npts
|
|
cs2(0:npts-1)=cs2(0:npts-1)/npts
|
|
endif
|
|
|
|
nshift=nint(0.001*delay*fs)
|
|
if(delay.gt.0.0) then
|
|
c2(0:npts-1)=cshift(c(0:npts-1),-nshift) !negative shifts are right shifts
|
|
else
|
|
c2(0:npts-1)=0.0
|
|
endif
|
|
sq=0.
|
|
do i=0,npts-1
|
|
if(nonzero.gt.1) then
|
|
c(i)=0.5*(cs1(i)*c(i) + cs2(i)*c2(i))
|
|
else
|
|
c(i)=0.5*(c(i) + c2(i))
|
|
endif
|
|
sq=sq + real(c(i))**2 + aimag(c(i))**2
|
|
! write(61,3001) i/12000.0,c(i)
|
|
!3001 format(3f12.6)
|
|
enddo
|
|
rms=sqrt(sq/nsig)
|
|
c=c/rms
|
|
|
|
return
|
|
end subroutine watterson
|