WSJT-X/lib/fst4/lorentzian_fading.f90

44 lines
837 B
Fortran

subroutine lorentzian_fading(c,npts,fs,fspread)
!
! npts is the total length of the simulated data vector
!
complex c(0:npts-1)
complex cspread(0:npts-1)
complex z
twopi=8.0*atan(1.0)
df=fs/npts
nh=npts/2
cspread(0)=1.0
cspread(nh)=0.
b=6.0
do i=1,nh
f=i*df
x=b*f/fspread
z=0.
a=0.
if(x.lt.3.0) then
a=sqrt(1.111/(1.0+x*x)-0.1)
phi1=twopi*rran()
z=a*cmplx(cos(phi1),sin(phi1))
endif
cspread(i)=z
z=0.
if(x.lt.3.0) then
phi2=twopi*rran()
z=a*cmplx(cos(phi2),sin(phi2))
endif
cspread(npts-i)=z
enddo
call four2a(cspread,npts,1,1,1)
s=sum(abs(cspread)**2)
avep=s/npts
fac=sqrt(1.0/avep)
cspread=fac*cspread
c=cspread*c
return
end subroutine lorentzian_fading