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); fsym = dataTable.symbolrate; M = double(dataTable.pam_level); duob_mode = db_mode(strrep(dataTable.db_mode,'"','')); % Load and Sync signal data from DB [Tx_bits, Symbols, Scpe_cell, ~] = loadAndSyncSignalDataFromDb(dataTable, dsp_options); % Preprocess signal Scpe_sig = preprocessSignal(Scpe_cell{1}, Symbols, fsym); % Show spectrum Scpe_sig.spectrum("fignum",1,"displayname",'Rx') %% 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')