dsp_options.storage_path = 'Z:\2024\sioe_labor\'; dsp_options.max_occurences = 1; db = DBHandler("dataBase", 'labor_highspeed', "type", 'mysql','server','134.245.243.254','password','silas','user','silas'); % 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')