C -+-+-+-+-+  H A E D O F . F T  -+-+-+-+-+ C C DO THE FFT SUBROUTINE DOFFT C INCLUDE HAEBUF.FI INCLUDE HAEGSA.FI INCLUDE HAEPTI.FI INCLUDE HAEDEF.FI INCLUDE HAEI85.FI INCLUDE HAETTY.FI INCLUDE HABRK.FI C INTEGER TOASCI,NCOND REAL INTENS,IMAXNT,COND EXTERNAL TOASCI,INTENS,IMAXNT,NCOND,COND C INTEGER I,J,K,PNT,BAND, @ DO LOOP COUNTERS & LIMITS * POSIT,POS1, @ START OF THE ACTUAL WINDOW (SAMRAT*SPAN)*N * I1,I2 @ INDEX TO COMPLEX SPECTRUM INTEGER MM,SS,MMM,SSS @ START OF FFT, END OF FFT IN MINUTES AND SECONDS REAL X(2050) @ BUFFER FOR THE FFT LOGICAL L1 @ TEMPORARY STORAGE C C DO THE FFT C IF (REC5.LT.1) DEFINE FILE 5(MAXBL5,85,U,REC5) @ OPEN SCRATCH FILE FOR INTERMEDIATE FFT RESULTS C C CLEAR THE OUTPUT FILE UNIT 5 TO ALLOW CNTRL C ABORT C REC5=1 REDVAL=0 @ NO VALID DATA HERE WRITE (5'REC5) (RCRD0(I),I=1,85) @ CLEAR THE FILE HEADER BLOCK C C @ NXTDTA COUNTS FROM 0 TO (ENDS-1)/OVRLAP CALL MOVE (-85,0,INTE85) @ CLEAR BUFFER FOR INTERMEDIATE RESULTS AND NXTDTA TOO DO 50 POS1=BEGIN,ENDS-1,OVRLAP @ LOOP FOR EACH FFT POSIT=POS1*SAMRAT IF (POSIT.GT.ENDS*SAMRAT-INCR) GOTO 50 @ SKIP LAST OVERLAPPING FFT IF BREAK(11) GOTO 51 @ SW 11 ABORTS TASK ARTEFK=0 @ COUNTER FOR OVERRANGE SIGNAL DO 40 I=1,INCR,1 @ LOOP TO FETCH EACH VALUE FROM INPUT FILE X(I)=ESAM(POSIT+I-1) 40 ARTEFK=NCOND(ABS(X(I)).GT.509,ARTEFK+1,ARTEFK) @ COUNT NUMBER OF POINTS OUT OF RANGE CALL FFTC(X,INCR/2,EXPON-1,1.) @ BLACK MAGIC BOXES CALL FFTR(X,INCR/2,1.,1.) CALL HANING (X,INCR/2) @ SMOOTH REAL PART CALL HANING (X(INCR/2),INCR/2) @ SMOOTH IMAG PART OF FFT CALL FTPOWR(X,INCR) @ COMPUTE THE POWER SPECTRUM AND THE MINIMUM OF THE SPECTRUM X(1)=0 @ CLEAR THE FIRST AND SECOND CHANNEL TO X(2)=0 @ STRIP OFF THE DC OFFSET C C @ IF SAMPLE RATE 64 HZ THEN COMPUTE THE MAXIMUM OF THE SPECTRUM STARTING AT 1. HZ C @ ELSE COMPUTE THE MAXIMUM STARTING AT 0. HZ BUT EXCLUDING DC (CHANNEL 0 & 1) CALL IMAXNT(X,COND(SAMRAT.EQ.64,1.,0.),SAMRAT/2.,K) @ FREQUENCY OF MAXIMUM, INDEX TO INTENSITY X --> K XMAXI=X(K) @ INTENSITY OF MAXIMUM PNT=MOD(NXTDTA,4)+1 @ POINTER TO NEXT INTE LOCATION WHERE TO INSERT BAND INTENSITY DATA DO 45 BAND=1,5 @ FIVE BANDS L1=SAMRAT/2.GE.FREQU(BAND,2) @ COMPUTE THE INTENSITY ONLY FROM THOSE FREQUENCY C @ RANGES WHICH ARE LESS THAN THE HIGHEST FREQUENCY WE MEASURED INTE(1,BAND,PNT)=0 IF (L1) INTE(1,BAND,PNT)=INTENS(X,FREQU(BAND,1),FREQU(BAND,2)) @ TOTAL INTENSITY OF THIS BAND IF (L1) INTE(2,BAND,PNT)=IMAXNT(X,FREQU(BAND,1),FREQU(BAND,2),K) @ FREQUENCY OF MAXIMUM [HZ] INTE(3,BAND,PNT)=POS1 @ TIME OF THIS POWER SPECTRUM BEGFFT=INTE(3,BAND,PNT) @ SAVE THE TIME OF THIS POWER SPECTRUM INTO THE FILE HEADER CX IF (L1) INTE(3,BAND,PNT)=X(K) @ INTENSITY OF FREQUENCY MAXIMUM INTE(4,BAND,PNT)=INTE(1,BAND,PNT)/AMAX1(1.,INTE(1,1,PNT)) @ RELATIVE INTENSITY OF THIS BAND 45 CONTINUE MM=POS1/60 @ MINUTES SSS=POS1+SPAN @ SECONDS FFT ENDS SS=TOASCI(MOD(POS1,60)) MMM=SSS/60 SSS=TOASCI(MOD(SSS,60)) WRITE (3,1) MM,SS,MMM,SSS,((INTE(I,J,PNT),I=1,2),J=1,5),ARTEFK REC5=STSCAN+NXTDTA/4 @ 2 BLOCK HEADER, 25 BLOCKS POWER SPECTRUM AND THEN WE STORE THE INTE DATA SETS NXTDTA=NXTDTA+1 @ WE STORE 4 INTE DATA SET IN ONE BLOCK WRITE (5'REC5) INTE85 @ SAVE THIS DATA ONTO THE SCRATCH FILE 50 CONTINUE @ END OF THE DO LOOP FOR EACH FFT 51 CONTINUE @ IF USER ABORTS TASK THEN ENTRY HERE COMP=.TRUE. @ COMPUTATIONS DONE FLAG REC5=1 @ SAVE THE LAST FFT DONE REDVAL=6H2DPWLD WRITE (5'REC5) (RCRD0(I),I=1,85)@ INSERT THE FILE HEADER BLOCK REDVAL=0 @ FOR SAVETY ONLY SETNU5=SETNUM @ RECORD # OF THE ACTUAL DATA SET --> HEADER OF UNIT 5 CHANE5=CHANEL @ AND WE SAVE THE CHANNEL NUMBER TOO DATCNT=NXTDTA @ INSERT THE NUMBER OF SCANS INTO THE HEADER BLOCK FILTER=0 @ NEW DATA, NOTHING FILTERED CONTNS=0 @ REC3 TO 16 CONTAINS A EEG POWER SPECTRUM WRITE (5'REC5) (LCEGSA(I),I=1,LCEGSA(1)) @ WRITE THE DATA HEADER BLOCK ( COMMON CEGESA) DO 55 J=1,INCR/2+84,85 @ SAVE THE LAST POWER SPECTRUM COMPUTED INTO REC 3-27 55 WRITE (5'REC5) (X(I),I=J,MIN0(1024,J+84)) @ 13 RECORDS TO WRITE COMP=.TRUE. @ SOME COMPUTATIONS DONE RETURN C C 1 FORMAT (I5,1H:,A2,1H-,I3,1H:,A2,5(2X,1P,E8.2,0P,F6.1,4X),I5) END