Files
imdd_silas/projects/HighSpeedExperiment_2024/a_minimal_example.m
Silas Oettinghaus 16846d4eb7 stuff
2026-01-12 11:36:15 +01:00

162 lines
5.5 KiB
Matlab

dsp_options.storage_path = 'Z:\2024\sioe_labor\';
dsp_options.max_occurences = 1;
db = DBHandler("dataBase", 'labor_highspeed', "type", 'mysql' );
% fp = QueryFilter();
%
% fp.where('Runs','fiber_length','EQUALS', 2);
% fp.where('Runs','wavelength','EQUALS', 1310);
% fp.where('Runs','bitrate','EQUALS', 300e9);
% fp.where('Runs','pam_level','EQUALS', 4);
% fp.where('Runs','rop_attenuation','EQUALS', 0);
% fp.where('Runs','is_mpi','EQUALS', 0);
% fp.where('Runs', 'db_mode','EQUALS', 0);
% % fields = db.getTableFieldNames('Runs');
% % [dataTable,~] = db.queryDB(fp, fields);
%
run_ids = [ 993 1205 1413 1623 1833 2043 2253 2628 2836 2958 3000 3042 3323 5098 5225 5267 5309];
for id = run_ids
fp = QueryFilter();
fp.where('Runs', 'run_id','EQUALS', id);
fields = db.getTableFieldNames('power_state_info');
fields = [fields; db.getTableFieldNames('Runs')];
fields = [fields; db.getTableFieldNames('dashboard_ungrouped_alltime')]; %dashboard_ungrouped_after_nov_2025 dashboard_ungrouped_aug_nov_2025
fields = unique(fields);
[dataTable,~] = db.queryDB(fp, fields);
fsym = dataTable(1,:).symbolrate;
M = double(dataTable(1,:).pam_level);
duob_mode = db_mode(strrep(dataTable(1,:).db_mode,'"',''));
% Load and Sync signal data from DB
[Tx_bits, Symbols, Scpe_cell, ~] = loadAndSyncSignalDataFromDb(dataTable(1,:), dsp_options);
% Preprocess signal
Scpe_sig = preprocessSignal(Scpe_cell{1}, Symbols, fsym);
% Show spectrum
Scpe_sig.spectrum("fignum",1,"displayname",'Rx')
meta = struct();
meta.varnames = dataTable.Properties.VariableNames;
for k = 1:numel(meta.varnames)
v = meta.varnames{k};
col = dataTable.(v);
if isnumeric(col) || islogical(col)
meta.(v) = col;
elseif isstring(col)
meta.(v) = cellstr(col);
elseif iscellstr(col)
meta.(v) = col;
else
error("Unsupported table column type: %s", class(col))
end
end
exp_data.metadata = meta;
exp_data = struct();
exp_data.metadata = dataTable;
exp_data.tx_bits = Tx_bits.signal;
exp_data.tx_signal = Symbols.signal;
exp_data.rx_signal_2sps = Scpe_sig.signal;
fname = dataTable(1,:).rx_raw_path;
[~, filename, ext] = fileparts(fname);
filename = strrep(filename,"_raw_signal","");
filename = filename + ext;
savepath = fullfile('F:\2024\sioe_labor\export_skuehl\',filename);
save(savepath,'exp_data','-v7.3');
end
%% simple FFE
mu_ffe = [0.0001, 0.0008, 0.001];
mu_dfe = 0.0004;
ffe_order = [50, 0, 0];
eq_dfe = EQ("Ne",ffe_order,"Nb",[0,0,0],"training_length",4096,"training_loops",5,"dd_loops",5,"K",2,"DCmu",0.005,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",0);
ffe_results = ffe(eq_dfe,M,Scpe_sig,Symbols,Tx_bits,...
"precode_mode",duob_mode,...
'showAnalysis',0,...
"postFFE",[],...
"eth_style_symbol_mapping",0);
ffe_results.metrics.print("description",'FFE');
ffe_results.config.equalizer_structure = "ffe";
%% a) VNLE // b) concatenated VNLE + MLSE
pf_ncoeffs = 1;
ffe_order = [50, 5, 5];
dfe_order = [0,0,0];
eq_ = EQ("Ne",ffe_order,"Nb",dfe_order,"training_length",4096,"training_loops",5,"dd_loops",5,"K",2,"DCmu",0.005,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",0);
pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);
if duob_mode == db_mode.no_db && M == 6 %only for PAM-6 and no duobinary precoding, otherwise leads to false sequence estimation
trellexlusion = 1;
else
trellexlusion = 0;
end
%state_mode 3 -> stat lvl; state_mode 2 -> use target lvls
%scale_mode 2 -> mmse adaption
mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0).levels,'scale_mode',2,'trellis_exclusion',trellexlusion,'trellis_state_mode',2);
[vnle_results, mlse_results] = vnle_postfilter_mlse(eq_, pf_, mlse_, M, Scpe_sig, Symbols, Tx_bits, ...
"precode_mode", duob_mode,...
'showAnalysis', 0, ...
"postFFE", [],...
"eth_style_symbol_mapping", 0);
vnle_results.metrics.print("description",'VNLE');
mlse_results.metrics.print("description",'VNLE + PF + MLSE');
%% Duobinary Equalization
if duob_mode == db_mode.no_db && M == 6 %only for PAM-6 and no duobinary precoding, otherwise leads to false sequence estimation
trellexlusion = 1;
else
trellexlusion = 0;
end
mlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,"trellis_states",PAMmapper(M,0).levels,'scale_mode',2,'trellis_exclusion',trellexlusion,'trellis_state_mode',3);
ffe_order = [50, 5, 5];
dfe_order = [0,0,0];
eq_ = EQ("Ne",ffe_order,"Nb",dfe_order,"training_length",4096,"training_loops",5,"dd_loops",5,"K",2,"DCmu",0.005,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1);
dbt_results = duobinary_target(eq_, mlse_db_, M, Scpe_sig, Symbols, Tx_bits, ...
"precode_mode", duob_mode, ...
'showAnalysis', 0,...
"postFFE", []);
dbt_results.metrics.print("description",'Duobinary EQ');
%% Ml based Viterbi
%ML-based MLSE (L=2)
mu_ml = 0.01; training_epochs = 100;
ml_mlse_equalizer = ML_MLSE("epochs_tr",training_epochs,"epochs_dd",1, ...
"len_tr",length(Scpe_sig),"mu_dd",mu_ml,"mu_tr",mu_ml,"order",11,"sps",2, ...
"traceback_depth",128,"L",1,"delta",4,"adaptive_mu",0);
[ml_mlse_results] = ml_mlse(ml_mlse_equalizer, M, Scpe_sig, Symbols, Tx_bits,"precode_mode",duob_mode);
ml_mlse_results.metrics.print("description",'ML pre Eq. + Viterbi')