98 lines
2.8 KiB
Matlab
98 lines
2.8 KiB
Matlab
function dspInput = loadDspInputFromFilePaths(run_id, options)
|
|
%LOADDSPINPUTFROMFILEPATHS Load explicit signal files and prepare DSP input.
|
|
|
|
arguments
|
|
run_id
|
|
options struct
|
|
end
|
|
|
|
Tx_bits = load(textScalar(options.load_file_path.tx_bits_path));
|
|
Symbols = load(textScalar(options.load_file_path.tx_symbols_path));
|
|
Scpe_sig_raw = load(textScalar(options.load_file_path.rx_raw_path));
|
|
|
|
Tx_bits = Tx_bits.Bits;
|
|
Symbols = Symbols.Symbols;
|
|
Scpe_sig_raw = Scpe_sig_raw.Scpe_sig_raw;
|
|
|
|
fsym = Symbols.fs;
|
|
M = Symbols.logbook.ModifierCopy{1}.M;
|
|
duob_mode = Symbols.logbook.ModifierCopy{1}.duobinary_mode;
|
|
|
|
Scpe_sig_resampled = Scpe_sig_raw.resample("fs_in", Scpe_sig_raw.fs, "fs_out", 2*fsym);
|
|
[~, Scpe_cell, ~, found_sync] = Scpe_sig_resampled.tsynch("reference", Symbols, ...
|
|
"fs_ref", fsym, ...
|
|
"debug_plots", 1);
|
|
|
|
if found_sync
|
|
Scpe_cell = selectSyncedOccurrences(Scpe_cell, options);
|
|
else
|
|
warning('Could not synchronize the received signal with the stored symbols!');
|
|
end
|
|
|
|
dspInput = struct();
|
|
dspInput.run_id = run_id;
|
|
dspInput.dataTable = table();
|
|
dspInput.Tx_bits = Tx_bits;
|
|
dspInput.Symbols = Symbols;
|
|
dspInput.Scpe_cell = Scpe_cell;
|
|
dspInput.found_sync = found_sync;
|
|
dspInput.fsym = fsym;
|
|
dspInput.M = M;
|
|
dspInput.duob_mode = duob_mode;
|
|
end
|
|
|
|
function value = textScalar(value)
|
|
value = firstValue(value);
|
|
value = char(string(value));
|
|
end
|
|
|
|
function value = firstValue(value)
|
|
if iscell(value)
|
|
value = value{1};
|
|
elseif ~ischar(value) && ~isscalar(value)
|
|
value = value(1);
|
|
end
|
|
end
|
|
|
|
function Scpe_cell = selectSyncedOccurrences(Scpe_cell, options)
|
|
available_occurences = length(Scpe_cell);
|
|
start_occurence = floor(getOption(options, 'start_occurence', 1));
|
|
max_occurences = floor(getOption(options, 'max_occurences', available_occurences));
|
|
|
|
if available_occurences < 1
|
|
warning('loadDspInputFromFilePaths:NoSyncedOccurrences', ...
|
|
'Synchronization reported success, but no synced occurrences are available.');
|
|
return
|
|
end
|
|
|
|
if start_occurence < 1
|
|
error('loadDspInputFromFilePaths:InvalidStartOccurrence', ...
|
|
'start_occurence must be >= 1.');
|
|
end
|
|
|
|
if max_occurences < 1
|
|
Scpe_cell = Scpe_cell(1:0);
|
|
return
|
|
end
|
|
|
|
if start_occurence > available_occurences
|
|
warning('loadDspInputFromFilePaths:StartOccurrenceTooHigh', ...
|
|
['Requested start_occurence %d, but only %d synced occurrences are available. ', ...
|
|
'Processing the last occurrence only.'], ...
|
|
start_occurence, available_occurences);
|
|
Scpe_cell = Scpe_cell(available_occurences);
|
|
return
|
|
end
|
|
|
|
stop_occurence = min(available_occurences, start_occurence + max_occurences - 1);
|
|
Scpe_cell = Scpe_cell(start_occurence:stop_occurence);
|
|
end
|
|
|
|
function value = getOption(options, name, defaultValue)
|
|
if isfield(options, name)
|
|
value = options.(name);
|
|
else
|
|
value = defaultValue;
|
|
end
|
|
end
|