77 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
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
 | 
						|
 | 
						|
  x1(1:NZ-NBLK)=x1(NBLK+1:NZ)
 | 
						|
  do i=1,NZ-NBLK
 | 
						|
     write(13,1001) i,x0(i),x1(i),x1(i)-x0(i)
 | 
						|
1001 format(i6,3f13.9)
 | 
						|
  enddo
 | 
						|
 | 
						|
end program t3
 | 
						|
 | 
						|
subroutine filter(x0,x1)
 | 
						|
 | 
						|
! Process time-domain data sequentially, optionally using a frequency-domain
 | 
						|
! filter to alter the spectrum.
 | 
						|
 | 
						|
! NB: uses a sin^2 window with 50% overlap.
 | 
						|
 | 
						|
  parameter (NFFT=6912,NH=NFFT/2)
 | 
						|
  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
 | 
						|
  logical first
 | 
						|
  complex cx(0:NH)                        !Complex frequency-domain work array
 | 
						|
  equivalence (x,cx)
 | 
						|
  data first/.true./
 | 
						|
  save
 | 
						|
 | 
						|
  if(first) then
 | 
						|
     pi=4.0*atan(1.0)
 | 
						|
     do i=0,NFFT-1
 | 
						|
        ww=sin(i*pi/NFFT)
 | 
						|
        w(i)=ww*ww/NFFT
 | 
						|
     enddo
 | 
						|
     s=0.0
 | 
						|
     f=1.0
 | 
						|
     x0s=0.
 | 
						|
     x1s=0.
 | 
						|
     first=.false.
 | 
						|
  endif
 | 
						|
 | 
						|
  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
 | 
						|
 | 
						|
  return
 | 
						|
end subroutine filter
 |