62 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
subroutine subtractft8(dd,itone,f0,dt)
 | 
						|
 | 
						|
! Subtract an ft8 signal
 | 
						|
!
 | 
						|
! Measured signal  : dd(t)    = a(t)cos(2*pi*f0*t+theta(t))
 | 
						|
! Reference signal : cref(t)  = exp( j*(2*pi*f0*t+phi(t)) )
 | 
						|
! Complex amp      : cfilt(t) = LPF[ dd(t)*CONJG(cref(t)) ]
 | 
						|
! Subtract         : dd(t)    = dd(t) - 2*REAL{cref*cfilt}
 | 
						|
 | 
						|
  use timer_module, only: timer
 | 
						|
 | 
						|
  parameter (NMAX=15*12000,NFRAME=1920*79)
 | 
						|
  parameter (NFFT=NMAX,NFILT=400)
 | 
						|
  real*4  dd(NMAX), window(-NFILT/2:NFILT/2)
 | 
						|
  complex cref,camp,cfilt,cw
 | 
						|
  integer itone(79)
 | 
						|
  logical first
 | 
						|
  data first/.true./
 | 
						|
  common/heap8/cref(NFRAME),camp(NMAX),cfilt(NMAX),cw(NMAX)
 | 
						|
  save first
 | 
						|
 | 
						|
  nstart=dt*12000+1
 | 
						|
  call genft8refsig(itone,cref,f0)
 | 
						|
  camp=0.
 | 
						|
  do i=1,nframe
 | 
						|
    id=nstart-1+i 
 | 
						|
    if(id.ge.1.and.id.le.NMAX) camp(i)=dd(id)*conjg(cref(i))
 | 
						|
  enddo
 | 
						|
 | 
						|
  if(first) then
 | 
						|
! Create and normalize the filter
 | 
						|
     pi=4.0*atan(1.0)
 | 
						|
     fac=1.0/float(nfft)
 | 
						|
     sum=0.0
 | 
						|
     do j=-NFILT/2,NFILT/2
 | 
						|
        window(j)=cos(pi*j/NFILT)**2
 | 
						|
        sum=sum+window(j)
 | 
						|
     enddo
 | 
						|
     cw=0.
 | 
						|
     cw(1:NFILT+1)=window/sum
 | 
						|
     cw=cshift(cw,NFILT/2+1)
 | 
						|
     call four2a(cw,nfft,1,-1,1)
 | 
						|
     cw=cw*fac
 | 
						|
     first=.false.
 | 
						|
  endif
 | 
						|
 | 
						|
  cfilt=0.0
 | 
						|
  cfilt(1:nframe)=camp(1:nframe)
 | 
						|
  call four2a(cfilt,nfft,1,-1,1)
 | 
						|
  cfilt(1:nfft)=cfilt(1:nfft)*cw(1:nfft)
 | 
						|
  call four2a(cfilt,nfft,1,1,1)
 | 
						|
 | 
						|
! Subtract the reconstructed signal
 | 
						|
  do i=1,nframe
 | 
						|
     j=nstart+i-1
 | 
						|
     if(j.ge.1 .and. j.le.NMAX) dd(j)=dd(j)-2*REAL(cfilt(i)*cref(i))
 | 
						|
  enddo
 | 
						|
 | 
						|
  return
 | 
						|
end subroutine subtractft8
 | 
						|
 |