Files collected using the ISISTM system have the following basic format (Q-MIPS):
1st rec ---- ---- ---- *** Data is stored in | ---- ---- ---- *** 1024 byte records for | . each channel | . (*** 256 byte trailer.) | . | . V . End rec ---- ---- ---- *** Chan Chan2 ChanX (*** = 256 byte trailer.)
QMIPS-style data files are stored in binary format. Each data file contains a 2048 byte file header followed by the sidescan-sonar data stream which consists of at least two channels of sidescan-sonar information and a 256 byte trailer. The trailer contains parameters relevant to the collected sidescan-sonar, such as altitude, file name, pitch, roll, date of collection, time of day, etc. Below is an example of the Q-MIPS file format. The header structure labeled isis_header is the 1024 byte portion that occurs once at the beginning of a file. The structure labeled isis_sonar is the 256 byte trailer which is placed at the end of every ping.
NOTE: The following example structures were designed for PC`s, which align on 16-bit boundaries. If you are using a 32- or 64-bit machine, alignment will have to be forced as these structures will be larger than 256 bytes on those machines. Creating a union of these structures with a 1024 or 256 byte (respectively) unsigned char buffer generally works. Also note the defines. The WORD define for RISC machines, or any 32-bit machine, should be changed to unsigned short.
Example QMIPS Sample Profile
Input parameters or comments are notated in green.
#define BYTE unsigned char
#define WORD unsigned int /* PC: 16 bit */
#define DWORD unsigned long /* PC: 32 bit */
STRUCT ISIS_HEADER
{
/* header header */
/*****************/
BYTE fileFormat; /* always decimal 50 */
BYTE reserved;
BYTE softwareRev[6];
BYTE spare1[20];
/* digitizer parameters */
/************************/
WORD sampleRate; /* in Ksamples/sec */
WORD numChannels; /* 1-4 */
WORD bitsPerPixel; /* 8 or 12 */
WORD pixelsPerChannelPerPing; /* (WORD COUNT) */
float speedOfSoundInWater; /* two way travel time in meters/sec */
float noLongerUsed; WORD asyncChannelNumber; /* if 8 no async chan. otherwise, asynchronous */
WORD numsonarChannels; /* 1 to 4 */
WORD ch1_processingAvailable;
WORD ch2_processingAvailable;
WORD ch3_processingAvailable;
WORD ch4_processingAvailable;
/* nav system parameters */
WORD timeDelay; /* tenths of seconds */
BYTE navSystemName[100];
BYTE projectionType[12];
BYTE spheriodType[12];
WORD zone;
float originLat;
float originLong;
float offsetLat;
float offsetLong;
WORD navUnits; /* 0 = meters */
/* 1 = feet */
/* 2 = yards */
/* 3 = degrees */
/* site parameters */
WORD diveNumber;
WORD blockNumber;
WORD trackNumber;
WORD runNumber;
BYTE spare4[100];
/* annotation */
BYTE operatorAnnotation[100];
BYTE sonarName[40];
/* sonar parameters */
/************************/
WORD triggerDirection; /* -1 is neg, 0 is equal, 1 isos */
DWORD triggerMagnitude;
float triggerWidth;
WORD ch1_frequency; /* in kHz */
WORD ch2_frequency;
WORD ch3_frequency;
WORD ch4_frequency;
float ch1_horizBeamAngle; /* degrees */
float ch2_horizBeamAngle;
float ch3_horizBeamAngle;
float ch4_horizBeamAngle;
/* name of this file */
char thisFileName[45];
/* which channels are half wave rectified */
/* -------------------------------------- */
WORD ch1_halfWaveRectify;
WORD ch2_halfWaveRectify;
WORD ch3_halfWaveRectify;
WORD ch4_halfWaveRectify;
/* left over */
BYTE spare5[486];
};
STRUCT ISIS_SONAR
{
/* time and date stamp */
BYTE day;
BYTE month;
BYTE year;
BYTE hour;
BYTE minute;
BYTE seconds;
WORD tenthsSeconds;
/* misc. info */
BYTE fileName[12];
WORD pingNumber;
WORD asyncByteOffset; /* when non-zero, indicates where */
/* sync (subbottom) channel starts */
BYTE spare1[12];
/* digitizer parameters */
BYTE spare2[4];
float timeInterval; /* multiplier (fraction) to make window in time of an uncorrected channel */
float APaltitude;/* altitude from array processor computed from water column */
WORD triggerChannel;
WORD altSource; /* which altitude to use:
0 = from telemetry
1-4 = channel 1-4 water column
5 = manual entry */
DWORD waterColumn;
DWORD triggerPeriod;
WORD ch_1signalDivisor;/* chan 1 signal divisor multiply by 100 */
float telemFishDepth;
float telemFishHeading;
float telemFishPitch;
float telemFishRoll;
float telemFishAlt; /* meters - comes from manual entry or */
/* towfish telem. */
BYTE spare3[10];
/* sonar parameters */
BYTE ch1_spare4[8];
WORD ch1_bandWidth; /* in kilohertz */
WORD ch1_sampleScheme;
WORD ch1_rangeScale; /* meters */
WORD ch1_gain;
WORD ch1_pulseWidth; /* microseconds */
WORD sampleRate;
WORD ch1_corrected; /* boolean */
BYTE ch2_spare4[8];
WORD ch2_bandWidth; /* in kilohertz */
WORD ch2_sampleScheme;
WORD ch2_rangeScale; /* meters */
WORD ch2_gain;
WORD ch2_pulseWidth; /* microseconds */
WORD ch2_spare;
WORD ch2_corrected; /* boolean */
BYTE ch3_spare4[8];
WORD ch3_bandWidth; /* in kilohertz */
WORD ch3_sampleScheme;
WORD ch3_rangeScale; /* meters */
WORD ch3_gain;
WORD ch3_pulseWidth; /* microseconds */
WORD ch3_spare;
WORD ch3_corrected; /* boolean */
BYTE ch4_spare4[8];
WORD ch4_bandWidth; /* in kilohertz */
WORD ch4_sampleScheme;
WORD ch4_rangeScale;/* meters */
WORD ch4_gain;
WORD ch4_pulseWidth; /* microseconds */
WORD ch4_spare;
WORD ch4_corrected;/* boolean */
/* nav system parameters */
BYTE nav_sensor[4]; /* sensor code */
WORD eventNumber;
BYTE station_1_code; /* station code data as */
/* BYTE station_2_code; */
BYTE station_3_code;
BYTE station_4_code;
float range_1;/* ranges to the nav stations/*
float range_2;
float range_3;
float range_4;
/* #define nav_telemetry.latitude *((double) & nav_telemetry.navEasting) */
/* re-use easting and northing variable space for latitude. */
/* If a system collects XY data pairs, then the navEasting and navNorthing fields would been commented and set to floats.*/
/*float navEasting; /* (x) in meters */
/*float navNorthing; /* (y) in meters */
double navEasting; /* USGS uses lat & lon */
float navDepth; /* (z) in meters */
float navRms; /* root mean square -- quality factor of nav solution */
float navFishHeading; /* degrees */
float navFishSpeed;/* knots */
float navShipGyro;/* degrees */
DWORD navFixNumber; /* sequential value */
double navLongitude; /* double precision */
BYTE spare6[2];/* alphanumeric */
BYTE navFixHour;
BYTE navFixMinute;
BYTE navFixSeconds;
BYTE navSpare;
WORD julianDay;/* cable out */
WORD layback;
};