mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 13:30:52 -05:00 
			
		
		
		
	Add xfft2: quick kludge to avoid re-entrancy problem, since xfft is called
by spec in the GUI thread. Don't use "zero" in spec. git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/trunk@130 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
		
							parent
							
								
									b124626138
								
							
						
					
					
						commit
						74c44596fd
					
				@ -36,7 +36,7 @@ SRCS2F77 = wsjt1.f avesp2.f bzap.f spec441.f spec2d.f mtdecode.f \
 | 
			
		||||
	limit.f lpf1.f deep65.f morse.f nchar.f packcall.f packgrid.f \
 | 
			
		||||
	packmsg.f packtext.f setup65.f short65.f slope.f spec2d65.f \
 | 
			
		||||
	sync65.f unpackcall.f unpackgrid.f unpackmsg.f unpacktext.f \
 | 
			
		||||
	xcor.f xfft.f wsjt65.f astro.f azdist.f coord.f dcoord.f \
 | 
			
		||||
	xcor.f xfft.f xfft2.f wsjt65.f astro.f azdist.f coord.f dcoord.f \
 | 
			
		||||
	deg2grid.f dot.f ftsky.f geocentric.f GeoDist.f grid2deg.f \
 | 
			
		||||
	moon2.f MoonDop.f sun.f toxyz.f pfxdump.f
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -36,7 +36,7 @@ subroutine horizspec(x,brightness,contrast,a)
 | 
			
		||||
     do i=1,nfft
 | 
			
		||||
        y(i)=1.4*x(i+i0)
 | 
			
		||||
     enddo
 | 
			
		||||
     call xfft(y,nfft)
 | 
			
		||||
     call xfft2(y,nfft)
 | 
			
		||||
     nq=nfft/4
 | 
			
		||||
     do i=1,nq
 | 
			
		||||
        ss(i)=real(c(i))**2 + imag(c(i))**2
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										10
									
								
								spec.f90
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								spec.f90
									
									
									
									
									
								
							@ -36,7 +36,9 @@ subroutine spec(brightness,contrast,logmap,ngain,nspeed,a)
 | 
			
		||||
  save
 | 
			
		||||
 | 
			
		||||
  if(first) then
 | 
			
		||||
     call zero(ss,nq)
 | 
			
		||||
     do i=1,nq
 | 
			
		||||
        ss(i)=0.
 | 
			
		||||
     enddo
 | 
			
		||||
     istep=2205
 | 
			
		||||
     nfft=4096
 | 
			
		||||
     nq=nfft/4
 | 
			
		||||
@ -136,7 +138,7 @@ subroutine spec(brightness,contrast,logmap,ngain,nspeed,a)
 | 
			
		||||
     go to 900
 | 
			
		||||
  endif
 | 
			
		||||
 | 
			
		||||
  call xfft(x,nfft)
 | 
			
		||||
  call xfft2(x,nfft)
 | 
			
		||||
 | 
			
		||||
  do i=1,nq                               !Accumulate power spectrum
 | 
			
		||||
     ss(i)=ss(i) + real(c(i))**2 + imag(c(i))**2
 | 
			
		||||
@ -167,7 +169,9 @@ subroutine spec(brightness,contrast,logmap,ngain,nspeed,a)
 | 
			
		||||
     enddo
 | 
			
		||||
     nsum=0
 | 
			
		||||
     newdat=1                          !Flag for new spectrum available
 | 
			
		||||
     call zero(ss,nq)                  !Zero the accumulating array
 | 
			
		||||
     do i=1,nq                         !Zero the accumulating array
 | 
			
		||||
        ss(i)=0.
 | 
			
		||||
     enddo
 | 
			
		||||
     if(jz.lt.300) jz=jz+1
 | 
			
		||||
  endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								wsjt.py
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								wsjt.py
									
									
									
									
									
								
							@ -1,4 +1,4 @@
 | 
			
		||||
#---------------------------------------------------------------- WSJT
 | 
			
		||||
#----------------------------------------------------------------- WSJT
 | 
			
		||||
from Tkinter import *
 | 
			
		||||
from tkFileDialog import *
 | 
			
		||||
import Pmw
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										184
									
								
								xfft2.f
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								xfft2.f
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,184 @@
 | 
			
		||||
      SUBROUTINE xfft2(DATA,NB)
 | 
			
		||||
c
 | 
			
		||||
c     the cooley-tukey fast fourier transform in usasi basic fortran
 | 
			
		||||
c
 | 
			
		||||
C     .. Scalar Arguments ..
 | 
			
		||||
      INTEGER NB
 | 
			
		||||
C     ..
 | 
			
		||||
C     .. Array Arguments ..
 | 
			
		||||
      REAL DATA(NB+2)
 | 
			
		||||
C     ..
 | 
			
		||||
C     .. Local Scalars ..
 | 
			
		||||
      REAL DIFI,DIFR,RTHLF,SUMI,SUMR,T2I,T2R,T3I,T3R,T4I,
 | 
			
		||||
     +     T4R,TEMPI,TEMPR,THETA,TWOPI,U1I,U1R,U2I,U2R,U3I,U3R,
 | 
			
		||||
     +     U4I,U4R,W2I,W2R,W3I,W3R,WI,WR,WSTPI,WSTPR
 | 
			
		||||
      INTEGER I,I2,IPAR,J,K1,K2,K3,K4,KDIF,KMIN,
 | 
			
		||||
     +        KSTEP,L,LMAX,M,MMAX,NH
 | 
			
		||||
C     ..
 | 
			
		||||
C     .. Intrinsic Functions ..
 | 
			
		||||
      INTRINSIC COS,MAX0,REAL,SIN
 | 
			
		||||
C     ..
 | 
			
		||||
C     .. Data statements ..
 | 
			
		||||
      DATA TWOPI/6.2831853071796/,RTHLF/0.70710678118655/
 | 
			
		||||
c
 | 
			
		||||
c        1. real transform for the 1st dimension, n even.  method--
 | 
			
		||||
c           transform a complex array of length n/2 whose real parts
 | 
			
		||||
c           are the even numbered real values and whose imaginary parts
 | 
			
		||||
c           are the odd numbered real values.  separate and supply
 | 
			
		||||
c           the second half by conjugate symmetry.
 | 
			
		||||
c
 | 
			
		||||
 | 
			
		||||
      NH = NB/2
 | 
			
		||||
c
 | 
			
		||||
c     shuffle data by bit reversal, since n=2**k.
 | 
			
		||||
c
 | 
			
		||||
      J = 1
 | 
			
		||||
      DO 131 I2 = 1,NB,2
 | 
			
		||||
          IF (J-I2) 124,127,127
 | 
			
		||||
  124     TEMPR = DATA(I2)
 | 
			
		||||
          TEMPI = DATA(I2+1)
 | 
			
		||||
          DATA(I2) = DATA(J)
 | 
			
		||||
          DATA(I2+1) = DATA(J+1)
 | 
			
		||||
          DATA(J) = TEMPR
 | 
			
		||||
          DATA(J+1) = TEMPI
 | 
			
		||||
  127     M = NH
 | 
			
		||||
  128     IF (J-M) 130,130,129
 | 
			
		||||
  129     J = J - M
 | 
			
		||||
          M = M/2
 | 
			
		||||
          IF (M-2) 130,128,128
 | 
			
		||||
  130     J = J + M
 | 
			
		||||
  131 CONTINUE
 | 
			
		||||
 | 
			
		||||
c
 | 
			
		||||
c     main loop for factors of two.  perform fourier transforms of
 | 
			
		||||
c     length four, with one of length two if needed.  the twiddle factor
 | 
			
		||||
c     w=exp(-2*pi*sqrt(-1)*m/(4*mmax)).  check for w=-sqrt(-1)
 | 
			
		||||
c     and repeat for w=w*(1-sqrt(-1))/sqrt(2).
 | 
			
		||||
c
 | 
			
		||||
      IF (NB-2) 174,174,143
 | 
			
		||||
  143 IPAR = NH
 | 
			
		||||
  144 IF (IPAR-2) 149,146,145
 | 
			
		||||
  145 IPAR = IPAR/4
 | 
			
		||||
      GO TO 144
 | 
			
		||||
 | 
			
		||||
  146 DO 147 K1 = 1,NB,4
 | 
			
		||||
          K2 = K1 + 2
 | 
			
		||||
          TEMPR = DATA(K2)
 | 
			
		||||
          TEMPI = DATA(K2+1)
 | 
			
		||||
          DATA(K2) = DATA(K1) - TEMPR
 | 
			
		||||
          DATA(K2+1) = DATA(K1+1) - TEMPI
 | 
			
		||||
          DATA(K1) = DATA(K1) + TEMPR
 | 
			
		||||
          DATA(K1+1) = DATA(K1+1) + TEMPI
 | 
			
		||||
  147 CONTINUE
 | 
			
		||||
  149 MMAX = 2
 | 
			
		||||
  150 IF (MMAX-NH) 151,174,174
 | 
			
		||||
  151 LMAX = MAX0(4,MMAX/2)
 | 
			
		||||
      DO 173 L = 2,LMAX,4
 | 
			
		||||
          M = L
 | 
			
		||||
          IF (MMAX-2) 156,156,152
 | 
			
		||||
  152     THETA = -TWOPI*REAL(L)/REAL(4*MMAX)
 | 
			
		||||
          WR = COS(THETA)
 | 
			
		||||
          WI = SIN(THETA)
 | 
			
		||||
  155     W2R = WR*WR - WI*WI
 | 
			
		||||
          W2I = 2.*WR*WI
 | 
			
		||||
          W3R = W2R*WR - W2I*WI
 | 
			
		||||
          W3I = W2R*WI + W2I*WR
 | 
			
		||||
  156     KMIN = 1 + IPAR*M
 | 
			
		||||
          IF (MMAX-2) 157,157,158
 | 
			
		||||
  157     KMIN = 1
 | 
			
		||||
  158     KDIF = IPAR*MMAX
 | 
			
		||||
  159     KSTEP = 4*KDIF
 | 
			
		||||
          IF (KSTEP-NB) 160,160,169
 | 
			
		||||
  160     DO 168 K1 = KMIN,NB,KSTEP
 | 
			
		||||
              K2 = K1 + KDIF
 | 
			
		||||
              K3 = K2 + KDIF
 | 
			
		||||
              K4 = K3 + KDIF
 | 
			
		||||
              IF (MMAX-2) 161,161,164
 | 
			
		||||
  161         U1R = DATA(K1) + DATA(K2)
 | 
			
		||||
              U1I = DATA(K1+1) + DATA(K2+1)
 | 
			
		||||
              U2R = DATA(K3) + DATA(K4)
 | 
			
		||||
              U2I = DATA(K3+1) + DATA(K4+1)
 | 
			
		||||
              U3R = DATA(K1) - DATA(K2)
 | 
			
		||||
              U3I = DATA(K1+1) - DATA(K2+1)
 | 
			
		||||
              U4R = DATA(K3+1) - DATA(K4+1)
 | 
			
		||||
              U4I = DATA(K4) - DATA(K3)
 | 
			
		||||
              GO TO 167
 | 
			
		||||
 | 
			
		||||
  164         T2R = W2R*DATA(K2) - W2I*DATA(K2+1)
 | 
			
		||||
              T2I = W2R*DATA(K2+1) + W2I*DATA(K2)
 | 
			
		||||
              T3R = WR*DATA(K3) - WI*DATA(K3+1)
 | 
			
		||||
              T3I = WR*DATA(K3+1) + WI*DATA(K3)
 | 
			
		||||
              T4R = W3R*DATA(K4) - W3I*DATA(K4+1)
 | 
			
		||||
              T4I = W3R*DATA(K4+1) + W3I*DATA(K4)
 | 
			
		||||
              U1R = DATA(K1) + T2R
 | 
			
		||||
              U1I = DATA(K1+1) + T2I
 | 
			
		||||
              U2R = T3R + T4R
 | 
			
		||||
              U2I = T3I + T4I
 | 
			
		||||
              U3R = DATA(K1) - T2R
 | 
			
		||||
              U3I = DATA(K1+1) - T2I
 | 
			
		||||
              U4R = T3I - T4I
 | 
			
		||||
              U4I = T4R - T3R
 | 
			
		||||
 | 
			
		||||
  167         DATA(K1) = U1R + U2R
 | 
			
		||||
              DATA(K1+1) = U1I + U2I
 | 
			
		||||
              DATA(K2) = U3R + U4R
 | 
			
		||||
              DATA(K2+1) = U3I + U4I
 | 
			
		||||
              DATA(K3) = U1R - U2R
 | 
			
		||||
              DATA(K3+1) = U1I - U2I
 | 
			
		||||
              DATA(K4) = U3R - U4R
 | 
			
		||||
              DATA(K4+1) = U3I - U4I
 | 
			
		||||
  168     CONTINUE
 | 
			
		||||
          KDIF = KSTEP
 | 
			
		||||
          KMIN = 4*KMIN - 3
 | 
			
		||||
          GO TO 159
 | 
			
		||||
 | 
			
		||||
  169     M = M + LMAX
 | 
			
		||||
          IF (M-MMAX) 170,170,173
 | 
			
		||||
  170     TEMPR = WR
 | 
			
		||||
          WR = (WR+WI)*RTHLF
 | 
			
		||||
          WI = (WI-TEMPR)*RTHLF
 | 
			
		||||
          GO TO 155
 | 
			
		||||
 | 
			
		||||
  173 CONTINUE
 | 
			
		||||
      IPAR = 3 - IPAR
 | 
			
		||||
      MMAX = MMAX + MMAX
 | 
			
		||||
      GO TO 150
 | 
			
		||||
c
 | 
			
		||||
c     complete a real transform in the 1st dimension, n even, by con-
 | 
			
		||||
c     jugate symmetries.
 | 
			
		||||
c
 | 
			
		||||
  174 THETA = -TWOPI/REAL(NB)
 | 
			
		||||
      WSTPR = COS(THETA)
 | 
			
		||||
      WSTPI = SIN(THETA)
 | 
			
		||||
      WR = WSTPR
 | 
			
		||||
      WI = WSTPI
 | 
			
		||||
      I = 3
 | 
			
		||||
      J = NB - 1
 | 
			
		||||
      GO TO 207
 | 
			
		||||
 | 
			
		||||
  205 SUMR = (DATA(I)+DATA(J))/2.
 | 
			
		||||
      SUMI = (DATA(I+1)+DATA(J+1))/2.
 | 
			
		||||
      DIFR = (DATA(I)-DATA(J))/2.
 | 
			
		||||
      DIFI = (DATA(I+1)-DATA(J+1))/2.
 | 
			
		||||
      TEMPR = WR*SUMI + WI*DIFR
 | 
			
		||||
      TEMPI = WI*SUMI - WR*DIFR
 | 
			
		||||
      DATA(I) = SUMR + TEMPR
 | 
			
		||||
      DATA(I+1) = DIFI + TEMPI
 | 
			
		||||
      DATA(J) = SUMR - TEMPR
 | 
			
		||||
      DATA(J+1) = -DIFI + TEMPI
 | 
			
		||||
      I = I + 2
 | 
			
		||||
      J = J - 2
 | 
			
		||||
      TEMPR = WR
 | 
			
		||||
      WR = WR*WSTPR - WI*WSTPI
 | 
			
		||||
      WI = TEMPR*WSTPI + WI*WSTPR
 | 
			
		||||
  207 IF (I-J) 205,208,211
 | 
			
		||||
  208 DATA(I+1) = -DATA(I+1)
 | 
			
		||||
 | 
			
		||||
  211 DATA(NB+1) = DATA(1) - DATA(2)
 | 
			
		||||
      DATA(NB+2) = 0.
 | 
			
		||||
 | 
			
		||||
      DATA(1) = DATA(1) + DATA(2)
 | 
			
		||||
      DATA(2) = 0.
 | 
			
		||||
 | 
			
		||||
      RETURN
 | 
			
		||||
      END
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user