-
Notifications
You must be signed in to change notification settings - Fork 1
/
rditype.m
349 lines (324 loc) · 10.1 KB
/
rditype.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
%======================================================================
% R D I T Y P E . M
% doc: Wed Jan 7 16:49:09 2009
% dlm: Wed Jan 7 16:49:22 2009
% (c) 2009 A.M. Thurnherr
% uE-Info: 287 0 NIL 0 0 72 0 2 8 NIL ofnI
%======================================================================
% CHANGES BY ANT:
% Jan 7, 2009: - tightened use of exist()
function [data,d] = rditype(file, verbose, select);
% function data = rditype(file, verbose, select);
% Read the fixed leader data from a raw ADCP
% data file.
% Returns the contents of the fixed leader
% as 31 elements of the vector 'data' or an
% empty matrix if the fixed leader ID is not
% identified (error condition)
% If the variable select is provided as a vector
% of zeros and ones, the function will return
% only the elements of data which correspond to
% a one in the vector select. Select must be the
% the same length as the number of fields in the
% record, currently 32.
% Set verbose=1 for a text output.
% get fixed leader data
if nargin<3, select = ones(1,31); end
if nargin<2, verbose = 0; end
if nargin<1, disp(' provide file name '), return, end
fid = fopen(file,'r','l');
hid = 127; % header identification byte
[id,n] = fread(fid,2,'uint8');
status = fseek(fid,0,'bof');
if id(1) ~= hid
% Fix parameter for NB-ADCP Kiel
data=zeros(1,32);
d.nbytes=NaN;
d.ntypes=NaN;
d.Firm_Version=0;
d.Frequency=150;
d.Up=0;
d.Beam_angle=20;
d.Cell_length=1600;
d.Pings_per_Ensemble=8;
d.Pulse_length=1600;
d.Blank=NaN;
d.Mode=NaN;
d.Time_Pings=NaN;
d.Coordinates=3;
d.NarrowBand=1;
return
end
[d.nbytes, d.ntypes, offsets] = rdhead(fid, verbose);
% ---- now at start of fixed leader data
% originally
% Written by Marinna Martini
% for the U.S. Geological Survey
% Atlantic Marine Geology, Woods Hole, MA
% 1/7/95
data=zeros(1,32);
fld=1;
% make sure we're looking at the beginning of
% the fixed leader record by testing for it's ID
data(fld)=fread(fid,1,'ushort');
if(data(fld)~=0),
disp('Fixed Leader ID not found');
data=[];
return;
end
fld=fld+1;
% version number of CPU firmware
data(fld)=fread(fid,1,'uchar');
fld=fld+1;
% revision number of CPU firmware
data(fld)=fread(fid,1,'uchar');
d.Firm_Version=data(fld-1)+data(fld)/100;
if verbose, disp(sprintf('CPU Version %d.%d',data(fld-1),data(fld))); end;
fld=fld+1;
% configuration, uninterpreted
data(fld)=fread(fid,1,'uchar');
b=dec2binv(data(fld));
freqs=[75 150 300 600 1200 2400];
junk=bin2decv(b(6:8));
d.Frequency=freqs(junk+1);
d.Up=str2num(b(1));
if verbose,
disp(sprintf('Hardware Configuration for LSB %d',data(fld)));
disp(sprintf(' System Frequency = %d kHz',freqs(junk+1)));
if b(5) == '0', disp(' Concave Beam'); end
if b(5) == '1', disp(' Convex Beam'); end
junk=bin2decv(b(3:4));
disp(sprintf('Sensor Configuration #%d',junk+1));
if b(2) == '0', disp(' Transducer head not attached'); end
if b(2) == '1', disp(' Transducer head attached'); end
if b(1) == '0', disp(' Downward facing beam orientation'); end
if b(1) == '1', disp(' Upward facing beam orientation'); end
end;
fld=fld+1;
data(fld)=fread(fid,1,'uchar');
b=dec2binv(data(fld));
angles = [15 20 30 0];
junk=bin2decv(b(7:8));
d.Beam_angle=angles(junk+1);
if verbose,
disp(sprintf('Hardware Configuration MSB %d',data(fld)));
disp(sprintf(' Beam angle = %d degrees',angles(junk+1)));
junk=bin2decv(b(1:4));
if junk == 4, disp(' 4-beam janus configuration'); end
if junk == 5, disp(' 5-beam janus configuration, 3 demodulators'); end
if junk == 15, disp(' 4-beam janus configuration, 2 demodulators'); end
end;
fld=fld+1;
% real (0) or simulated (1) data flag
data(fld)=fread(fid,1,'uchar'); fld=fld+1;
% undefined
data(fld)=fread(fid,1,'uchar'); fld=fld+1;
% number of beams
data(fld)=fread(fid,1,'uchar'); fld=fld+1;
% number of depth cells
data(fld)=fread(fid,1,'uchar');
d.Depth_Cells=data(fld);
if verbose, disp(sprintf('Number of depth cells %d',data(fld))); end;
fld=fld+1;
% pings per ensemble
data(fld)=fread(fid,1,'ushort');
d.Pings_per_Ensemble=data(fld);
if verbose, disp(sprintf('Pings per ensemble %d',data(fld))); end;
fld=fld+1;
% depth cell length in cm
data(fld)=fread(fid,1,'ushort');
d.Cell_length=data(fld);
if verbose, disp(sprintf('Depth cell size %d cm',data(fld))); end
fld=fld+1;
% blanking distance (WF)
data(fld)=fread(fid,1,'ushort');
d.Blank=data(fld);
if verbose, disp(sprintf('Blank after xmit distance %d cm',data(fld))); end
fld=fld+1;
% Profiling mode (WM)
data(fld)=fread(fid,1,'uchar');
d.Mode=data(fld);
if verbose, disp(sprintf('Profiling mode %d',data(fld))); end
fld=fld+1;
% Minimum correlation threshold (WC)
data(fld)=fread(fid,1,'uchar');
d.Min_Correlation=data(fld);
if verbose, disp(sprintf('Correlation threshold %d',data(fld))); end
fld=fld+1;
% number of code repetitions
data(fld)=fread(fid,1,'uchar');
d.Code_rep=data(fld);
fld=fld+1;
% Minimum percent good to output data (WG)
data(fld)=fread(fid,1,'uchar');
d.Min_Percgood=data(fld);
fld=fld+1;
% Error velocity threshold (WE)
d.Max_Errorvel=data(fld);
data(fld)=fread(fid,1,'ushort');
if verbose, disp(sprintf('Error Velocity Threshold %d mm/s',data(fld))); end
fld=fld+1;
% time between ping groups (TP)
data(fld)=fread(fid,1,'uchar');
d.Time_Pings=data(fld)*60;
fld=fld+1;
data(fld)=fread(fid,1,'uchar');
d.Time_Pings=d.Time_Pings+data(fld);
fld=fld+1;
data(fld)=fread(fid,1,'uchar');
d.Time_Pings=d.Time_Pings+data(fld)/100;
if verbose, disp(sprintf('Time between ping groups %d:%d.%d',...
data(fld-2), data(fld-1), data(fld))); end
fld=fld+1;
% coordinate transformation (EX)
data(fld)=fread(fid,1,'uchar');
b=dec2binv(data(fld));
junk=bin2decv(b(4:5));
d.Coordinates=junk;
d.use_tilt=str2num(b(6));
if verbose,
disp(sprintf('Coordinate Transformation = %d',data(fld)));
if junk == 0, disp(' Data stored coordinates = Beam'); end
if junk == 1, disp(' Data stored coordinates = Instrument'); end
if junk == 2, disp(' Data stored coordinates = Ship'); end
if junk == 3, disp(' Data stored coordinates = Earth'); end
if b(6) == '1', disp(' Tilts used in transformation'); end
% if b(7) == '1', disp(' 3-beam solution used, this ensemble'); end
end
fld=fld+1;
% Heading Alignment (EA)
data(fld)=fread(fid,1,'uint16');
d.headin_alignment=data(fld);
fld=fld+1;
% Heading Bias (EB)
data(fld)=fread(fid,1,'uint16');
d.headin_bias=data(fld);
if verbose, disp(sprintf('Heading Bias: %d deg',data(fld)./100)); end
fld=fld+1;
% Sensor source (EZ)
data(fld)=fread(fid,1,'uchar');
b=dec2binv(data(fld));
d.sensor_source=b;
if verbose,
disp(sprintf('Sensor Source = %d',data(fld)));
if b(2) == '1', disp(' Sound speed computed from ED, ES, ET'); end
if b(3) == '1', disp(' ED taken from depth sensor'); end
if b(4) == '1', disp(' EH taken from xducer heading sensor'); end
if b(5) == '1', disp(' EP taken from xducer pitch sensor'); end
if b(6) == '1', disp(' ER taken from xducer roll sensor'); end
if b(7) == '1', disp(' ES derived from conductivity sensor'); end
if b(8) == '1', disp(' ET taken from temperature sensor'); end
end
fld=fld+1;
% Sensors available
data(fld)=fread(fid,1,'uchar');
b=dec2binv(data(fld));
d.sensor_avail=b;
if verbose,
disp(sprintf('Sensor Availability = %d',data(fld)));
if b(3) == '1', disp(' depth sensor'); end
if b(4) == '1', disp(' heading sensor'); end
if b(5) == '1', disp(' pitch sensor'); end
if b(6) == '1', disp(' roll sensor'); end
if b(7) == '1', disp(' conductivity sensor'); end
if b(8) == '1', disp(' temperature sensor'); end
end
fld=fld+1;
% Bin 1 distance
data(fld)=fread(fid,1,'ushort');
if verbose, disp(sprintf('Distance to center of bin 1: %d cm',data(fld))); end
fld=fld+1;
% xmit pulse length
data(fld)=fread(fid,1,'ushort');
d.Pulse_length=data(fld);
fld=fld+1;
% starting depth cell
data(fld)=fread(fid,1,'uchar');
fld=fld+1;
% ending depth cell
data(fld)=fread(fid,1,'uchar');
fld=fld+1;
% false target reject threshold
data(fld)=fread(fid,1,'uchar');
d.target_max=data(fld);
fld=fld+1;
% spare
data(fld)=fread(fid,1,'uchar');
fld=fld+1;
% transmit lag distance
data(fld)=fread(fid,1,'ushort');
d.xmit_lag=data(fld);
if length(select) == length(data),
data(find(select==0))=[];
end
%--------------------------------------
function [nb, nt, off] = rdhead(fid, verbose);
%function [nb, nt, off] = rdhead(fid, verbose);
% Read the header data from a raw ADCP
% data file opened for binary reading.
% fid = file handle returned by fopen
% nb = number of bytes in the ensemble
% nt = number of data types
% off = offset to the data for each type
% Set verbose = 1 for a text output.
% Written by Marinna Martini
% for the U.S. Geological Survey
% Atlantic Marine Geology, Woods Hole, MA
% 1/7/95
data = zeros(1,2);
fld=1;
if ~exist('verbose','var'),
verbose = 0;
end
nb=[]; nt=[]; off=[];
% make sure we're looking at the beginning of
% the header record by testing for it's ID
junk=fread(fid,2,'uint8');
if((length(junk)~=2) | (ftell(fid)<0)),
disp('End of file found in rdhead.');
return;
end
if ((junk(1)~=127) | (junk(2)~=127)),
disp('Header ID not found');
return;
end
% get the number of bytes this ensemble
nb = fread(fid,1,'uint16');
if verbose, disp(sprintf('Number of bytes per ensemble %d',nb)); end;
% get the number of data types
fseek(fid,1,'cof'); % skip spare byte position
nt=fread(fid,1,'uchar');
if verbose, disp(sprintf('Number of data types %d',nt)); end;
% get the type offset
off=zeros(nt,1);
for j=1:nt, off(j)=fread(fid,1,'uint16'); end
% ---------------------------------
function d = bin2decv(h)
%BIN2DEC BIN2DEC('X') returns the decimal number corresponding to the
% binary number in quotes.
% For example, BIN2DEC([1 1 0 0]) returns 12.
n=length(h);
h=fliplr(h);
d=0;
for i=1:n
if isstr(h(i)),
p(i) = str2num(h(i)).*(2^(i-1));
else
p(i) = h(i).*(2^(i-1));
end
end
d=sum(p);
% ---------------------------------
function h = dec2binv(d)
%DEC2BIN DEC2BIN(d) returns the binary number corresponding to the decimal
% number d. For example, DEC2BIN(202) returns '11001010'.
%
%
h=dec2bin(d);
bits=length(h)/8;
if bits ~= fix(bits),
% not an even multiple of 8, so pad
npad = 8-((bits-fix(bits))*8);
h0(1:npad)='0';
h = [h0,h];
end