2016-04-08 16:03:29 -04:00
|
|
|
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
|
|
|
|
|
2016-04-11 11:24:55 -04:00
|
|
|
x1(1:NZ-NBLK)=x1(NBLK+1:NZ)
|
|
|
|
do i=1,NZ-NBLK
|
2016-04-08 16:03:29 -04:00
|
|
|
write(13,1001) i,x0(i),x1(i),x1(i)-x0(i)
|
2016-04-11 11:24:55 -04:00
|
|
|
1001 format(i6,3f13.9)
|
2016-04-08 16:03:29 -04:00
|
|
|
enddo
|
|
|
|
|
|
|
|
end program t3
|
|
|
|
|
|
|
|
subroutine filter(x0,x1)
|
|
|
|
|
2016-04-11 11:24:55 -04:00
|
|
|
! Process time-domain data sequentially, optionally using a frequency-domain
|
|
|
|
! filter to alter the spectrum.
|
2016-04-08 16:03:29 -04:00
|
|
|
|
2016-04-11 11:24:55 -04:00
|
|
|
! NB: uses a sin^2 window with 50% overlap.
|
2016-04-08 16:03:29 -04:00
|
|
|
|
|
|
|
parameter (NFFT=6912,NH=NFFT/2)
|
2016-04-11 11:24:55 -04:00
|
|
|
real x0(0:NH-1) !Input samples
|
|
|
|
real x1(0:NH-1) !Output samples (delayed by one block)
|
|
|
|
real x0s(0:NH-1) !Saved upper half of input samples
|
|
|
|
real x1s(0:NH-1) !Saved upper half of output samples
|
|
|
|
real x(0:NFFT-1) !Work array
|
|
|
|
real*4 w(0:NFFT-1) !Window function
|
|
|
|
real f(0:NH) !Filter to be applied
|
|
|
|
real*4 s(0:NH) !Average spectrum
|
2016-04-08 16:03:29 -04:00
|
|
|
logical first
|
2016-04-11 11:24:55 -04:00
|
|
|
complex cx(0:NH) !Complex frequency-domain work array
|
2016-04-08 16:03:29 -04:00
|
|
|
equivalence (x,cx)
|
|
|
|
data first/.true./
|
|
|
|
save
|
|
|
|
|
|
|
|
if(first) then
|
|
|
|
pi=4.0*atan(1.0)
|
|
|
|
do i=0,NFFT-1
|
2016-04-11 11:24:55 -04:00
|
|
|
ww=sin(i*pi/NFFT)
|
|
|
|
w(i)=ww*ww/NFFT
|
2016-04-08 16:03:29 -04:00
|
|
|
enddo
|
2016-04-11 11:24:55 -04:00
|
|
|
s=0.0
|
|
|
|
f=1.0
|
|
|
|
x0s=0.
|
|
|
|
x1s=0.
|
2016-04-08 16:03:29 -04:00
|
|
|
first=.false.
|
|
|
|
endif
|
|
|
|
|
2016-04-11 11:24:55 -04:00
|
|
|
x(0:NH-1)=x0s !Previous 2nd half to new 1st half
|
|
|
|
x(NH:NFFT-1)=x0 !New 2nd half
|
|
|
|
x0s=x0 !Save the new 2nd half
|
|
|
|
x=w*x !Apply window
|
|
|
|
call four2a(x,NFFT,1,-1,0) !r2c FFT (to frequency domain)
|
|
|
|
cx=f*cx
|
|
|
|
call four2a(cx,NFFT,1,1,-1) !c2r FFT (back to time domain)
|
|
|
|
x1=x1s + x(0:NH-1) !Add previous segment's 2nd half
|
|
|
|
x1s=x(NH:NFFT-1) !Save the new 2nd half
|
2016-04-08 16:03:29 -04:00
|
|
|
|
|
|
|
return
|
|
|
|
end subroutine filter
|