Printer Friendly Version

AOC Fast Tape Format

Al Goldstein
7 June 1995        Original Document
7 August 2000     Added User ASCII stream information - Table 1

The following can be used to decipher the Fast Tape data recorded on the AOC RAMS data system. A Fast Tape recording is used to capture raw, unaveraged data at a greater than 1 sample per second rate. Some terms used in this description are:

  • AOC - Aircraft Operation Center
  • RAMS - Research Aircraft Measurement System (the main aircraft data collection system)
  • Byte - 8 bit digital quantity
  • Word - 16 bit digital quantity
  • INE - Inertial Navigation Equipment (Delco Carousel IV Nav. Units)
  • RA - Radar Altimeter

General Description

Prior to 1994, fast tape data was recorded on 2400 ft reels of magnetic tape in the industry standard 9-track 1600 BPI (bytes per inch) Phase Encoded format. In 1994, AOC transitioned to Digital Audio Tape (DAT) drives mounted internally to the RAMS Micro 99 minicomputers. Data recorded on DAT cartridges use the industry standard DDS format, currently without any data compression. Tape record formats are identical for both media types.

Although normally enabled all the time, the operator has the option to disable Fast Tape recording, which can result in time gaps in the data. In the past, Fast Data recording was selectively enabled, so older tapes are more likely to have these time gaps. 9-track tapes could only store about two hours of continuous data, so there may have been several tapes for each flight. The actual number of records per tape was dependent on the configuration, selection of channels, and rates for each channel. A DAT cartridge has the capacity to store an entire flight's data, so unless there is a hardware problem, there should only be one DAT per flight.

The data is separated into physical records, each record containing the data collected during one second of operation. There should be no End Of File (EOF) marks except after the last record of the flight. If a 9-Track tape was used completely, there may be no EOF mark, but the End Of Tape (EOT) reflective strip can be used to stop reading the tape. DAT drives append an End Of Data (EOD) flag after every write to tape. Most software interprets this as an EOT, the main difference being that a DAT does not 'run on' after the last valid record before hitting EOT.

Record Description - Overview

The first word of each record contains a 2 (decimal) in the high (most significant) byte (in Fortran: IAnd(First,177400b) will equal 1000 Octal or 0200 Hex). This differentiates Fast data records from Slow data and Dropsonde data records and would only be changed if a major format revision was implemented. The lower (least significant) byte of the first word has the aircraft ID (42 or 43 Decimal, 52 or 53 Octal, 2A or 2B Hex).

The second word of each record gives the size of the record in 16 bit words. There is no fixed size for each physical record. The size will vary depending on the parameters selected for recording and the sampling rate for each analog channel. It also depends on the number of samples received on asynchronous digital channels (e.g. INE's & RA) during any given second. The absolute maximum record size (limited by Hewlett Packard software and hardware) is 32768 words. Currently, the RAMS software limits the record size to somewhat less than 10,000 words. This may change based on installation of new instruments that output data in a high speed digital format (e.g. the DRI charge probe).

The last word of each record is the checksum. This is equal to the least significant 16 bits of the signed, 16 bit integer addition of all words in the record except the checksum.

A suggested method of reading a Fast Data record is to initiate a read from the tape to a buffer of at least the maximum anticipated size (e.g. 10,000 words). A check for EOF and EOT/EOD should be made to verify that a record was actually read. The read request should return the actual number of words read, which can be compared with word 2 of the record. Word 1 can be checked for Fast Tape (upper byte) and valid aircraft ID (lower byte). A checksum should then be computed and compared to the last word of the record. If all these checks are passed, a valid Fast Data record has been read.

Detailed Record Description

Each record consists of several sections. A table (Table 1) of the assignments is attached. The ID, size and checksum have already been discussed. Words 3-8 contain the date and time that the data was collected. This time is a copy of the HP Micro 99 internal clock, and should always be valid. The format is: Year, Month, Day, Hour, Minute, Second. The ranges for each parameter are give n in Table 1. The next three words are a copy of the time received from Time Code Generator #1. Although this may be invalid due to hardware failure, if it is present it can be used as a validity check on the Micro 99 time. The last three words of the general info section are a copy of the event switch data. This is included so that user marked events are easily correlated to the fast data collection time. Detailed Record Description (cont.)

The next section contains the word counts for each digital and analog channel stored in this record. The format shows ten words for the counts on digital channels followed by 80 words corresponding to counts for the 80 analog to digital converter channels. All counts are positive numbers of words.

The main data block begins at word 105. The first data will typically be from INE #1 (unless word 15 - INE #1 counts - is zero). All words from each channel are contiguous and are not time referenced within the second. For a normal data count (instrument is not starting or stopping at odd intervals) a uniform distribution across the second can be assumed.

A desired data block can be found by skipping over earlier blocks within the record. As an example, to locate the start of APN-232 data, add 105 (the start of the data block) to the contents of words 15 and 16. If there is no INE data , this will result in a starting address of 105. In the more likely case, normal INE data (2 INE's * 40 bursts per second * 10 parameters per burst * 2 16-bit words per parameter = 1600 words) will push the start of the APN-232 data to word 1705. The location of a data block must be computed individually for each record, since counts can vary from one second to the next. A Fortran example of code to locate a data block is given in Listing 1.

Data Formats

Data recorded on Fast Tape is as close to the original from the instrument as possible. The format for each may be very different than the averaged sample recorded on the AOC Slow Tape. Some of the descriptions and differences are described here.

INE Data: The block for each INE is divided into one or more (max. 41, typically 40) bursts. Each burst contains ten double words which are data values for the ten INE parameters (PA,Lat,Long,etc.) measured during a 1/40 sec. interval (with INE internal filtering and processing). There should never be a partial burst. The burst format, parameter scaling and bit assignments are given in Table 2. It is important to note that the least significant bit is used as an error flag and parameters with this bit set to 1 should not be used (for that one specific sample). This error flag is required because the parity of each parameter value is checked in the Interface Adaptor Unit, which then extends the sign of the data to the MS bit before the data is sent to the Micro 29. A Fortran example of code for scaling the INE data is given in Listing 2.

APN-232 Radar Altimeter: Each RA reading is stored as two words. Normally there are 60-62 data samples per second. The format for the bit assignments is given in Table 3. A Fortran example that checks for error bits and scales the value into a floating point variable is given in Listing 3.

APN-159 Synchro RA: Each 16 bit word is one data sample. There are typically 10 samples per second. The RA data is converted by two Synchro to Digital converters, one for Coarse resolution, the other for Fine. The most significant 4 bits of each data word are the Coarse reading, the other 12 bits are the Fine. Listing 4 shows a method of converting this Coarse/Fine code into feet of Radar Altitude.

APN-159 Parallel RA: Each 16 bit word is one data sample coded as integer feet. As with the synchro data, there are typically ten samples per second. The number of APN-159 units with operating parallel encoders decreased in the early 1990's due to non-repairable encoder failures. Parallel RA was not available at all after the 1994 Hurricane season.

User Data: Data is saved as raw ASCII, written to the Fast data record at the completion of each line (as denoted by a and/or ). Lines with an odd number of characters have a Null character (value - 00) in the LS byte of the last word.

Analog Data: For the 80 A/D converter channels, each channel has its own count word and its own data section. In normal operation, each channel's data block will consist of 0, 10, 20, 40 or 80 samples, each sample stored in one word. The number of samples stored for each channel is determined by the configuration file used to start the system before the flight. If a channel is selected for 10, 20 or 40 samples, the 80 data values actually collected are averaged to the desired amount (e.g. for a channel configured at 20 samples, each 4 samples collected would be added together and divided by 4 to get one value to be stored). The scaling for all analog data is the same, regardless of sample rate. Each data value is stored as a binary fraction with a sign bit (the most significant, weighted as -10 volts) and 15 data bits. The second most significant bit has a weight of +5 volts, the third represents +2.5 volts, etc. down to the least significant bit, with a weight of approx. +0.305 millivolts.

The actual A/D converter module produces a 14 bit value, so a channel selected for 80 samples on the Fast Tape will have 14 bits of data (sign + 13 bits) followed by two zeros in the least significant bits. For lower sample rates (10, 20 or 40 per second) these least significant bits will have data, since the process of averaging extends the resolution of the data value. The same conversion routine can be used for any data sample rate because the most significant bit weights do not change. A simple method of converting Fast Tape words to volts is:

Volts = Float(Integer_Word) * .000305

Table 1
Fast Tape Record Format
Word Description
1Tape ID - set to (1000b + acft #)
2Record Size in words
3Year (e.g. 1991) Date and Time from Micro 29 clock
4Month (1-12)
5Day (1-31)
6Hour (0-23)
7Minute (0-59)
8Second (0-59)
9Hour (0-23) Time from Time Code Gen #1
10Minute (0-59)
11Second (0-59)
12-14Event Switch Data
15Digital channel 1 (INE #1) word count
16Digital channel 2 (INE #2)word count
17Digital channel 3 (APN-232 RA) word count
18Digital channel 4 (Unassigned)word count
19Digital channel 5 (Unassigned)word count
20Digital channel 6 (APN-159 Synchro RA) word count
21Digital channel 7 (APN-159 Parallel RA) word count
22Digital channel 8 (User ASCII data #1) word count
23Digital channel 9 (User ASCII data #2)word count
24Digital channel10 (User ASCII data #3)word count
25-104Analog channel 0-79 word counts (from ADC)
105First data word (typically from INE #1)
::
::
n-1 Last data word (where record word 2 specifies n)
nChecksum for record

Table 2
INE Data Format
Word 1:
        Altitude (Computed Pressure Altitude)
	33322222222221111111111
	21098765432109876543210987654321
	SSSSSS*****data*********0001000E
		MS bit (Sign) = -3276800 ft (32 * -102400 ft)
		LS data bit = .391 ft
Word 2:
        Latitude
	33322222222221111111111
	21098765432109876543210987654321
	SSS********data*********0010G00E
		MS bit (Sign) = -(4*PI) radians
		LS data bit = 1.498E-06 radians  (?60 meters)
Word 3:
        Longitude
	33322222222221111111111
	21098765432109876543210987654321
	SSS********data*********0011G00E
		MS bit (Sign) = -(4*PI) radians
		LS data bit = 1.498E-06 radians
Word 4:
        North Velocity
	33322222222221111111111
	21098765432109876543210987654321
	SS*********data*********0100G00E
		MS bit (Sign) = -3276.8 knots (2 * -1638.4 knots)
		LS data bit = 3.906E-04 knots (? .721 meters/hr)
Word 5:
        East Velocity
	33322222222221111111111
	21098765432109876543210987654321
	SS*********data*********0101G00E
		MS bit (Sign) = -3276.8 knots (2 * -1638.4 knots)
		LS data bit = 3.906E-04 knots
Word 6:
        Vertical Speed
	33322222222221111111111
	21098765432109876543210987654321
	SS*********data*********0110000E
		MS bit (Sign) = -4096 ft/sec (2 * -2048 ft/sec)
		LS data bit = 4.883E-04 ft/sec
Word 7:
        Drift Angle
	33322222222221111111111
	21098765432109876543210987654321
	SSS********data*********0111000E
		MS bit (Sign) = -(4*PI) radians
		LS data bit = 1.498E-06 radians
Word 8:
        Heading
	33322222222221111111111
	21098765432109876543210987654321
	SSS********data*********1000G00E
		MS bit (Sign) = -(4*PI) radians
		LS data bit = 1.498E-06 radians
Word 9:
        Pitch Angle
	33322222222221111111111
	21098765432109876543210987654321
	SSS********data*********1001000E
		MS bit (Sign) = -(4*PI) radians
		LS data bit = 1.498E-06 radians
Word 10:
        Roll Angle
	33322222222221111111111
	21098765432109876543210987654321
	SSS********data*********1010000E
		MS bit (Sign) = -(4*PI) radians
		LS data bit = 1.498E-06 radians
All data is in 2's complement binary fractional notation

S - Sign bit (1 = negative)
G - Pole Reference (1 = Geodetic, 0 = Alternate
E - Error bit (1 = error in this word)
PI - π = 3.14159...

Table 3
APN-232 Radar Altimeter
Data Format
Bit Description
32 (MSB) Odd Parity
31 Negative Altitude
30 32,768 ft
29 16,384 ft.
28 8,192 ft.
27 4,096 ft.
26 2,048 ft.
25 1,024 ft.
24 512 ft.
23 256 ft.
22 128 ft.
21 64 ft.
20 32 ft.
19 16 ft.
18 8 ft.
17 4 ft.
16 2 ft.
15 1 ft.
14 _ ft.
13 Warning Monitor
12 500 ft. Test in Progress
11 Search or Blanking
10 RT Fail
9-1 (LSB) Spare - set to 0


FORTRAN code

Listing 1
Data Block Location

C*********************************************************** C
C	Return a pointer and word count to a desired data
C		block within a fast tape record.
C
C	Calling Sequence: Call FT_Ptr(IB,ID_Num,IPtr,ICount)
C
C	IB is the data buffer array for one sec. of fast data.
C	ID_Num is the desired block:	1 - Digital chan 1
C							11 - ADC Chan 0
C							12 - ADC Chan 1, etc.
C	IPtr is the returned pointer to the start of the
C		requested block in IB
C	ICount is the number of 16 bit words in the requested
C		block.
C
C  A sample code fragment using FT_Ptr to get ADC chan 2 data
C    would look like this:
C
C	ID_Num = 13			! select ADC Chan 2
C	CALL FT_Ptr(IB,ID_Num,IPtr,ICount) ! get ptr & count
C	IF (ICount.LE.0) THEN	! no data
C	    :
C	ELSE					! data available
C	  DO i = 1,ICount 		! loop through
CC IPtr points to 1st value, so calc i-1 for correct offset
C	    volts = Float(IB(IPtr+i-1)) * .00305
C	      :    			! process voltage sample
C	  END DO
C	ENDIF
C
C**********************************************************
	SUBROUTINE FT_Ptr(IB,ID_Num,IPtr,ICount)

	INTEGER*2 IB(*),ID_Num,IPtr,ICount ! IB dimensioned in main
	INTEGER*2 i,j

	j = 105 ! point to start of data section
	IF (ID_Num.GT.1) THEN	! don't do calc for INE 1
	    DO i = 15,ID_Num+13	! ID_Num=2 does 1 iter, etc.
	        j = j + IB(i)	! add another block's count
	    END DO
	ENDIF

	IPtr = j				! done w/ calc, pass on to caller
	ICount = IB(ID_Num+14)	! ID_Num=1 gets word 15, etc.
	RETURN
	END

Listing 2
INE Data Block Conversion

C**********************************************************
C
C	Convert INE Data to useable flaoting point values.
C
C	Calling sequence: CALL CVINE(InINE,OutINE,IStat)
C
C		InINE is an array of 10 double integers
C			containing the raw burst from tape record
C		OutINE is a 10 word real array with the resulting
C			converted nav. values
C		IStat is a returned status array:
C			0- no error in this parameter, 1- some error
C
C**********************************************************

	SUBROUTINE CVINE(InINE,OutINE,IStat)

	INTEGER*2 IStat(10),i,id_tag
	INTEGER*4 InINE(10)
	REAL OutINE(10),Pi_x_4,BigNumber
	PARAMETER (Pi_x_4=12.5663706144)
	PARAMETER (BigNumber=2.**31)

	DO i = 1,10
	  OutINE(i) = 0.		! in case of error, return a 0
	  IF ( (IAnd(InINE(i),360b)/16.NE.i-1)	! tag error
    &  .OR.(IAnd(InINE(i),1).NE.0)) THEN	! parity error
	    IStat(i) = 1
	  ELSE				! good starting parameter
	    GOTO (100,200,200,300,300,400,200,200,200,200),i
C
C Several parameters have the same scaling; handle them in the
C   same subsection.
C
C  -102400*32 ft scaling - for Press Alt
C
100	    OutINE(i) = Float(IAnd(InINE(i),37777777400b))
    &	* 3276800./BigNumber
	    GOTO 500
C
C  -PI*4 Scaling - for Lat,Long,Hdg,Drft Ang,Pitch,Roll
C
200	    OutINE(i)=Float(IAnd(InINE(i),37777777400b))
    &	* Pi_x_4/BigNumber
	    GOTO 500
C
C  -1638.4*2 knots - for N. Vel, E. Vel
C
300	    OutINE(i)=Float(IAnd(InINE(i),37777777400b))
    &	* 3276.8/BigNumber
	    GOTO 500
C
C  -2048*2 ft/sec - for Vert. Speed
C
400	    OutINE(i)=Float(IAnd(InINE(i),37777777400b))
    &	* 4096./BigNumber

500	    CONTINUE
	  ENDIF
	END DO

	RETURN
	END


Listing 3
APN-232 Data Conversion

C**********************************************************
C
C	Convert APN-232 Fast Data
C
C	Calling Sequence: CALL RA2F(I_Dbl_Raw,RA,Stat)
C
C	I_Dbl_Raw is the raw double word integer from the fast
C		fast tape buffer
C	RA is the returned RA in feet - single precision real
C	Stat is the status bits, 0 = no error
C
C**********************************************************
	SUBROUTINE RA2F(I_Dbl_Raw,RA,Stat)

	INTEGER*4 I_Dbl_Raw
	REAL RA
	INTEGER*2 Stat
C
	RA = Float( IAnd(I_Dbl_Raw,17777740000B)/40000B ) * .5
	Stat = IAnd(I_Dbl_Raw,36000b)/2000B

	RETURN
	END

Listing 4
RA Synchro Data Calculation


C***********************************************************
C
C	Convert APN-159 Synchro Fast Data
C
C	Calling Sequence: Call RA1SF(IRaw,RA)
C
C	IRaw is the unconverted synchro data word from the
C		the fast tape array - 16 bit integer
C	RA is the converted RA in feet - single precision real
C
C***********************************************************

	SUBROUTINE RA1SF(IRaw,RA)

	INTEGER*2 IRaw
	REAL Coarse, RA_Temp, RA, Cab_Len

	PARAMETER (Cab_Len=-36.04) ! acft antenna cable length
C
	Coarse = FLOAT( IAnd(IRaw,170000B)/10000B )*3125. - 400.
	RA_Temp = FLOAT( IAnd(IRaw,007777b) ) * (4000./4096.)
	DO WHILE (RA_Temp.LT.Coarse)
	  RA_Temp = RA_Temp + 4000.
	END DO

	RA = RA_Temp + Cab_Len

	RETURN

	END



Stay Connected