function ens = rdadens(ens) % ens = rdadens(ens) Reads one ensemble of ADCP data into structure ens. % This script reads from a packed binary file of ADCP data. The % format is given in the RDI Technical Manual, P.N. 951-6046-00 . % Units are converted to meters. % ens must contain the file id of the (opened) file as ens.fidin . fid = ens.fidin; ens.id1=fread( fid,1,'uchar' ); % Two ID bytes, both = 127 ens.id2=fread( fid, 1, 'uchar' ); if ens.id1 ~= 127 | ens.id2 ~= 127 '****** ERROR READING ID BYTES ******' end ens.id3=fread( fid, 2, 'uchar' ); % Is this a transect number? junk1 = fread( fid, 1, 'uchar' ); ens.NDT = fread( fid, 1, 'uchar' ); % Number of data blocks. ens.doffset = fread( fid, ens.NDT, 'short' ); % Offsets % In principle the preceeding data permit a generalized unpacking % procedure. What follows assumes a particular configuration of % data, however: velocity data (type 1), correlation magnitudes % (type 2), echo intensities (type 3), percent-good data (type 4), % and bottom-track data (type 5). ens.fid = fread( fid, 1, 'short' ); ens.fv = fread( fid, 1, 'uchar' ); ens.fr = fread( fid, 1, 'uchar' ); ens.syscfg = fread( fid, 1, 'short' ); ens.pd = fread( fid, 1, 'uchar' ); junk1 = fread( fid, 1, 'uchar' ); ens.nbm = fread( fid, 1, 'uchar' ); ens.WN = fread( fid, 1, 'uchar' ); ens.WP = fread( fid, 1, 'short' ); ens.WS = fread( fid, 1, 'short' )/100.; % Depth cell length. ens.WF = fread( fid, 1, 'short' )/100.; % Blank after transmit % distance. ens.WM = fread( fid, 1, 'uchar' ); ens.WC = fread( fid, 1, 'uchar' ); ens.ncr = fread( fid, 1, 'uchar' ); % No. of code repetitions. ens.WG = fread( fid, 1, 'uchar' ); ens.WE = fread( fid, 1, 'short' )/1000.; % Velocity-error limit. ens.tppmn = fread( fid, 1, 'uchar' ); % Time between ping groups. ens.tppsc = fread( fid, 1, 'uchar' ); ens.tpphd = fread( fid, 1, 'uchar' ); ens.EX = fread( fid, 1, 'uchar' ); ens.EA = fread( fid, 1, 'short' )/100.; % Heading-alignment % correction. ens.EB = fread( fid, 1, 'short' )/100.; % Heading bias (Mag % field). ens.EZ = fread( fid, 1, 'uchar' ); % Sensors to be used. ens.SA = fread( fid, 1, 'uchar' ); % Sensors available. ens.dis1 = fread( fid, 1, 'short' )/100.; % Distance to middle of first % depth cell, measured % from the transducer head. ens.WT = fread( fid, 1, 'short' )/100.; % Transmit pulse length. ens.WL = fread( fid, 1, 'uchar' ); % Starting and ending cell ens.WP = fread( fid, 1, 'uchar' ); % numbers for reference layer. ens.WA = fread( fid, 1, 'uchar' ); % False-target threshold. junk1 = fread( fid, 1, 'uchar' ); ens.LagD = fread( fid, 1, 'short' )/100.; % Distance between pulse % (=code?) repetitions. %***** Start variable leader data. ***** ens.VID = fread( fid, 1, 'short' ); if ens.VID ~= 128 '****** ERROR READING VARIABLE LEADER DATA ******' end ens.ENS = fread( fid, 1, 'short' ); ens.RTCyr = fread( fid, 1, 'uchar' ); % Real-Time Clock. ens.RTCmo = fread( fid, 1, 'uchar' ); ens.RTCdy = fread( fid, 1, 'uchar' ); ens.RTChr = fread( fid, 1, 'uchar' ); ens.RTCmn = fread( fid, 1, 'uchar' ); ens.RTCsc = fread( fid, 1, 'uchar' ); ens.RTChd = fread( fid, 1, 'uchar' ); ens.ENSMSB = fread( fid, 1, 'uchar' ); ens.BIT = fread( fid, 1, 'short' ); ens.EC = fread( fid, 1, 'short' ); % Speed of sound. ens.ED = fread( fid, 1, 'short' )/10.; % Transducer depth (in % decimeters??!!). ens.EH = fread( fid, 1, 'short' )/100.; % Heading angle ens.EP = fread( fid, 1, 'short' )/100.; % Pitch angle. ens.ER = fread( fid, 1, 'short' )/100.; % Roll angle. ens.ES = fread( fid, 1, 'short' ); % Salinity (ppt) ens.ET = fread( fid, 1, 'short' )/100.; % Temperature. ens.MPTmm = fread( fid, 1, 'uchar' ); ens.MPTss = fread( fid, 1, 'uchar' ); ens.MPThh = fread( fid, 1, 'uchar' ); ens.Hsd = fread( fid, 1, 'uchar' ); % Heading standard deviation. ens.Psd = fread( fid, 1, 'uchar' )/10.; % Pitch std. dev. ens.Rsd = fread( fid, 1, 'uchar' )/10.; % Roll std. dev. ens.ADC0 = fread( fid, 1, 'uchar' ); ens.ADC1 = fread( fid, 1, 'uchar' ); ens.ADC2 = fread( fid, 1, 'uchar' ); ens.ADC3 = fread( fid, 1, 'uchar' ); ens.ADC4 = fread( fid, 1, 'uchar' ); ens.ADC5 = fread( fid, 1, 'uchar' ); ens.ADC6 = fread( fid, 1, 'uchar' ); ens.ADC7 = fread( fid, 1, 'uchar' ); % Decode the velocity data. ens.VELID = fread( fid, 1, 'short' ); if ens.VELID ~= 1 '****** ERROR READING VELOCITY DATA ******' end % Read in velocities, convert from mm/s to m/s. ens.vtx=zeros(4,ens.WN); for iwn=1:ens.WN ens.vtx(1:4,iwn) = fread( fid, 4, 'short' )/1000.; end % Decode the correlation magnitudes. ens.CMID = fread( fid, 1, 'short' ); if ens.CMID ~= 2 '****** ERROR READING CORRELATION MAGNITUDES ******' end ens.cormag = zeros(4,ens.WN); for iwn=1:ens.WN ens.cormag(1:4,iwn) = fread( fid, 4, 'uchar' ); end % Decode the echo intensities. ens.ECHID = fread( fid, 1, 'short' ); if ens.ECHID ~= 3 '****** ERROR READING ECHO INTENSITIES ******' end ens.echo=zeros(4,ens.WN); for iwn=1:ens.WN ens.echo(1:4,iwn) = fread( fid, 4, 'uchar' ); end % Decode the percent-good data. ens.PCTID = fread( fid, 1, 'short' ); if ens.PCTID ~= 4 '****** ERROR READING PERCENT-GOOD DATA ******' end ens.pctgood=zeros(4,ens.WN); for iwn=1:ens.WN ens.pctgood=fread( fid, 4, 'uchar' ); end % decode the bottom-track data. ens.BTID = fread( fid, 1, 'short' ); if ens.BTID ~= 6 '****** ERROR READING BOTTOM-TRACK DATA ****** ' end ens.BP = fread( fid, 1, 'short' ); ens.BD = fread( fid, 1, 'short' ); ens.BC = fread( fid, 1, 'uchar' ); ens.BA = fread( fid, 1, 'uchar' ); ens.Bpct = fread( fid, 1, 'uchar' ); ens.BM = fread( fid, 1, 'uchar' ); ens.BE = fread( fid, 1, 'short' )/1000.; % Max. bottom-track error. junk1 = fread( fid, 1, 'short' ); junk1 = fread( fid, 1, 'short' ); ens.BTR = fread( fid, 4, 'short' )/100.; ens.BTV = fread( fid, 4, 'short' )/1000.; ens.BTCM = fread( fid, 4, 'uchar' ); ens.BTEA = fread( fid, 4, 'uchar' ); ens.BTPG = fread( fid, 4, 'uchar' ); ens.BLM = fread( fid, 1, 'short' )/10.; % Min. Layer size ens.BLN = fread( fid, 1, 'short' )/10.; % Near boundary of % reference layer. ens.BLF = fread( fid, 1, 'short' )/10.; % Far boundary. ens.RLV = fread( fid, 4, 'short' )/1000.; % Reference layer % velocities. ens.RLCM = fread( fid, 4, 'uchar' ); % Ref. layer corr. mags ens.RLEI = fread( fid, 4, 'uchar' ); % Ref. layer echo intens. ens.RLPG = fread( fid, 4, 'uchar' ); % Ref. layer percent. good ens.BX = fread( fid, 1, 'short' )/10.; % Max. tracking depth value ens.RSSI = fread( fid, 4, 'uchar' ); ens.RSSIgain = fread( fid, 1, 'uchar' ); ens.BTRmsb = fread( fid, 4, 'uchar' ); ens.IRES = fread( fid, 2, 'uchar' ); ens.CHSUM = fread( fid, 2, 'uchar' );