C ***** Program to Convert a discrete time ***** C ***** sampled data file into a frequency ***** C ***** spectrum file. C ***** The input file is assumed to be ***** C ***** 1024 evenly time sampled points. ***** C ***** This is fixed point data that is ***** C ***** 2 bytes per sample. The program ***** C ***** also asks for the time between ***** C ***** samples in seconds. ***** C ***** The output file is 512 records ***** C ***** long. It is frequency amplitude ***** C ***** pairs. This is floating point ***** C ***** data and the amplitudes have been ***** C ***** normalized to 1.0 The upper 512 ***** C ***** points of the transform, the ***** C ***** aliased points are not written to ***** C ***** the output file. C ***** 2-AUG-1997 MSU PHYSICS ***** PROGRAM CONVERT_1 C ***************************************** C DEFINE ALL VARIABLES AND ARRAYS C ***************************************** IMPLICIT NONE REAL*8 CDB(1:2048) INTEGER*2 ICDB(1:1024) COMMON ICDB, CDB INTEGER*2 Index, IOSTATUS REAL*8 Temp CHARACTER FileName*32 C *********************************************************** C Get the name of the fixed point input raw data file. C *********************************************************** WRITE ( 6, 30 ) 30 FORMAT ( ////////////////////////// & ' ****************************************** '/ & ' * * '/ & ' * This is the Convert_1 Program * '/ & ' * * '/ & ' * Revision 1 AUGUST 1997 * '/ & ' ****************************************** '// ) 40 WRITE ( 6, 50 ) 50 FORMAT ( // & ' To quit this program enter just a Carriage Return ', // & ' or else, to Convert a discrete time sampled raw ', / & ' data file to frequency space enter the filename ', / & ' of the raw data file ', / & ' DEVC:[DIR]NAME.EXT;VER: ', $ ) READ ( 5, 55 ) FileName 55 FORMAT ( A ) IF ( FileName .EQ. ' ' ) THEN GOTO 998 END IF WRITE ( 6, 60 ) FileName 60 FORMAT ( // & ' The raw data file Filename ' / & ' specification is: ', A & // ) C ************************** C Open the raw data file C ************************** OPEN ( UNIT=10, FILE=FileName, STATUS='OLD', & FORM='FORMATTED', READONLY, ACCESS='SEQUENTIAL', & ERR=950, IOSTAT=IOSTATUS ) C C ***** Read the raw data file ***** C WRITE ( 6, 215 ) 215 FORMAT ( // & ' ***** Now reading the raw data file. ***** ' & // ) DO Index=1,1024,1 READ ( 10, 220, ERR=970, IOSTAT=IOSTATUS ) ICDB(Index) END DO 220 FORMAT ( I9 ) CLOSE ( UNIT=10 ) C ***** Findout if there should be an output file ***** C ***** and get its FileName ***** WRITE ( 6, 250 ) 250 FORMAT ( // ' To build an ASCII file of frequency ' / & ' amplitude pairs, ' / & ' Enter the FileName of the Output File ' / & ' or else ' / & ' to Quit enter just a carriage return. ' // ) WRITE ( 6, 251 ) 251 FORMAT ( ' Enter carriage return or ' / $ ' DEVC:[DIR]NAME.EXT;VER: ',$ ) READ ( 5, 255 ) FileName 255 FORMAT ( A ) IF ( FileName .EQ. ' ' ) THEN WRITE ( 6, 257 ) 257 FORMAT (// ' NO ASCII Output File Will Be Written. ' // ) WRITE ( 6, 80 ) GOTO 40 END IF 80 FORMAT ( / ' ***************************************** '/ & ' * * '/ & ' * RESTARTING THE RIGAKU DATA FILE * '/ & ' * READER PROGRAM. * '/ & ' * * '/ & ' ***************************************** '// ) WRITE ( 6, 270 ) FileName 270 FORMAT (// ' The specification of the output file is: ', A //) OPEN ( UNIT=15, FILE=FileName, STATUS='NEW', & FORM='FORMATTED', CARRIAGECONTROL='LIST', & ACCESS='SEQUENTIAL', ERR=960, IOSTAT=IOSTATUS ) C ***** Now call the routine to transform the discrete ***** C ***** time sampled data into frequency space. ***** CALL Forward_Fourier C ***** Now write the ASCII Frequency Amplitude ***** C ***** Pair Output File ***** C ***** for a 2MHz ADC Clock use 51.15 C ***** for a 6MHz ADC Clock use 17.05 DO Index=1,1024,2 Temp = ( FLOAT( (Index-1) / 2 ) ) / 17.05 WRITE ( 15, 300 ) Temp,CDB(Index) END DO 300 FORMAT ( ' ', F7.3, ' ', F8.6 ) CLOSE ( UNIT = 15 ) WRITE ( 6, 280 ) 280 FORMAT ( ' The ASCII output file ', & 'has been successfully written. ', // ) WRITE ( 6, 80 ) GOTO 40 C ******************************************************************* C ************************************************************ C THIS IS THE SECTION FOR HANDLING IO ERRORS AND ALL EXITS C ***********************************---------*********-----** 950 WRITE ( 6, 951 ) IOSTATUS 951 FORMAT ( //, ' THERE HAS BEEN AN IO SYSTEM ERROR TRYING ', / & ' TO OPEN THE SPECIFIED RAW DATA FILE. ', // & ' DID YOU TYPE THE FILENAME CORRECTLY? ', // & ' FORTRAN OPEN IOSTAT = ', I3, / ) WRITE ( 6, 80 ) GOTO 40 960 WRITE ( 6, 961 ) IOSTATUS 961 FORMAT ( //, ' THERE HAS BEEN AN IO SYSTEM ERROR TRYING ', / & ' TO OPEN THE SPECIFIED ASCII OUTPUT FILE. ', // & ' DID YOU TYPE THE FILENAME CORRECTLY? ', // & ' FORTRAN OPEN IOSTAT = ', I3, / ) WRITE ( 6, 80 ) GOTO 40 970 WRITE ( 6, 971 ) IOSTATUS 971 FORMAT ( //, ' THERE HAS BEEN AN IO SYSTEM ERROR TRYING ', / & ' TO READ THE RAW DATA FILE. ', / & ' DID YOU TYPE THE FILENAME CORRECTLY? ', // & ' FORTRAN READ IOSTAT = ', I3, / ) WRITE ( 6, 80 ) GOTO 40 998 WRITE ( 6, 999 ) 999 FORMAT ( // ' Convert_1 Program Is Exiting. ', // ) STOP ' ' END