diff --git a/Classes/01_transmit/Pulseformer.m b/Classes/01_transmit/Pulseformer.m index 7b8347e..a6f531b 100644 --- a/Classes/01_transmit/Pulseformer.m +++ b/Classes/01_transmit/Pulseformer.m @@ -118,7 +118,7 @@ classdef Pulseformer % data_out = upfirdn(data_in,h,up,dn); % % %cut signal, which is longer due to fir filter -% st = round(up/dn*racos_len/2); %we need to cut y_out + st = round(up/dn*racos_len/2); %we need to cut y_out % en = round(st + (length(data_in)*up/dn) -1); % % data_out = data_out(st:en); diff --git a/MPI_offline_analysis/mpi_analysis_pam4.m b/MPI_offline_analysis/mpi_analysis_pam4.m new file mode 100644 index 0000000..bce1b23 --- /dev/null +++ b/MPI_offline_analysis/mpi_analysis_pam4.m @@ -0,0 +1,64 @@ + +clear; +col = linspecer(6); +% load dataset +simdata = load('/Users/silasoettinghaus/Documents/MATLAB/Labor_Datensatz_PAM4_MPI/pam4_10km_1km/pam4__loop_10_92Gbd_19092023_1508.mat'); +% get common variables of simulation loop + +fdac = simdata.saveStructTemp.common.f_DAC; +fadc = simdata.saveStructTemp.common.f_ADC; +fsym = simdata.saveStructTemp.common.f_sym; + +% 0) build RX Signal + +y_rx = Electricalsignal(simdata.saveStructTemp.dp_tsynch_out'); +y_rx.fs = 2.*fsym; + +% 0) build tx reference Signal for eq training +y_digimod = Electricalsignal(simdata.saveStructTemp.digi_mod_out'); +y_digimod.fs = fsym; + + +% 1) normlaize +y_rx = y_rx.normalize("mode","rms"); + + +% 2.1) equalize +eq = EQ("K",2,"plottrain",0,"plotfinal",0,... + "training_length",4096,"training_loops",3,... + "Ne",[50,9,3],"Nb",[2,0,0],... + "DCmu",0,"DDmu",[0.0004 0.0005 0.0005 0.0005 ],"DFEmu",0.005,"FFEmu",0.005,... + "dd_loops",3,"epsilon",[10 100 1000 ],"M",2,... + "thres",[0.005 0.0004 0.0005 ],"l1act",0,"delay",0,"rho",0.0005,"ideal_dfe",0,"DB_aim",0); + +eq2 = EQ_silas("Ne",[50,9,9],"Nb",[0,0,0],"trainlength",4096,"mu_dc_dd",0.05,"mu_dc_train",0.05,"mu_ffe_train",0.005,"mu_combined_dd",[0.0004 0.0005 0.0005 0.0005 ],"ddloops",3,"trainloops",3); + + +[Eq_out] = eq.process(y_rx,y_digimod); +[Eq_out2] = eq2.process(y_rx,y_digimod); + +figure() +scatter(1:length(y_rx.signal),y_rx.signal,4,'.','MarkerEdgeColor',col(2,:),'DisplayName','After EQ'); +hold on +%scatter(1:length(Eq_out.signal),Eq_out.signal,4,'.','MarkerEdgeColor',col(4,:),'DisplayName','After EQ'); +hold on +scatter(1:length(Eq_out2.signal),Eq_out2.signal,3,'.','MarkerEdgeColor',col(3,:),'DisplayName','After EQ'); + + +% 2.2) MPI reduction blocks + +% 3) digital demodulation +digimod = PAMmapper(2^simdata.saveStructTemp.common.M,0); + +d_hat = digimod.demap(Eq_out); +d_hat2 = digimod.demap(Eq_out2); +d_ = digimod.demap(Electricalsignal(simdata.saveStructTemp.digi_mod_out')); +d = simdata.saveStructTemp.prms_out; + +% 4) BER calculation +[totalbits,errors_bm,ber_dhat,loc] = calc_ber(d_hat.signal(1:end,:) ,d(1:end,:)',"skip",0,"returnErrorLocation",1); +[totalbits2,errors_bm2,ber_dhat2,loc] = calc_ber(d_hat2.signal(1:end,:) ,d(1:end,:)',"skip",0,"returnErrorLocation",1); + +ber_nodctap = mean(simdata.saveStructTemp.prms_compare_state.BER ); + +disp(['BER_new_eq1: ',num2str(ber_dhat),' BER_new_eq2: ',num2str(ber_dhat2),' BER_old: ',num2str(ber_nodctap)]); diff --git a/setup_simulation.m b/setup_simulation.m index 8e194d0..6528500 100644 --- a/setup_simulation.m +++ b/setup_simulation.m @@ -378,6 +378,6 @@ for lp = 1 hold off end -end +