function [ABS_Info,mdata,sdatenum,freq,z]=read_aquatec_v3(fname); % % [ABS_Info, mdata,sdatenum,freq]=READ_AQUATEC_V3(fname) % % Function to read ABS files from the Aquatec New Version (v3) system % % Input: % fname = filename of abs data including extention % % Output: % sdatenum : Burst starting time (in Matlab serial number, use datevec to make % yyy,mo,dd,hh,min,ss). % freq : Profile recording frequency % mdata : Amplitude data(3-D array) mdata[1:maxbin, time , freq] % z : Matrix of distances from the ABS head (one for % each transducer as these might have been set to be diffferent) % ABS_Info : ABS settings and system information % % % Written by George Voulgaris, CPSD Lab., Univ. of South Carolina, 01/30/04 % if you find a bug please email me at: gvoulgaris@geol.sc.edu % % Modified from a function written by Oleg Mouraenko, UF, 10/16/2003 % that was based on an original version created by Peter Traykovski, WHOI % finfo=dir(fname); flength=finfo.bytes; % fid = fopen(fname,'r'); % while ftell(fid)< flength try command=freadchk(fid,1,'uint8'); switch command; %----------------------------------------------------------------- % command=19 - File Type %----------------------------------------------------------------- case 19; junk=freadchk(fid,1,'uint8'); rec_size=freadchk(fid,1,'uint16'); chksum=freadchk(fid,1,'uint16'); sdata=freadchk(fid,rec_size/2,'uint16'); disp(['File Type (0=ABS): ',num2str(sdata(1))]) disp(['Version : ',num2str(sdata(2)),'.',num2str(sdata(3))]) %----------------------------------------------------------------- % command=20 - ABS Header %----------------------------------------------------------------- case 20; junk=freadchk(fid,1,'uint8'); rec_size=freadchk(fid,1,'uint16'); chksum=freadchk(fid,1,'uint16'); % InstrumentType=freadchk(fid,1,'uint16'); InstrumentUnitNo=freadchk(fid,1,'uint16'); burstnum=freadchk(fid,1,'uint32'); % sdata=freadchk(fid,8,'uint8'); second=str2num(dec2hex(sdata(2))); minute=str2num(dec2hex(sdata(3))); hour=str2num(dec2hex(sdata(4))); month=str2num(dec2hex(sdata(5))); day=str2num(dec2hex(sdata(6))); year=str2num(dec2hex(sdata(8)))*100+str2num(dec2hex(sdata(7))); sdatenum=datenum(year,month,day,hour,minute,second); % AuxChannelsBurstInterval=freadchk(fid,1,'uint16'); reserved=freadchk(fid,1,'uint16'); wakeupsource=freadchk(fid,1,'uint16'); %----------------------------------------------------------------- % command=21 - ABS Parameters %----------------------------------------------------------------- case 21; junk=freadchk(fid,1,'uint8'); rec_size=freadchk(fid,1,'uint16'); chksum=freadchk(fid,1,'uint16'); % BinaryFlag=freadchk(fid,1,'uint8'); junk=freadchk(fid,1,'uint8'); % ProfileRate=freadchk(fid,1,'uint16'); % Pinging rate in Hz Averaging1=freadchk(fid,1,'uint8'); % No of profiles averaged freq=ProfileRate/Averaging1; % Sampling frequency in Hz Averaging2=freadchk(fid,1,'uint8'); Averaging2=2^Averaging2; % ControlFlagBits=freadchk(fid,1,'uint16'); futureuse=freadchk(fid,3,'uint16'); Number_Channels=freadchk(fid,1,'uint16'); % Number of Channels Used % for i=1:Number_Channels PulseLength(i)=freadchk(fid,1,'uint16'); Decimation(i)=freadchk(fid,1,'uint16'); StartDistance_cm(i)=freadchk(fid,1,'uint16'); StopDistance_cm(i)=freadchk(fid,1,'uint16'); Time_Bet_Freqs(i)=freadchk(fid,1,'uint16'); Tranducer_Angle(i)=freadchk(fid,1,'int16'); Scaled_Gain(i)=freadchk(fid,1,'uint8'); Gain_step_cm(i)=freadchk(fid,1,'uint8'); Fixed_gain_db(i)=freadchk(fid,1,'int16'); Gain_step_db(i)=freadchk(fid,1,'float'); reserved=freadchk(fid,2,'uint16'); % BinSize(i)=1.25*2^(Decimation(i)); % in mm numbins(i)=(StopDistance_cm(i)-StartDistance_cm(i))/(BinSize(i)*0.1); % end % Frequencies used tmp=fliplr(dec2bin(65536+BinaryFlag))'; freqs_used=str2num(tmp([1:Number_Channels]'))'; numfreqs=sum(freqs_used); % number of frequencies %----------------------------------------------------------------- % command=40 - ABS Transducer Information %----------------------------------------------------------------- case 40; % command =40 - ABS Transducer Information junk=freadchk(fid,1,'uint8'); rec_size=freadchk(fid,1,'uint16'); chksum=freadchk(fid,1,'uint16'); No_of_Channels=freadchk(fid,1,'uint16'); for i=1:No_of_Channels Transducer_Type(i)=freadchk(fid,1,'uint16'); Shape_Constant(i)=freadchk(fid,1,'uint16'); Transducer_diameter(i)=freadchk(fid,1,'uint16'); Transducer_horizontal_size(i)=freadchk(fid,1,'uint16'); Transmit_Frequency(i)=freadchk(fid,1,'float'); Receive_Frequency(i)=freadchk(fid,1,'float'); Transducer_serial_No(i,1:16)=char(freadchk(fid,16,'uchar'))'; end %----------------------------------------------------------------- % command=22 - ABS Data 16 %----------------------------------------------------------------- case 22; junk=freadchk(fid,1,'uint8'); rec_size=freadchk(fid,1,'uint16'); chksum=freadchk(fid,1,'uint16'); sdata=freadchk(fid,rec_size/2,'uint16')'; N=length(sdata); numprofiles=floor(N/sum(numbins(1:numfreqs))); % Calculating number of profiles % if ~exist('mdata','var') % allocate memory mdata=zeros(numbins(1),numprofiles,numfreqs); lastprof=0; % last recorded profile end; % for i=1:numfreqs mdata(:,lastprof+1,i)=sdata((i-1)*numbins+1:i*numbins); end; lastprof=lastprof+1; %----------------------------------------------------------------- % other commands no rcognized are skipped %----------------------------------------------------------------- otherwise disp(sprintf('WARNING >> Command "%i" is not supported. Data omitted.',command)); junk=freadchk(fid,1,'uint8'); rec_size=freadchk(fid,1,'uint16'); chksum=freadchk(fid,1,'uint16'); sdata=freadchk(fid,rec_size,'uint8')'; end; catch disp('WARNING >> Error detected. Data may be corrupted'); mdata=mdata(:,1:lastprof,:); end; end; fclose(fid); % numprofs=lastprof; % % Create the range array for each frequency (these could be % set to be different in V.3. The range is set in the middle of % the bin. % z=zeros(max(numbins),numfreqs)*NaN; for i=1:numfreqs z(1:numbins(i),i)=[(StartDistance_cm(i)+BinSize(i)/10) : (BinSize(i)/10) : StopDistance_cm(i)]'-0.5*(BinSize(i)/10); end % % ABS_Info = struct('InstrumentType',InstrumentType,... 'InstrumentUnitNo',InstrumentUnitNo,... 'burstnum',burstnum,... 'year',year,... 'month',month,... 'day',day,... 'hour',hour,... 'minute',minute,... 'second',second,... 'ProfileRate',ProfileRate,... 'Averaging1',Averaging1,... 'wakeupsource',wakeupsource,... 'numprofiles',numprofiles',... 'Scaled_Gain',Scaled_Gain(1:numfreqs),... 'Gain_step_cm',Gain_step_cm(1:numfreqs),... 'Fixed_gain_db',Fixed_gain_db(1:numfreqs),... 'Gain_step_db',Gain_step_db(1:numfreqs),... 'Transducer_Type',Transducer_Type,... 'Shape_Constant',Shape_Constant(1:numfreqs),... 'Transducer_diameter',Transducer_diameter(1:numfreqs),... 'Transducer_horizontal_size',Transducer_horizontal_size(1:numfreqs),... 'Transmit_Frequency',Transmit_Frequency(1:numfreqs),... 'Receive_Frequency',Receive_Frequency(1:numfreqs),... 'Transducer_serial_No',Transducer_serial_No(1:numfreqs)); % % function M=freadchk(fid,count,type); % Modification of FREAD function to check if all % needed data was read. M = fread(fid,count,type); if length(M(:))> Unexpected End of File'); error('End of file'); end; return;