From 462cfa0ed1f40b810c532132edee524c293382b4 Mon Sep 17 00:00:00 2001 From: Silas Oettinghaus Date: Thu, 21 Sep 2023 16:25:20 +0200 Subject: [PATCH 1/2] Auto stash before checking out "HEAD" --- Classes/01_transmit/Pulseformer.m | 2 +- MPI_offline_analysis/mpi_analysis_pam4.m | 59 ++++++++++++++++++++++++ setup_simulation.m | 33 +++++++------ 3 files changed, 79 insertions(+), 15 deletions(-) create mode 100644 MPI_offline_analysis/mpi_analysis_pam4.m 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..445a700 --- /dev/null +++ b/MPI_offline_analysis/mpi_analysis_pam4.m @@ -0,0 +1,59 @@ + +clear; +col = linspecer(6); +% load dataset +simdata = load('/Users/silasoettinghaus/Documents/MATLAB/Labor_Datensatz_PAM4_MPI/pam4_10km_1km/pam4__loop_3_56Gbd_19092023_1459.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.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,3],"Nb",[2,0,0],"trainlength",4096,"mu_dc_dd",0,"mu_dc_train",0,"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(Eq_out.signal),Eq_out.signal,4,'.','MarkerEdgeColor',col(4,:),'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 2218f6f..2bb4752 100644 --- a/setup_simulation.m +++ b/setup_simulation.m @@ -4,13 +4,15 @@ lw = [0.1e6 1e6 10e6]; for lp = 1 - dc_mu = 0.05; +sir = -20;%sir_loop(lp); sir = sir_loop(1); rng(lp); - %% Set Simulation Variables +O = 12; %order of prbs +N = 2^(O-1); %length of prbs +[~,seed] = prbs(O,1); %initialize first seed of prbs sir = sir; @@ -77,7 +79,7 @@ for lp = 1 eq = EQ("K",2,"plottrain",0,"plotfinal",0,... "training_length",4096,"training_loops",2,... "Ne",[50,5,3],"Nb",[3,2,2],... - "DCmu",dc_mu,"DDmu",[0.0004 0.0005 0.0006 0.0007 ],"DFEmu",0.005,"FFEmu",0.005,... + "DCmu",0.005,"DDmu",[0.0004 0.0005 0.0006 0.0007 ],"DFEmu",0.005,"FFEmu",0.005,... "dd_loops",2,"epsilon",[10 100 1000 ],"M",2,... "thres",[0.005 0.004 0.0005 ],"l1act",0,"delay",0,"rho",0.0005,"ideal_dfe",0,"DB_aim",0); @@ -135,6 +137,9 @@ for lp = 1 disp(['SIR ',num2str(10*log10(X.power/R.power))]); +%% +X = opticatten.process(X); +% X = edfaamp.process(X); X = X+R; @@ -164,7 +169,7 @@ for lp = 1 % wl = 1000; % symbols % Eq_in.signal = Eq_in.signal - 1/wl .* movsum( Eq_in.signal,[wl/2,wl/2]); - [Eq_out] = eq2.process(Eq_in,reference); + [Eq_out] = eq.process(Eq_in,reference); %% MPI reduction DC removal wl = 1000; % symbols @@ -186,15 +191,15 @@ for lp = 1 wl = 100; % symbols smoothed = ( 1/wl .* movsum(e,[wl/2,wl/2]) ); - % remove interference - for level = 0:3 - yk_lvsm.signal(pre_decision_level_uni==level) = yk_lvsm.signal(pre_decision_level_uni==level) - smoothed(pre_decision_level_uni==level); - yk_lvlp.signal(pre_decision_level_uni==level) = yk_lvlp.signal(pre_decision_level_uni==level) - filtered(pre_decision_level_uni==level); - end - % - % figure(26);plot(1:length(error_log),error_log(:,end),"LineWidth",0.4);ylim([-0.8 0.8]);ylabel('$\epsilon$'),title(['Linewidth: ',num2str(laser_linewidth*1e-6), 'MHz']) - % - % figure(28);plot(1:length(e),e,"LineWidth",0.4);ylim([-0.8 0.8]); + %subplot(1,5,lp) + xax = 1:eq_out.length; + scatter(xax,eq_out.signal,4,'.','MarkerEdgeColor',col(6,:),'DisplayName','After EQ'); + xlim([1, xax(end)]); + ylim([-2 2]); + xlabel('Sampling Index') + ylabel('Amplitude') + legend +end @@ -315,6 +320,6 @@ for lp = 1 hold off end -end + From d77c45c95871e9560d58615894b09b8963d1c961 Mon Sep 17 00:00:00 2001 From: Silas Oettinghaus Date: Fri, 29 Sep 2023 08:15:34 +0200 Subject: [PATCH 2/2] Add offline analysis for Lab Data --- MPI_offline_analysis/mpi_analysis_pam4.m | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/MPI_offline_analysis/mpi_analysis_pam4.m b/MPI_offline_analysis/mpi_analysis_pam4.m index 445a700..bce1b23 100644 --- a/MPI_offline_analysis/mpi_analysis_pam4.m +++ b/MPI_offline_analysis/mpi_analysis_pam4.m @@ -2,7 +2,7 @@ clear; col = linspecer(6); % load dataset -simdata = load('/Users/silasoettinghaus/Documents/MATLAB/Labor_Datensatz_PAM4_MPI/pam4_10km_1km/pam4__loop_3_56Gbd_19092023_1459.mat'); +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; @@ -20,7 +20,7 @@ y_digimod.fs = fsym; % 1) normlaize -y_rx.normalize("mode","rms"); +y_rx = y_rx.normalize("mode","rms"); % 2.1) equalize @@ -31,14 +31,19 @@ eq = EQ("K",2,"plottrain",0,"plotfinal",0,... "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,3],"Nb",[2,0,0],"trainlength",4096,"mu_dc_dd",0,"mu_dc_train",0,"mu_ffe_train",0.005,"mu_combined_dd",[0.0004 0.0005 0.0005 0.0005 ],"ddloops",3,"trainloops",3); +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(Eq_out.signal),Eq_out.signal,4,'.','MarkerEdgeColor',col(4,:),'DisplayName','After EQ'); +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