WSJT-X/lib/t3.f90

76 lines
1.5 KiB
Fortran
Raw Normal View History

program t3
parameter (NBLK=3456,NZ=10*NBLK)
real x0(NZ)
real x1(NZ)
twopi=8.0*atan(1.0)
dphi=twopi*1000.0/12000.0
phi=0.
do i=1,NZ
phi=phi+dphi
x0(i)=sin(phi)
if(mod(i,10007).eq.100) x0(i)=2.0
enddo
do j=1,10
ib=j*NBLK
ia=ib-NBLK+1
call filter(x0(ia:ib),x1(ia:ib))
enddo
do i=1,NZ
write(13,1001) i,x0(i),x1(i),x1(i)-x0(i)
1001 format(i6,3e12.3)
enddo
end program t3
subroutine filter(x0,x1)
! Process time-domain data sequentially, optionally using 'refspec.dat'
! to flatten the spectrum.
! NB: sin^2 window with 50% overlap; sin^2 + cos^2 = 1.0.
parameter (NFFT=6912,NH=NFFT/2)
real x0(0:NH-1) !Real input data
real x1(0:NH-1) !Real output data
real xov(0:NH-1)
real x(0:NFFT-1)
complex cx(0:NH)
real*4 w(0:NFFT-1)
real*4 s(0:NH)
logical first
equivalence (x,cx)
data first/.true./
save
if(first) then
pi=4.0*atan(1.0)
do i=0,NFFT-1
w(i)=(sin(i*pi/NFFT))**2
enddo
s=0.
fac=1.0/NFFT
first=.false.
xov=0.
endif
x(:NH-1)=xov !Previous 2nd half to new 1st half
x(NH:)=x0 !New 2nd half
x=x*w !Apply window
call four2a(x,NFFT,1,-1,0) !r2c FFT: to freq domain
! Apply filter to cx()
call four2a(cx,NFFT,1,1,-1) !c2r FFT: back to time domain
x(0:NH-1)=x(0:NH-1)+xov(0:NH-1) !Add previous segment's 2nd half
x1=x
return
end subroutine filter