ber_ffe = []; ber_mlse = []; ber_dbtgt = []; ber_ml = []; mlse = 1; dbtgt = 0; duob_mode = db_mode.no_db; baudrates = [136:8:224].*1e9; for i = 1:length(baudrates) rop = -8; M = 4; [Rx_sig_2sps_v1, Symbols_v1, Tx_bits_v1] = standard_link_model("M",M,"fsym",baudrates(i),"rop",rop,"laser_linewidth",1310,"link_length_m",0,"random_key",1,"apply_pulsef",1); % [Rx_sig_2sps_v2, Symbols_v2, Tx_bits_v2] = standard_link_model("M",M,"fsym",200e9,"rop",rop,"laser_linewidth",1300,"link_length_m",0,"random_key",2); % [Rx_sig_2sps_v3, Symbols_v3, Tx_bits_v3] = standard_link_model("M",M,"fsym",200e9,"rop",rop,"laser_linewidth",1300,"link_length_m",0,"random_key",3); %% FFE + MLSE if mlse pf_ncoeffs = 1; ffe_order = [50, 0, 0]; mu_ffe = [0.0001, 0.0008, 0.001]; mu_dfe = 0.0004; eq_ = EQ("Ne",ffe_order,"Nb",[0,0,0],"training_length",2^13,"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); pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0).levels,'scale_mode',2,'trellis_exclusion',0,'trellis_state_mode',2,'debug',0,'DIR',pf_.coefficients); [ffe_results, mlse_results] = vnle_postfilter_mlse(eq_, pf_, mlse_, M, Rx_sig_2sps_v1, Symbols_v1, Tx_bits_v1, ... "precode_mode", duob_mode,... 'showAnalysis', 0, ... "postFFE", [],... "eth_style_symbol_mapping", 0); ber_ffe(i) = ffe_results.metrics.BER; ber_mlse(i) = mlse_results.metrics.BER; fprintf('BER FFE: %.2e \n',ber_ffe(i)); fprintf('BER MLSE: %.2e \n',ber_mlse(i)); end %% FFE DB tgt. + MLSE if dbtgt mlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,"trellis_states",PAMmapper(M,0).levels,'scale_mode',2,'trellis_exclusion',0,'trellis_state_mode',3); ffe_order = [50, 0, 0]; mu_ffe = [0.0001, 0.0008, 0.001]; mu_dfe = 0.0004; eq_ = EQ("Ne",ffe_order,"Nb",[0,0,0],"training_length",2^13,"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, Rx_sig_2sps_v1, Symbols_v1, Tx_bits_v1, ... "precode_mode", duob_mode, ... 'showAnalysis', 0,... "postFFE", []); ber_dbtgt(i) = dbt_results.metrics.BER; end %% mu_lms = 0.0005; pf_ncoeffs = 2; eq_ = FFE("epochs_tr",5,"epochs_dd",5,"len_tr",2^13,"mu_dd",mu_lms,"mu_tr",mu_lms,"order",50,"sps",2,"dd_mode",1,"adaption_technique","lms"); pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); % FFE [y_ffe, ffe_noise] = eq_.process(Rx_sig_2sps_v1, Symbols_v1); % Postfilter [y_white,whitened_noise] = pf_.process(y_ffe, ffe_noise); %% RUN ML-Based MLSE mu_lms = 0.15; ml_mlse_equalizer = ML_MLSE("epochs_tr",50,"epochs_dd",1,"len_tr",2^16,... "mu_dd",mu_lms,"mu_tr",mu_lms,"order",4,"sps",2,... "traceback_depth",128,"L",2,"delta",0); ml_mlse_equalizer.mu_tr = 0.005; ml_mlse_equalizer.epochs_tr = 2; ml_mlse_equalizer.epochs_dd = 1; [y_ml_mlse,~] = ml_mlse_equalizer.process(Rx_sig_2sps_v1,Symbols_v1); ml_mlse_bits = PAMmapper(M, 0, "eth_style", 0).demap(y_ml_mlse); [~, errors, ber_ml(i), errpos] = calc_ber(ml_mlse_bits.signal, Tx_bits_v1.signal, "skip_front", 10, "skip_end", 10, "returnErrorLocation", 1); fprintf('ML MLSE BER: %.2e \n',ber_ml(i)); % figure(11);hold on % plot(1:numel(ml_mlse_equalizer.ber),ml_mlse_equalizer.ber); % beautifyBERplot; % xlim([1,numel(ml_mlse_equalizer.ber)]) end %% figure(6); hold on; if mlse plot(baudrates,ber_ffe,'DisplayName','FFE'); plot(baudrates,ber_mlse,'DisplayName','MLSE'); end if dbtgt plot(baudrates,ber_dbtgt,'DisplayName','DB tgt'); end plot(baudrates,ber_ml,'DisplayName','ML-MLSE'); beautifyBERplot; legend