1. Added new GPR format IPRB/IPRH (Implulse Radar)

2. Fixed the file path issue. The user now can choose a file from a 
different folder.
3. Added the center frequency as a requirement along with the Tx-Rx 
distance and the trace step, as it is crucial for the DT1/HD to work 
with the official Sensors Software.
4. Removed some spaces from the HD header file
5. Added more comments to the script in case anyone want to understand 
the header structures.
这个提交包含在:
Craig Warren
2018-07-18 08:32:34 +01:00
父节点 b2c3e54c18
当前提交 a0393c88d8

查看文件

@@ -1,33 +1,38 @@
% outputfile_converter.m - converts gprMax merged output HDF5 file to RD3, DZT, DT1 files. % outputfile_converter.m - converts gprMax merged output HDF5 file to RD3,
% DZT, DT1 and IPRB files.
% %
% Author: Dimitrios Angelis % Author: Dimitrios Angelis
% Copyright: 2017-2018 % Copyright: 2017-2018
% Last modified: 25/03/2018 % Last modified: 18/07/2018
clear, clc, close all; clear, clc, close all;
% Select file. Keep file name, path name and file extension ============== % Select file =============================================================
[infile, path] = uigetfile('*.out', 'Select gprMax output file', 'Multiselect', 'Off'); [infile, path] = uigetfile('*.out', 'Select gprMax output file', ...
'Multiselect', 'Off');
if isequal(infile, 0) if isequal(infile, 0)
erd = errordlg('No output file'); infile = [];
but = findobj(erd, 'Style', 'Pushbutton'); path = [];
delete(but); HDR = [];
pause(1); close(erd); data = [];
HDR = []; data = [];
return return
end end
% File name, path name and file extension =================================
HDR.fname = strrep(lower(infile), '.out', ''); HDR.fname = strrep(lower(infile), '.out', '');
HDR.pname = path; HDR.pname = path;
HDR.fext = 'out'; HDR.fext = 'out';
% Read data from HDF5 file =============================================== % Read data from HDF5 file ================================================
infile = [HDR.pname infile];
dataex = h5read(infile, '/rxs/rx1/Ex'); dataex = h5read(infile, '/rxs/rx1/Ex');
dataey = h5read(infile, '/rxs/rx1/Ey'); dataey = h5read(infile, '/rxs/rx1/Ey');
dataez = h5read(infile, '/rxs/rx1/Ez'); dataez = h5read(infile, '/rxs/rx1/Ez');
% Field check ============================================================ % Field check =============================================================
if dataey == 0 & dataez == 0 if dataey == 0 & dataez == 0
data = dataex'; data = dataex';
elseif dataex == 0 & dataez == 0 elseif dataex == 0 & dataez == 0
@@ -48,21 +53,25 @@ else
end end
% Convert to double precision ============================================ % Sigle to double precision ===============================================
data = double(data); data = double(data);
% The HDF5 file does not contain information about the Tx-Rx separation == % The HDF5 file does not contain information about the centre frequency of
% distance and the trace step. The user needs to provide this information % the waveform, the Tx-Rx separation distance and the trace step. The user
% needs to provide this information.
while 1 while 1
prompt = {'Antenna Separation (m)', 'Trace Step (m)'}; prompt = {'Waveform Centre Frequency (MHz)', ...
dlg_title = 'gprMax information'; 'Source-Receiver Distance (m)', 'Trace Step (m)'};
answer = inputdlg(prompt, dlg_title, [1 45]); dlg_title = 'Additional Information';
answer = inputdlg(prompt, dlg_title, [1 50]);
answer = str2double(answer); answer = str2double(answer);
if isempty(answer) if isempty(answer)
HDR = []; data = []; HDR = [];
data = [];
return return
elseif isnan(answer(1)) || isnan(answer(2)) || answer(2) == 0 elseif isnan(answer(1)) || isnan(answer(2)) || isnan(answer(3))...
|| answer(1) <= 0 || answer(2) < 0 || answer(3) <=0
continue continue
else else
break break
@@ -70,41 +79,30 @@ while 1
end end
% Create header with basic informatio ===================================== % Create header with basic information ====================================
info = h5info(infile); HDR.centre_freq = answer(1); % Centre frequency (MHz)
attributes = info.Attributes; HDR.ant_sep = answer(2); % Antenna seperation / Tx-Rx distance (m)
% Antenna name HDR.trac_int = answer(3); % Trace interval / step (m)
if length(attributes) > 4 HDR.samp_int = h5readatt(infile, '/', 'dt') * 10^9; % Sampling interval / step (ns)
gMaxV = cell2mat(h5readatt(infile, '/', 'gprMax')); HDR.samp_freq = (1 / HDR.samp_int) * 10^3; % Sampling frequency (MHz)
HDR.antenna = (['gprMax ', gMaxV]); [HDR.num_samp, HDR.num_trac] = size(data); % Number of samples & traces
else HDR.time_window = HDR.num_samp * HDR.samp_int; % Time window (ns)
HDR.antenna = ('gprMax'); HDR.antenna = ['gprMax ', num2str(HDR.centre_freq), 'MHz']; % Antenna name
end
HDR.ant_sep = answer(1); % Tx-Rx separation distance
[HDR.num_samp, HDR.num_trac] = size(data); % Samples & traces
HDR.trac_int = answer(2); % Trace interval
HDR.samp_int = h5readatt(infile, '/', 'dt') * 10^9; % Sampling interval
HDR.samp_freq = (1 / HDR.samp_int) * 10^3; % Sampling Frequency
HDR.time_window = HDR.num_samp * HDR.samp_int; % Time window
x = 0 : HDR.trac_int : (HDR.num_trac - 1) * HDR.trac_int;
t = HDR.samp_int : HDR.samp_int : HDR.num_samp * HDR.samp_int;
%************************************************************************** %**************************************************************************
%******************************** Optional ******************************** %******************************** Optional ********************************
% Resample to 1024 samples ================================================ % Resample to 1024 samples ================================================
% I usually perform this step for either 512 or 1024 samples (line 98) % I usually perform this step for either 512 or 1024 samples (line 100)
% because many programs cannot load files with more samples. % because many GPR processing software cannot load files with more samples.
tx1 = 1 : HDR.num_samp; tx1 = 1 : HDR.num_samp;
fs1 = 1024 / HDR.num_samp; fs1 = 1024 / HDR.num_samp; % <------- 1024 samples
data = resample(data, tx1, fs1); data = resample(data, tx1, fs1, 'spline');
[HDR.num_samp, ~] = size(data); % New number of samples [HDR.num_samp, ~] = size(data); % New number of samples after resampling
HDR.samp_int = HDR.time_window / HDR.num_samp; % New sampling interval HDR.samp_int = HDR.time_window / HDR.num_samp; % New sampling interval (ns) after resampling
HDR.samp_freq = (1 / HDR.samp_int) * 10^3; % New sampling frequency HDR.samp_freq = (1 / HDR.samp_int) * 10^3; % New sampling frequency (MHz) after resampling
%************************************************************************** %**************************************************************************
%************************************************************************** %**************************************************************************
@@ -114,9 +112,9 @@ HDR.samp_freq = (1 / HDR.samp_int) * 10^3; % New sampling frequency
%******************************** Optional ******************************** %******************************** Optional ********************************
% Data scale ============================================================== % Data scale ==============================================================
data = data * 32767.5 ./ max(max(abs(data))); data = data * 32767.5 ./ max(max(abs(data))); %signal * ((1 - 1 / 2^bitrate) * 32768) / max(signal)
%signal * ((1 - 1 / 2^bitrate) * 32768) / max(signal) data(data >= 32767) = 32767;
data(data >= 32767.5) = 32767; data(data <= -32768) = -32768;
data = round(data); data = round(data);
%************************************************************************** %**************************************************************************
@@ -124,8 +122,11 @@ data = round(data);
% Plots =================================================================== % Plots ===================================================================
pmin = min(data(:)); pmin = min(data(:)); %Minimun plot scale
pmax = max(data(:)); pmax = max(data(:)); %Maximum plot scale
x = 0 : HDR.trac_int : (HDR.num_trac - 1) * HDR.trac_int; %Distance of each trace (m)
t = HDR.samp_int : HDR.samp_int : HDR.num_samp * HDR.samp_int; %Time of each sample (ns)
% Bscan % Bscan
f1 = figure('Name', 'Bscan', ... f1 = figure('Name', 'Bscan', ...
@@ -134,7 +135,7 @@ f1 = figure('Name', 'Bscan', ...
'Toolbar', 'Figure'); 'Toolbar', 'Figure');
clims = [pmin pmax]; clims = [pmin pmax];
colormap (flipud(bone(256))); colormap (bone(256)); %Black(negative) to white(positive)
im1 = imagesc(x, t, data, clims); im1 = imagesc(x, t, data, clims);
set(im1, 'cdatamapping', 'scaled'); set(im1, 'cdatamapping', 'scaled');
title(HDR.fname); title(HDR.fname);
@@ -149,10 +150,11 @@ movegui(f1, 'northeast');
% Frequency Spectrum % Frequency Spectrum
m = 2.^nextpow2(HDR.num_samp); m = 2.^nextpow2(HDR.num_samp);
amp = fft(data, m);
amp = fft(data, m);
amp = (abs(amp(1 : m / 2, :)) / m) * 2; amp = (abs(amp(1 : m / 2, :)) / m) * 2;
amp = mean(amp.'); amp = mean(amp.');
freq = HDR.samp_freq .* (0 : (m / 2) - 1) / m; freq = HDR.samp_freq .* (0 : (m / 2) - 1) / m;
f2 = figure('Name', 'Frequency Spectrum', ... f2 = figure('Name', 'Frequency Spectrum', ...
@@ -170,60 +172,62 @@ box off;
movegui(f2, 'southeast'); movegui(f2, 'southeast');
% Export option rd3 or dzt or dt1 ========================================= % Export option: RD3/RAD or DZT or DT1/HD or IPRB/IPRH ====================
while 1 while 1
choice = questdlg('File Type', 'Export', ... prompt = {'1 = RD3, 2 = DZT, 3 = DT1, 4 = IPRB'};
'RD3', 'DZT', 'DT1', 'Default'); dlg_title = 'Choose GPR Format';
switch choice answer = inputdlg(prompt, dlg_title, [1 45]);
case 'RD3' answer = str2double(answer);
flg = 1; if isempty(answer)
break return
case 'DZT' elseif ~isnumeric(answer) || answer ~= 1 && answer ~= 2 ...
flg = 2; && answer ~= 3 && answer ~= 4
break continue
case 'DT1' else
flg = 3; gpr_format = answer;
break break
end end
end end
wb = waitbar(0, 'Exporting...', 'Name', 'Exporting File'); wb = waitbar(0, 'Exporting...', 'Name', 'Exporting File');
% RAD / RD3, Mala GeoScience ============================================== % RAD / RD3, Mala GeoScience ==============================================
% Rad is the header file. In this file is all the important % Rad is the header file. In this file is all the important information
% information such as the number of traces, samples, measurement intervals... % such as the number of samples, traces, measurement intervals can be
% Rd3 is the data file. This file contains only the data (amplitudes) in a % found.
% binary form. % Rd3 is the data file. This file contains only the data (amplitude values)
if flg == 1 % in a binary form.
if gpr_format == 1
% Header structure % Header structure
HDR.fname = HDR.fname; % File name HDR.fname = HDR.fname; % File name
HDR.num_samp = HDR.num_samp; % Number of samples HDR.num_samp = HDR.num_samp; % Number of samples
HDR.samp_freq = HDR.samp_freq; % Sampling frequency HDR.samp_freq = HDR.samp_freq; % Sampling frequency (MHz)
HDR.frequency_steps = 1; % Frequency steps HDR.frequency_steps = 1; % Frequency steps
HDR.signal_pos = 0; HDR.signal_pos = 0; % Signal position
HDR.raw_signal_pos = 0; HDR.raw_signal_pos = 0; % Raw signal position
HDR.distance_flag = 1; % Distance flag: 0 time interval, 1 distance interval HDR.distance_flag = 1; % Distance flag: 0 time interval, 1 distance interval
HDR.time_flag = 0; % Time flag : 0 distance interval, 1 time interval HDR.time_flag = 0; % Time flag : 0 distance interval, 1 time interval
HDR.program_flag = 0; HDR.program_flag = 0; % Program flag
HDR.external_flag = 0; HDR.external_flag = 0; % External flag
HDR.trac_int_sec = 0; % Trace interval in seconds(only if Time flag = 1) HDR.trac_int_sec = 0; % Trace interval in seconds(only if Time flag = 1)
HDR.trac_int = HDR.trac_int; % Trace interval in meters (only if Distance flag = 1) HDR.trac_int = HDR.trac_int; % Trace interval in meters (only if Distance flag = 1)
HDR.operator = 'Unknown'; HDR.operator = 'Unknown'; % Operator
HDR.customer = 'Unknown'; HDR.customer = 'Unknown'; % Customer
HDR.site = 'gprMax'; HDR.site = 'gprMax'; % Site
HDR.antenna = HDR.antenna; % Antenna name HDR.antenna = HDR.antenna; % Antenna name
HDR.antenna_orientation = 'NOT VALID FIELD'; HDR.antenna_orientation = 'NOT VALID FIELD'; % Antenna orientation
HDR.ant_sep = HDR.ant_sep; % Antenna seperation (Tx-Rx distance) HDR.ant_sep = HDR.ant_sep; % Antenna seperation / Tx-Rx distance (m)
HDR.comment = '-'; HDR.comment = '----'; % Comment
HDR.time_window = HDR.time_window; % Time window HDR.time_window = HDR.time_window; % Time window (ns)
HDR.stacks = 0; % Stacks HDR.stacks = 1; % Stacks
HDR.stack_exponent = 0; % Stack exponent HDR.stack_exponent = 0; % Stack exponent
HDR.stacking_time = 0; % Stacking Time HDR.stacking_time = 0; % Stacking Time
HDR.num_trac = HDR.num_trac; % Number of traces HDR.num_trac = HDR.num_trac; % Number of traces
HDR.stop_pos = HDR.num_trac * HDR.trac_int; % Stop position (meters) HDR.stop_pos = HDR.num_trac * HDR.trac_int; % Stop position (m)
HDR.system_calibration = 0; HDR.system_calibration = 0;
HDR.start_pos = 0; % Start position (meters) HDR.start_pos = 0; % Start position (m)
HDR.short_flag = 1; HDR.short_flag = 1;
HDR.intermediate_flag = 0; HDR.intermediate_flag = 0;
HDR.long_flag = 0; HDR.long_flag = 0;
@@ -287,30 +291,29 @@ if flg == 1
% DZT, Geophysical Survey Systems Inc. (GSSI) ============================= % DZT, Geophysical Survey Systems Inc. (GSSI) =============================
% Dzt is a binary file that consists of the file header with all the % Dzt is a binary file that consists of the file header with all the
% important information (number of traces, samples, channels, etc.) followed % important information (number of samples, traces, channels, etc.)
% by the data section. % followed by the data section.
% All information that is needed is contained in this file except the % All the information is contained in this file except the TxRx distance
% TxRx distance (antenna separation). There is a possibility that the % (antenna separation). There is a possibility that the official GSSI
% official GSSI software has stored this information and by using the % software has stored this information and by using the antenna name
% antenna name presents the correct one. All the other software does not % presents the correct one. All the other software does not detect the TxRx
% detect the TxRx distance. % distance.
elseif gpr_format == 2
elseif flg == 2
% Header structure % Header structure
HDR.fname = HDR.fname; % File name HDR.fname = HDR.fname; % File name
HDR.tag = 255; % Header = 255 HDR.tag = 255; % Header = 255
HDR.data_offset = 1024; % Offset to data from the beginning of file HDR.data_offset = 1024; % Offset to data from the beginning of file
HDR.num_samp = HDR.num_samp; % Number of samples HDR.num_samp = HDR.num_samp; % Number of samples
HDR.bits_per_word = 16; % Bits per data word (8, 16, 32) HDR.data_format = 16; % Bits per data word (8, 16, 32)
HDR.binary_offset = 32768; % Binary offset, 8 bit = 128, 16 bit = 32768 HDR.binary_offset = 32768; % Binary offset, 8 bit = 128, 16 bit = 32768
HDR.scans_per_second = 0; % Scans per second HDR.scans_per_second = 0; % Scans per second
HDR.scans_per_meter = 1 / HDR.trac_int; % Scans per meter HDR.scans_per_meter = 1 / HDR.trac_int; % Scans per meter
HDR.meters_per_mark = 0; % Meters per mark HDR.meters_per_mark = 0; % Meters per mark
HDR.zero_time_adjustment = 0; % Time zero adjustment (nanoseconds) HDR.zero_time_adjustment = 0; % Time zero adjustment (ns)
HDR.time_window = HDR.time_window; % Time window (with no corrections i.e zero time) HDR.time_window = HDR.time_window; % Time window (with no corrections i.e zero time)
HDR.scans_per_pass = 0; % Scan per pass for 2D files HDR.scans_per_pass = 0; % Scan per pass for 2D files
HDR.createdate.sec = 0 / 2; % Structure, date created HDR.createdate.sec = 0 / 2; % Structure, date created
HDR.createdate.min = 0; HDR.createdate.min = 0;
HDR.createdate.hour = 0; HDR.createdate.hour = 0;
HDR.createdate.day = 0; HDR.createdate.day = 0;
@@ -318,59 +321,61 @@ elseif flg == 2
HDR.createdate.year = 0 - 1980; HDR.createdate.year = 0 - 1980;
date_time = clock; date_time = clock;
HDR.modifydate.sec = date_time(6) / 2; % Structure, date modified HDR.modifydate.sec = date_time(6) / 2; % Structure, date modified
HDR.modifydate.min = date_time(5); HDR.modifydate.min = date_time(5);
HDR.modifydate.hour = date_time(4); HDR.modifydate.hour = date_time(4);
HDR.modifydate.day = date_time(3); HDR.modifydate.day = date_time(3);
HDR.modifydate.month = date_time(2); HDR.modifydate.month = date_time(2);
HDR.modifydate.year = date_time(1) - 1980; HDR.modifydate.year = date_time(1) - 1980;
HDR.offset_to_range_gain = 0; % Offset to range gain HDR.offset_to_range_gain = 0; % Offset to range gain
HDR.size_of_range_gain = 0; % Size of range gain HDR.size_of_range_gain = 0; % Size of range gain
HDR.offset_to_text = 0; % Offset to text HDR.offset_to_text = 0; % Offset to text
HDR.size_of_text = 0; % Size of text HDR.size_of_text = 0; % Size of text
HDR.offset_to_proc_his = 0; % Offset to processing history HDR.offset_to_proc_his = 0; % Offset to processing history
HDR.size_of_proc_his = 0; % Size of processing hisstory HDR.size_of_proc_his = 0; % Size of processing history
HDR.num_channels = 1; % Number of channels HDR.num_channels = 1; % Number of channels
HDR.dielectric_constant = 8; % Dielectric constant (8 is a random number) HDR.dielectric_constant = 8; % Dielectric constant (8 is a random number)
HDR.top_position = 0; % Top position HDR.top_position = 0; % Top position
c = 299792458; c = 299792458;
v = (c / sqrt(HDR.dielectric_constant)) * 10^-9; v = (c / sqrt(HDR.dielectric_constant)) * 10^-9;
HDR.range_depth = v * (HDR.time_window / 2); % Range depth HDR.range_depth = v * (HDR.time_window / 2); % Range depth (m)
HDR.reserved = zeros(31, 1); % Reserved HDR.reserved = zeros(31, 1); % Reserved
HDR.data_type = 0; HDR.data_type = 0; % Data type
if length(HDR.antenna) == 14 % Antenna name if length(HDR.antenna) == 14 % Antenna name
HDR.antenna = HDR.antenna; HDR.antenna = HDR.antenna;
elseif length(HDR.antenna) < 14 elseif length(HDR.antenna) < 14
if verLessThan('matlab', '9.1') if verLessThan('matlab', '9.1')
HDR.antenna = [HDR.antenna repmat(' ', 1, 14 - length(HDR.antenna))]; HDR.antenna = [HDR.antenna repmat(' ', ...
1, 14 - length(HDR.antenna))];
else else
HDR.antenna = pad(HDR.antenna, 14, 'right'); HDR.antenna = pad(HDR.antenna, 14, 'right');
end end
elseif length(HDR.antenna) > 14 elseif length(HDR.antenna) > 14
HDR.antenna = HDR.antenna(1 : 14); HDR.antenna = HDR.antenna(1 : 14);
end end
HDR.channel_mask = 0; % Channel mask HDR.channel_mask = 0; % Channel mask
if length(HDR.fname) == 12 if length(HDR.fname) == 12 % Raw file name (File name during survey)
HDR.raw_file_name = HDR.fname; % Raw file name (File name during survey) HDR.raw_file_name = HDR.fname;
elseif length(HDR.fname) < 12 elseif length(HDR.fname) < 12
if verLessThan('matlab', '9.1') if verLessThan('matlab', '9.1')
HDR.raw_file_name = [HDR.raw_file_name repmat(' ', 1, 12 - length(HDR.raw_file_name))]; HDR.raw_file_name = [HDR.raw_file_name repmat(' ', ...
1, 12 - length(HDR.raw_file_name))];
else else
HDR.raw_file_name = pad(HDR.fname, 12, 'right'); HDR.raw_file_name = pad(HDR.fname, 12, 'right');
end end
elseif length(HDR.fname) > 12 elseif length(HDR.fname) > 12
HDR.raw_file_name = HDR.fname(1:12); HDR.raw_file_name = HDR.fname(1 : 12);
end end
HDR.checksum = 0; % Checksum HDR.checksum = 0; % Checksum
HDR.num_gain_points = 0; % Number of gain points HDR.num_gain_points = 0; % Number of gain points
HDR.range_gain_db = []; % Range gain in db HDR.range_gain_db = []; % Range gain in db
HDR.variable = zeros(896, 1); HDR.variable = zeros(896, 1);
% DZT file % DZT file
@@ -378,7 +383,7 @@ elseif flg == 2
fwrite(fid, HDR.tag, 'ushort'); fwrite(fid, HDR.tag, 'ushort');
fwrite(fid, HDR.data_offset, 'ushort'); fwrite(fid, HDR.data_offset, 'ushort');
fwrite(fid, HDR.num_samp, 'ushort'); fwrite(fid, HDR.num_samp, 'ushort');
fwrite(fid, HDR.bits_per_word, 'ushort'); fwrite(fid, HDR.data_format, 'ushort');
fwrite(fid, HDR.binary_offset, 'ushort'); fwrite(fid, HDR.binary_offset, 'ushort');
fwrite(fid, HDR.scans_per_second, 'float'); fwrite(fid, HDR.scans_per_second, 'float');
fwrite(fid, HDR.scans_per_meter, 'float'); fwrite(fid, HDR.scans_per_meter, 'float');
@@ -425,93 +430,94 @@ elseif flg == 2
% HD / DT1, Sensors & Software Inc. ======================================= % HD / DT1, Sensors & Software Inc. =======================================
% Hd is the header file. In this file is all the important % Hd is the header file. In this file all the important information such as
% information such as the number of traces, samples, stacks, etc. % the number of samples, traces, stacks, etc. can be found.
% Dt1 is the data file written in binary form. This file contains as many % Dt1 is the data file written in binary form. This file contains as many
% records as there are traces. Each record consists of a header section and % records as there are traces. Each record consists of a header and a data
% a data section. That means that in this file there are also stored % section. This means that also in this file there are stored information
% information such as the number of samples, traces, etc. % such as the number of samples, traces, etc.
elseif flg == 3
elseif gpr_format == 3
%Header structure of HD %Header structure of HD
HDR.fname = HDR.fname; % File name HDR.fname = HDR.fname; % File name
HDR.file_tag = 1234; % File tag = 1234 HDR.file_tag = 1234; % File tag = 1234
HDR.system = ['Data Collected with ' HDR.antenna]; HDR.system = 'gprMax'; % The system the data collected with
date_time = clock; date_time = clock;
HDR.date = ([num2str(date_time(3)), '/' ... HDR.date = ([num2str(date_time(1)), '-' ...
num2str(date_time(2)), '/' ... num2str(date_time(2)), '-' ...
num2str(date_time(1))]); % Date num2str(date_time(3))]);% Date
HDR.num_trac = HDR.num_trac; % Number of traces HDR.num_trac = HDR.num_trac; % Number of traces
HDR.num_samp = HDR.num_samp; % Number of samples HDR.num_samp = HDR.num_samp; % Number of samples
HDR.time_zero_point = 0; HDR.time_zero_point = 0; % Time zero point
HDR.time_window = HDR.time_window; % Total time window HDR.time_window = HDR.time_window; % Total time window (ns)
HDR.start_position = 0; HDR.start_position = 0; % Start position (m)
HDR.final_position = (HDR.num_trac - 1 ) * HDR.trac_int; HDR.final_position = (HDR.num_trac - 1) * HDR.trac_int; % Stop position (m)
HDR.trac_int = HDR.trac_int; % Trace interval HDR.trac_int = HDR.trac_int; % Trace interval (m)
HDR.pos_units = 'm'; % Position units HDR.pos_units = 'm'; % Position units
HDR.nominal_freq = 'Unknown'; % Nominal frequency HDR.nominal_freq = HDR.centre_freq; % Nominal freq. / Centre freq. (MHz)
HDR.ant_sep = HDR.ant_sep; % Antenna separation HDR.ant_sep = HDR.ant_sep; % Antenna seperation / Tx-Rx distance (m)
HDR.pulser_voltage = 'Unknown'; % Pulser voltage (V) HDR.pulser_voltage = 0; % Pulser voltage (V)
HDR.stacks = 0; % Number of stacks HDR.stacks = 1; % Number of stacks
HDR.survey_mode = 'Reflection'; % Survey mode HDR.survey_mode = 'Reflection'; % Survey mode
HDR.odometer = 0; % Odometer Cal (t/m) HDR.odometer = 0; % Odometer Cal (t/m)
HDR.stacking_type = 'F1'; % Stacking type (Not using 'Unknown' in case it causes any problems) HDR.stacking_type = 'F1'; % Stacking type
HDR.dvl_serial = '0000-0000-0000'; % DVL serial HDR.dvl_serial = '0000-0000-0000'; % DVL serial
HDR.console_serial = '000000000000'; % Console serial HDR.console_serial = '000000000000'; % Console serial
HDR.tx_serial = '0000-0000-0000'; % Transmitter serial HDR.tx_serial = '0000-0000-0000'; % Transmitter serial
HDR.rx_serial = '0000-0000-0000'; % Receiver Serial HDR.rx_serial = '0000-0000-0000'; % Receiver Serial
% Header structure of DT1 % Header structure of DT1
HDR.num_each_trac = 1 : 1 : HDR.num_trac; % Number of each trace 1, 2, 3, ... num_trac HDR.num_each_trac = 1 : 1 : HDR.num_trac; % Number of each trace 1, 2, 3, ... num_trac
HDR.position = 0 : HDR.trac_int : ... HDR.position = 0 : HDR.trac_int : ...
(HDR.num_trac - 1) * HDR.trac_int; % Position of each trace (Xaxis) (HDR.num_trac - 1) * HDR.trac_int; % Position of each trace (m)
HDR.num_samp_each_trac = zeros(1, HDR.num_trac) + HDR.num_samp; % Number of samples of each trace HDR.num_samp_each_trac = zeros(1, HDR.num_trac) + HDR.num_samp; % Number of samples of each trace
HDR.elevation = zeros(1, HDR.num_trac); % Elevation / topography of each trace; HDR.elevation = zeros(1, HDR.num_trac); % Elevation / topography of each trace
HDR.not_used1 = zeros(1, HDR.num_trac); % Not used HDR.not_used1 = zeros(1, HDR.num_trac); % Not used
HDR.bytes = zeros(1, HDR.num_trac) + 2; % Always 2 for Rev 3 firmware HDR.bytes = zeros(1, HDR.num_trac) + 2; % Always 2 for Rev 3 firmware
HDR.time_window_each_trac = zeros(1, HDR.num_trac) + HDR.time_window; % Time window of each trace HDR.time_window_each_trac = zeros(1, HDR.num_trac) + HDR.time_window; % Time window of each trace (ns)
HDR.stacks_each_trac = zeros(1, HDR.num_trac); % Number of stacks each trace HDR.stacks_each_trac = ones(1, HDR.num_trac); % Number of stacks each trace
HDR.not_used2 = zeros(1, HDR.num_trac); % Not used HDR.not_used2 = zeros(1, HDR.num_trac); % Not used
HDR.rsv_gps_x = zeros(1, HDR.num_trac); % Reserved for GPS X position (double*8 number) HDR.rsv_gps_x = zeros(1, HDR.num_trac); % Reserved for GPS X position (double*8 number)
HDR.rsv_gps_y = zeros(1, HDR.num_trac); % Reserved for GPS Y position (double*8 number) HDR.rsv_gps_y = zeros(1, HDR.num_trac); % Reserved for GPS Y position (double*8 number)
HDR.rsv_gps_z = zeros(1, HDR.num_trac); % Reserved for GPS Z position (double*8 number) HDR.rsv_gps_z = zeros(1, HDR.num_trac); % Reserved for GPS Z position (double*8 number)
HDR.rsv_rx_x = zeros(1, HDR.num_trac); % Reserved for receiver x position HDR.rsv_rx_x = zeros(1, HDR.num_trac); % Reserved for receiver x position
HDR.rsv_rx_y = zeros(1, HDR.num_trac); % Reserved for receiver y position HDR.rsv_rx_y = zeros(1, HDR.num_trac); % Reserved for receiver y position
HDR.rsv_rx_z = zeros(1, HDR.num_trac); % Reserved for receiver z position HDR.rsv_rx_z = zeros(1, HDR.num_trac); % Reserved for receiver z position
HDR.rsv_tx_x = zeros(1, HDR.num_trac); % Reserved for transmitter x position HDR.rsv_tx_x = zeros(1, HDR.num_trac); % Reserved for transmitter x position
HDR.rsv_tx_y = zeros(1, HDR.num_trac); % Reserved for transmitter y position HDR.rsv_tx_y = zeros(1, HDR.num_trac); % Reserved for transmitter y position
HDR.rsv_tx_z = zeros(1, HDR.num_trac); % Reserved for transmitter z position HDR.rsv_tx_z = zeros(1, HDR.num_trac); % Reserved for transmitter z position
HDR.time_zero = zeros(1, HDR.num_trac); % Time zero adjustment where: point(x) = point(x + adjustment) HDR.time_zero = zeros(1, HDR.num_trac); % Time zero adjustment where: point(x) = point(x + adjustment)
HDR.zero_flag = zeros(1, HDR.num_trac); % 0 = data ok, 1 = zero data HDR.zero_flag = zeros(1, HDR.num_trac); % 0 = data ok, 1 = zero data
HDR.num_channels = zeros(1, HDR.num_trac); % Number of channels HDR.num_channels = zeros(1, HDR.num_trac); % Number of channels
HDR.time = zeros(1, HDR.num_trac); % Time of day data collected in seconds past midnight HDR.time = zeros(1, HDR.num_trac); % Time of day data collected in seconds past midnight
HDR.comment_flag = zeros(1, HDR.num_trac); % Comment flag HDR.comment_flag = zeros(1, HDR.num_trac); % Comment flag
HDR.comment = zeros(1, 24); % Comment HDR.comment = zeros(1, 24); % Comment
% HD file % HD file
fid = fopen([HDR.fname '.hd'], 'w'); fid = fopen([HDR.fname '.hd'], 'w');
fprintf(fid, '%i\r\n\n', HDR.file_tag); fprintf(fid, '%i\r\n', HDR.file_tag);
fprintf(fid, 'Data Collected with %s\r\n\n', HDR.system); fprintf(fid, 'Data Collected with %s\r\n', HDR.system);
fprintf(fid, '%s\r\n\n', HDR.date); fprintf(fid, '%s\r\n', HDR.date);
fprintf(fid, 'NUMBER OF TRACES = %i\r\n\n', HDR.num_trac); fprintf(fid, 'NUMBER OF TRACES = %i\r\n', HDR.num_trac);
fprintf(fid, 'NUMBER OF PTS/TRC = %i\r\n\n', HDR.num_samp); fprintf(fid, 'NUMBER OF PTS/TRC = %i\r\n', HDR.num_samp);
fprintf(fid, 'TIMEZERO AT POINT = %i\r\n\n', HDR.time_zero_point); fprintf(fid, 'TIMEZERO AT POINT = %i\r\n', HDR.time_zero_point);
fprintf(fid, 'TOTAL TIME WINDOW = %0.6f\r\n\n', HDR.time_window); fprintf(fid, 'TOTAL TIME WINDOW = %0.6f\r\n', HDR.time_window);
fprintf(fid, 'STARTING POSITION = %0.f\r\n\n', HDR.start_position); fprintf(fid, 'STARTING POSITION = %0.6f\r\n', HDR.start_position);
fprintf(fid, 'FINAL POSITION = %0.6f\r\n\n', HDR.final_position); fprintf(fid, 'FINAL POSITION = %0.6f\r\n', HDR.final_position);
fprintf(fid, 'STEP SIZE USED = %0.6f\r\n\n', HDR.trac_int); fprintf(fid, 'STEP SIZE USED = %0.6f\r\n', HDR.trac_int);
fprintf(fid, 'POSITION UNITS = %s\r\n\n', HDR.pos_units); fprintf(fid, 'POSITION UNITS = %s\r\n', HDR.pos_units);
fprintf(fid, 'NOMINAL FREQUENCY = %s\r\n\n', HDR.nominal_freq); fprintf(fid, 'NOMINAL FREQUENCY = %0.6f\r\n', HDR.nominal_freq);
fprintf(fid, 'ANTENNA SEPARATION = %0.6f\r\n\n', HDR.ant_sep); fprintf(fid, 'ANTENNA SEPARATION = %0.6f\r\n', HDR.ant_sep);
fprintf(fid, 'PULSER VOLTAGE (V) = %s\r\n\n', HDR.pulser_voltage); fprintf(fid, 'PULSER VOLTAGE (V) = %0.6f\r\n', HDR.pulser_voltage);
fprintf(fid, 'NUMBER OF STACKS = %i\r\n\n', HDR.stacks); fprintf(fid, 'NUMBER OF STACKS = %i\r\n', HDR.stacks);
fprintf(fid, 'SURVEY MODE = %s\r\n\n', HDR.survey_mode); fprintf(fid, 'SURVEY MODE = %s\r\n', HDR.survey_mode);
fprintf(fid, 'ODOMETER CAL (t/m) = %0.6f\r\n\n', HDR.odometer); fprintf(fid, 'ODOMETER CAL (t/m) = %0.6f\r\n', HDR.odometer);
fprintf(fid, 'STACKING TYPE = %s\r\n\n', HDR.stacking_type); fprintf(fid, 'STACKING TYPE = %s\r\n', HDR.stacking_type);
fprintf(fid, 'DVL Serial# = %s\r\n\n', HDR.dvl_serial); fprintf(fid, 'DVL Serial# = %s\r\n', HDR.dvl_serial);
fprintf(fid, 'Console Serial# = %s\r\n\n', HDR.console_serial); fprintf(fid, 'Console Serial# = %s\r\n', HDR.console_serial);
fprintf(fid, 'Transmitter Serial#= %s\r\n\n', HDR.tx_serial); fprintf(fid, 'Transmitter Serial#= %s\r\n', HDR.tx_serial);
fprintf(fid, 'Receiver Serial# = %s\r\n', HDR.rx_serial); fprintf(fid, 'Receiver Serial# = %s\r\n', HDR.rx_serial);
fclose(fid); fclose(fid);
@@ -543,14 +549,121 @@ elseif flg == 3
fwrite(fid, HDR.comment_flag(i), 'float'); fwrite(fid, HDR.comment_flag(i), 'float');
fwrite(fid, HDR.comment, 'char'); fwrite(fid, HDR.comment, 'char');
fwrite(fid, data(:, i) , 'short'); fwrite(fid, data(:, i), 'short');
if mod(i, 10) == 0 if mod(i, 100) == 0
waitbar(i / HDR.num_trac, wb, sprintf('Exporting... %.f%%', i / HDR.num_trac * 100)) waitbar(i / HDR.num_trac, wb, sprintf('Exporting... %.f%%', ...
i / HDR.num_trac * 100))
end end
end end
fclose(fid); fclose(fid);
end
% IPRH / IPRB, Impulse Radar ==============================================
% IPRH is the header file. In this file is all the important information
% such as the number of samples, traces, measurement intervals can be
% found.
% IPRB is the data file. This file contains only the data (amplitude values)
% in a binary form.
elseif gpr_format == 4
% Header structure
HDR.fname = HDR.fname; % File name
HDR.hdr_version = 20; % Header version
HDR.data_format = 16; % Data format 16 or 32 bit
date_time = clock;
HDR.date = ([num2str(date_time(1)), '-' ...
num2str(date_time(2)), '-' ...
num2str(date_time(3))]);% Date
HDR.start_time = '00:00:00'; % Measurement start time
HDR.stop_time = '00:00:00'; % Measurement end time
HDR.antenna = [num2str(HDR.centre_freq) ' MHz']; % Antenna frequency (MHz)
HDR.ant_sep = HDR.ant_sep; % Antenna seperation / Tx-Rx distance (m)
HDR.num_samp = HDR.num_samp; % Number of samples
HDR.signal_pos = 0; % Signal position
HDR.clipped_samps = 0; % Clipped samples
HDR.runs = 0; % Number of runs
HDR.stacks = 1; % Maximum number of stacks
HDR.auto_stacks = 1; % Autostacks (1 = On)
HDR.samp_freq = HDR.samp_freq; % Sampling frequency (MHz)
HDR.time_window = HDR.time_window; % Total time window (ns)
HDR.num_trac = HDR.num_trac; % Number of traces
HDR.trig_source = 'wheel'; % Trig source (wheel or time)
HDR.trac_int_sec = 0; % Trace interval if trig source is time (sec)
HDR.trac_int_met = HDR.trac_int; % Trace interval if trig source is wheel (m)
HDR.user_trac_int = HDR.trac_int; % User defined trace interval if trig source is wheel (m)
HDR.stop_pos = HDR.num_trac * HDR.trac_int; % Stop position (meters or seconds) -> num_trac * trac_int
HDR.wheel_name = 'Cart'; % Wheel name
HDR.wheel_calibration = 0; % Wheel calibration
HDR.zero_lvl = 0; % Zero level
HDR.vel = 100; % The soil velocity (Selected in field m/usec). 100 is a random number
HDR.preprocessing = 'Unknown Preprocessing'; % Not in use
HDR.comment = '----'; % Not in use
HDR.antenna_FW = '----'; % Receiver firmware version
HDR.antenna_HW = '----'; % Not in use
HDR.antenna_FPGA = '----'; % Receiver FPGA version
HDR.antenna_serial = '----'; % Receiver serial number
HDR.software_version = '----'; % Software version
HDR.positioning = 0; % Positioning: (0 = no, 1 = TS, 2 = GPS)
HDR.num_channel = 1; % Number of channels
HDR.channel_config = 1; % This channel configuration
HDR.ch_x_offset = 0; % Channel position relative to ext.positioning
HDR.ch_y_offset = 0; % Channel position relative to ext.positioning
HDR.meas_direction = 1; % Meas. direction forward or backward
HDR.relative_direction = 0; % Direction to RL start(clockwise 360)
HDR.relative_distance = 0; % Distance from RL start to cross section
HDR.relative_start = 0; % DIstance from profile start to cross section
% IPRH file
fid = fopen([HDR.fname '.iprh'], 'w');
fprintf(fid, 'HEADER VERSION: %i\r\n', HDR.hdr_version);
fprintf(fid, 'DATA VERSION: %i\r\n', HDR.data_format);
fprintf(fid, 'DATE: %s\r\n', HDR.date);
fprintf(fid, 'START TIME: %s\r\n', HDR.start_time);
fprintf(fid, 'STOP TIME: %s\r\n', HDR.stop_time);
fprintf(fid, 'ANTENNA: %s\r\n', HDR.antenna);
fprintf(fid, 'ANTENNA SEPARATION: %0.6f\r\n', HDR.ant_sep);
fprintf(fid, 'SAMPLES: %i\r\n', HDR.num_samp);
fprintf(fid, 'SIGNAL POSITION: %0.6f\r\n', HDR.signal_pos);
fprintf(fid, 'CLIPPED SAMPLES: %i\r\n', HDR.clipped_samps);
fprintf(fid, 'RUNS: %i\r\n', HDR.runs);
fprintf(fid, 'MAX STACKS: %i\r\n', HDR.stacks);
fprintf(fid, 'AUTOSTACKS: %i\r\n', HDR.auto_stacks);
fprintf(fid, 'FREQUENCY: %0.6f\r\n', HDR.samp_freq);
fprintf(fid, 'TIMEWINDOW: %0.6f\r\n', HDR.time_window);
fprintf(fid, 'LAST TRACE: %i\r\n', HDR.num_trac);
fprintf(fid, 'TRIG SOURCE: %s\r\n', HDR.trig_source);
fprintf(fid, 'TIME INTERVAL: %0.6f\r\n', HDR.trac_int_sec);
fprintf(fid, 'DISTANCE INTERVAL: %0.6f\r\n', HDR.trac_int_met);
fprintf(fid, 'USER DISTANCE INTERVAL: %0.6f\r\n', HDR.user_trac_int);
fprintf(fid, 'STOP POSITION: %0.6f\r\n', HDR.stop_pos);
fprintf(fid, 'WHEEL NAME: %s\r\n', HDR.wheel_name);
fprintf(fid, 'WHEEL CALIBRATION: %0.6f\r\n', HDR.wheel_calibration);
fprintf(fid, 'ZERO LEVEL: %i\r\n', HDR.zero_lvl);
fprintf(fid, 'SOIL VELOCITY: %i\r\n', HDR.vel);
fprintf(fid, 'PREPROCESSING: %s\r\n', HDR.preprocessing);
fprintf(fid, 'OPERATOR COMMENT: %s\r\n', HDR.comment);
fprintf(fid, 'ANTENNA F/W: %s\r\n', HDR.antenna_FW);
fprintf(fid, 'ANTENNA H/W: %s\r\n', HDR.antenna_HW);
fprintf(fid, 'ANTENNA FPGA: %s\r\n', HDR.antenna_FPGA);
fprintf(fid, 'ANTENNA SERIAL: %s\r\n', HDR.antenna_serial);
fprintf(fid, 'SOFTWARE VERSION: %s\r\n', HDR.software_version);
fprintf(fid, 'POSITIONING: %i\r\n', HDR.positioning);
fprintf(fid, 'CHANNELS: %i\r\n', HDR.num_channel);
fprintf(fid, 'CHANNEL CONFIGURATION: %i\r\n', HDR.channel_config);
fprintf(fid, 'CH_X_OFFSET: %0.6f\r\n', HDR.ch_x_offset);
fprintf(fid, 'CH_Y_OFFSET: %0.6f\r\n', HDR.ch_y_offset);
fprintf(fid, 'MEASUREMENT DIRECTION: %i\r\n', HDR.meas_direction);
fprintf(fid, 'RELATIVE DIRECTION: %i\r\n', HDR.relative_direction);
fprintf(fid, 'RELATIVE DISTANCE: %0.6f\r\n', HDR.relative_distance);
fprintf(fid, 'RELATIVE START: %0.6f\r\n', HDR.relative_start);
fclose(fid);
% IPRB file
fid = fopen([HDR.fname '.iprb'], 'w');
fwrite(fid, data, 'short');
fclose(fid);
end
waitbar(1, wb, 'Done!!!'); waitbar(1, wb, 'Done!!!');
pause(1); pause(1);
close(wb); close(wb);