Merge branch 'main' of cau-git.rz.uni-kiel.de:nt/mitarbeiter/silas/imdd_simulation
This commit is contained in:
@@ -1,29 +1,33 @@
|
||||
|
||||
close all;
|
||||
|
||||
if 1
|
||||
|
||||
uloops = struct;
|
||||
uloops.precomp = [1];
|
||||
uloops.precomp = [0];
|
||||
uloops.bitrate = [300].*1e9; %[300,330,360,390,420,450,480] [224,336,360,390,420,448] for MPI
|
||||
% uloops.laser_wavelength = [1293,1297.5,1302,1306.5,1310,1313.4,1318,1322.7,1327.4];
|
||||
uloops.laser_wavelength = [1293];
|
||||
uloops.M = [4];
|
||||
uloops.link_length = [0:2:10]; % 1,2,3,5,6,8,10
|
||||
uloops.link_length = 1;
|
||||
% uloops.link_length = [0:2:10]; % 1,2,3,5,6,8,10
|
||||
uloops.alpha = [0];
|
||||
|
||||
uloops.duob_mode = db_mode.db_precoded;
|
||||
uloops.decoding_mode = "memoryless";
|
||||
|
||||
wh = DataStorage(uloops);
|
||||
wh.addStorage("ber");
|
||||
|
||||
|
||||
wh = submit_handle(@imdd_model,wh,"parallel",0);
|
||||
|
||||
|
||||
end
|
||||
|
||||
%%
|
||||
figure
|
||||
hold on
|
||||
for alpha = uloops.alpha
|
||||
a=wh.getStoValue('ber',1, [300].*1e9 , 1293, 4, uloops.link_length,alpha);
|
||||
ffe = cellfun(@(x) x.ffe_results.metrics.BER, a);
|
||||
a=wh.getStoValue('ber',1, [300].*1e9 , 1293, 4, uloops.link_length,alpha,uloops.duob_mode,uloops.decoding_mode);
|
||||
% ffe = cellfun(@(x) x.ffe_results.metrics.BER, a);
|
||||
ffe = cellfun(@(x) x.dbt_results.metrics.BER, a);
|
||||
plot(uloops.link_length,ffe,'DisplayName',sprintf('Alpha: %d',alpha),'LineStyle','-','HandleVisibility','on');
|
||||
end
|
||||
|
||||
@@ -37,20 +41,20 @@ ylabel('BER');
|
||||
|
||||
|
||||
|
||||
%
|
||||
%
|
||||
% wh_ana = wh_master;
|
||||
%
|
||||
%
|
||||
% cols = cbrewer2('Paired',8);
|
||||
%
|
||||
%
|
||||
% figure()
|
||||
%
|
||||
%
|
||||
% for precomp = [0,1]
|
||||
% wavelength=uloops.laser_wavelength;
|
||||
% for m = [6]
|
||||
%
|
||||
%
|
||||
% baudrate = wh_ana.parameter.bitrate.values;
|
||||
%
|
||||
%
|
||||
%
|
||||
%
|
||||
% %VNLE
|
||||
% precode = 1;
|
||||
% a = wh_ana.getStoValue('ber',precomp, precode, baudrate , wavelength, m, uloops.link_length);
|
||||
@@ -59,7 +63,7 @@ ylabel('BER');
|
||||
% ber_mlse_pc = cellfun(@(x) x.vnle_pf_package{1,1}.ber_mlse, a);
|
||||
% %DB
|
||||
% ber_dbtgt_pc = cellfun(@(x) x.dbtgt_package{1,1}.ber, a);
|
||||
%
|
||||
%
|
||||
% precode = 0;
|
||||
% a = wh_ana.getStoValue('ber',precomp, precode, baudrate , wavelength, m, uloops.link_length);
|
||||
% ber_vnle = cellfun(@(x) x.vnle_pf_package{1,1}.ber_vnle, a);
|
||||
@@ -67,16 +71,16 @@ ylabel('BER');
|
||||
% ber_mlse = cellfun(@(x) x.vnle_pf_package{1,1}.ber_mlse, a);
|
||||
% %DB
|
||||
% ber_dbtgt = cellfun(@(x) x.dbtgt_package{1,1}.ber, a);
|
||||
%
|
||||
%
|
||||
% if precomp
|
||||
% legndname1 = ['Pre-Emphasis'];
|
||||
% else
|
||||
% legndname1 = ['No Pre-Emphasis'];
|
||||
% end
|
||||
%
|
||||
%
|
||||
%
|
||||
%
|
||||
% baudrate = floor( uloops.bitrate.*1e-9 ./log2(m) ) .* 2.5 .* 1e9;
|
||||
%
|
||||
%
|
||||
% subplot(1,3,1)
|
||||
% hold on
|
||||
% title(sprintf('%d km | %d nm | PAM %d',uloops.link_length,wavelength,m));
|
||||
@@ -92,9 +96,9 @@ ylabel('BER');
|
||||
% beautifyBERplot()
|
||||
% xlabel('Bit Rate in Gbps');
|
||||
% ylabel('BER');
|
||||
%
|
||||
%
|
||||
%
|
||||
%
|
||||
%
|
||||
%
|
||||
% subplot(1,3,2)
|
||||
% hold on
|
||||
% % title(sprintf('%d km | %d nm | PAM %d',uloops.link_length,wavelength,m));
|
||||
@@ -110,8 +114,8 @@ ylabel('BER');
|
||||
% beautifyBERplot()
|
||||
% xlabel('Bit Rate in Gbps');
|
||||
% ylabel('BER');
|
||||
%
|
||||
%
|
||||
%
|
||||
%
|
||||
% subplot(1,3,3)
|
||||
% hold on
|
||||
% % title(sprintf('%d km | %d nm | PAM %d',uloops.link_length,wavelength,m));
|
||||
@@ -182,44 +186,44 @@ ylabel('BER');
|
||||
% end
|
||||
|
||||
|
||||
%
|
||||
%
|
||||
% m = 6;
|
||||
% ir = [2,2.5,3];
|
||||
% cols = linspecer(6);
|
||||
% baudrate_gather = [];
|
||||
% for i = 1:3
|
||||
% m = uloops.M(i);
|
||||
%
|
||||
% %%% GET VNLE VALS
|
||||
%
|
||||
% %%% GET VNLE VALS
|
||||
% precode = 0;
|
||||
% precomp = 1;
|
||||
% a = wh_master.getStoValue('ber',precomp, precode, uloops.bitrate , uloops.laser_wavelength, m, uloops.link_length);
|
||||
% ber_vnle(i,:) = cellfun(@(x) x.vnle_pf_package{1,1}.ber_vnle, a);
|
||||
%
|
||||
% %%% GET DB VALS
|
||||
%
|
||||
% %%% GET DB VALS
|
||||
% precode = 1;
|
||||
% precomp = 0;
|
||||
% a = wh_master.getStoValue('ber',precomp, precode, uloops.bitrate , uloops.laser_wavelength, m, uloops.link_length);
|
||||
% ber_db(i,:) = cellfun(@(x) x.dbtgt_package{1,1}.ber, a);
|
||||
%
|
||||
% %%% GET MLSE VALS
|
||||
%
|
||||
% %%% GET MLSE VALS
|
||||
% precode = 0;
|
||||
% precomp = 0;
|
||||
% a = wh_master.getStoValue('ber',precomp, precode, uloops.bitrate , uloops.laser_wavelength, m, uloops.link_length);
|
||||
% ber_mlse(i,:) = cellfun(@(x) x.vnle_pf_package{1,1}.ber_mlse, a);
|
||||
%
|
||||
%
|
||||
% inf_rate_pam(i,:) = cellfun(@(x) x.vnle_pf_package{1,1}.air, a);
|
||||
% inf_rate_pam(i,:) = inf_rate_pam(i,:)./log2(m);
|
||||
%
|
||||
%
|
||||
% bitrate = floor( uloops.bitrate.*1e-9 ./log2(m) ) .* ir(i) .* 1e9;
|
||||
% baudrate = floor( uloops.bitrate.*1e-9 ./log2(m) ) .* 1e9;
|
||||
% baudrate_gather = union(baudrate_gather,baudrate);
|
||||
% baudrate_ticks = 100:20:240;
|
||||
% bitrate_ticks = 300:30:480;
|
||||
%
|
||||
%
|
||||
% tp = TransmissionPerformance;
|
||||
% netRatesVNLE = tp.calculateNetRate(bitrate, 'NGMI', inf_rate_pam(i,:), 'BER', ber_vnle(i,:));
|
||||
%
|
||||
%
|
||||
% %%% NGMI
|
||||
% figure(12)
|
||||
% hold on
|
||||
@@ -230,8 +234,8 @@ ylabel('BER');
|
||||
% beautifyBERplot()
|
||||
% xticks(baudrate_ticks);
|
||||
% xlim([min(baudrate_ticks) max(baudrate_ticks)]);
|
||||
%
|
||||
%
|
||||
%
|
||||
%
|
||||
% %%% AIR
|
||||
% figure(14)
|
||||
% hold on
|
||||
@@ -242,7 +246,7 @@ ylabel('BER');
|
||||
% beautifyBERplot()
|
||||
% xticks(baudrate_ticks);
|
||||
% xlim([min(baudrate_ticks) max(baudrate_ticks)]);
|
||||
%
|
||||
%
|
||||
% %%% RATES
|
||||
% figure(16)
|
||||
% hold on
|
||||
@@ -261,7 +265,7 @@ ylabel('BER');
|
||||
% ylabel('Net Bitrate in Gbps')
|
||||
% beautifyBERplot()
|
||||
% ylim([250 410])
|
||||
%
|
||||
%
|
||||
% %%% CODE OVERHEAD IN %
|
||||
% figure(18)
|
||||
% hold on
|
||||
@@ -274,7 +278,7 @@ ylabel('BER');
|
||||
% xlabel('Baud rate in GBd');
|
||||
% ylabel('FEC Overhead in %')
|
||||
% beautifyBERplot()
|
||||
%
|
||||
%
|
||||
% %%% CLASSIC BER
|
||||
% figure(22)
|
||||
% subplot(1,4,i)
|
||||
@@ -297,19 +301,19 @@ ylabel('BER');
|
||||
% subplot(1,4,4)
|
||||
% hold on
|
||||
% if m == 4
|
||||
%
|
||||
%
|
||||
% plot(bitrate*1e-9,ber_db(i,:),'DisplayName',sprintf('Diff. Code + DB tgt.'),'Color',cols(i,:),'LineStyle','--','HandleVisibility','on','Marker','diamond');
|
||||
%
|
||||
%
|
||||
% elseif m == 6
|
||||
%
|
||||
%
|
||||
% plot(bitrate*1e-9,ber_vnle(i,:),'DisplayName',sprintf('VNLE + PF + MLSE'),'Color',cols(i,:),'LineStyle','-','HandleVisibility','on','Marker','o');
|
||||
% % plot(bitrate*1e-9,ber_mlse(i,:),'DisplayName',sprintf('MLSE',m),'Color',cols(i,:),'LineStyle',':','HandleVisibility',hv,'Marker','square');
|
||||
%
|
||||
%
|
||||
% elseif m ==8
|
||||
%
|
||||
%
|
||||
% plot(bitrate*1e-9,ber_vnle(i,:),'DisplayName',sprintf('Tx precomp + VNLE'),'Color',cols(i,:),'LineStyle','-','HandleVisibility','on','Marker','o');
|
||||
% % plot(bitrate*1e-9,ber_mlse(i,:),'DisplayName',sprintf('MLSE',m),'Color',cols(i,:),'LineStyle',':','HandleVisibility',hv,'Marker','square');
|
||||
%
|
||||
%
|
||||
% end
|
||||
% yline(4.85e-3,'HandleVisibility','off');
|
||||
% yline(2e-2,'HandleVisibility','off');
|
||||
@@ -320,12 +324,12 @@ ylabel('BER');
|
||||
% % ylabel('BER')
|
||||
% beautifyBERplot()
|
||||
% set(gca, 'YScale', 'log');
|
||||
%
|
||||
%
|
||||
%
|
||||
%
|
||||
% end
|
||||
%
|
||||
%
|
||||
%
|
||||
%
|
||||
%
|
||||
%
|
||||
% figure()
|
||||
% title(sprintf('%d km | 1310 nm | PAM %d | VNLE',uloops.link_length,uloops.M));
|
||||
% hold on
|
||||
|
||||
@@ -62,7 +62,7 @@ mu_dfe = 0.0004;
|
||||
|
||||
dfe_ = sum(dfe_order)>0;
|
||||
|
||||
duob_mode = db_mode.no_db;
|
||||
% duob_mode = db_mode.no_db;
|
||||
|
||||
%%% change specific parameter if given in varargin
|
||||
% Parse optional input arguments
|
||||
@@ -77,7 +77,7 @@ if ~isempty(varargin)
|
||||
else
|
||||
eval([fields{i}, ' = ', 'var_s.(fields{',num2str(i),'})' , ';']);
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
else
|
||||
error('Optional variables should be passed as a struct.');
|
||||
@@ -132,7 +132,7 @@ El_sig = El_sig .* scaling;
|
||||
%%%%% MODULATE E/O CONVERSION %%%%%%
|
||||
[Opt_sig] = EML("mode",eml_mode.im_cosinus,"power",3,"fsimu",El_sig.fs,"lambda",laser_wavelength,"bias",vbias,"u_pi",u_pi,"linewidth",laser_linewidth,"randomkey",random_key+1,"alpha",alpha).process(El_sig);
|
||||
|
||||
Opt_sig.spectrum("displayname",'Opt Spectrum','fignum',10,'normalizeTo0dB',1);
|
||||
% Opt_sig.spectrum("displayname",'Opt Spectrum','fignum',10,'normalizeTo0dB',1);
|
||||
|
||||
Opt_sig = Fiber("fsimu",Opt_sig.fs,"fiber_length",link_length,"alpha",0.3,"D",0,"lambda0",1310,"gamma",0,"Dslope",0.07).process(Opt_sig);
|
||||
|
||||
@@ -165,7 +165,7 @@ Scpe_sig = Scpe_sig.resample("fs_out",2*fsym);
|
||||
Scpe_sig.signal = Scpe_sig.signal(1:2*length(Symbols));
|
||||
|
||||
%%%%%% Sync Rx signal with reference %%%%%%
|
||||
[Scpe_sig,~] = Scpe_sig.tsynch("reference",Symbols,"fs_ref",fsym,"debug_plots",1);
|
||||
[Scpe_sig,~] = Scpe_sig.tsynch("reference",Symbols,"fs_ref",fsym,"debug_plots",0);
|
||||
|
||||
Scpe_sig = Filter('filtdegree',4,"f_cutoff",Symbols.fs.*0.5,"fs",Scpe_sig.fs,"filterType",filtertypes.gaussian,"active",true).process(Scpe_sig);
|
||||
|
||||
@@ -173,60 +173,67 @@ Scpe_sig = Scpe_sig - mean(Scpe_sig.signal);
|
||||
|
||||
%%% EQUALIZING
|
||||
|
||||
|
||||
% -------------------- FFE --------------------
|
||||
ffe_order = [50, 0, 0];
|
||||
eq_ffe = EQ("Ne",ffe_order,"Nb",[0,0,0], ...
|
||||
"training_length",len_tr,"training_loops",5,"dd_loops",5, ...
|
||||
"K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...
|
||||
"FFEmu",0,"plotfinal",0,"ideal_dfe",0);
|
||||
|
||||
output.ffe_results = ffe(eq_ffe,M,Scpe_sig,Symbols,Tx_bits, ...
|
||||
"precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...
|
||||
"eth_style_symbol_mapping",0);
|
||||
|
||||
output.ffe_results.metrics.print
|
||||
|
||||
% -------------------- DFE --------------------
|
||||
eq_dfe = EQ("Ne",ffe_order,"Nb",[2,0,0], ...
|
||||
"training_length",len_tr,"training_loops",5,"dd_loops",5, ...
|
||||
"K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...
|
||||
"FFEmu",0,"plotfinal",0,"ideal_dfe",0);
|
||||
|
||||
output.dfe_results = ffe(eq_dfe,M,Scpe_sig,Symbols,Tx_bits, ...
|
||||
"precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...
|
||||
"eth_style_symbol_mapping",0);
|
||||
|
||||
output.dfe_results.metrics.print("description",'DFE');
|
||||
|
||||
|
||||
% -------------------- VNLE + MLSE --------------------
|
||||
pf_ncoeffs = 1;
|
||||
ffe_order3 = [50, 5, 5];
|
||||
eq_v = EQ("Ne",ffe_order3,"Nb",dfe_order, ...
|
||||
"training_length",len_tr,"training_loops",5,"dd_loops",5, ...
|
||||
"K",2,"DCmu",mu_dc,"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);
|
||||
|
||||
[output.vnle_results, output.mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Scpe_sig, Symbols, Tx_bits, ...
|
||||
"precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", [], "eth_style_symbol_mapping", 0);
|
||||
|
||||
|
||||
% -------------------- DB target --------------------
|
||||
mlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,'trellis_states',PAMmapper(M,0).levels);
|
||||
ffe_order = [50, 5, 5];
|
||||
eq_ = EQ("Ne",ffe_order,"Nb",dfe_order,"training_length",len_tr,"training_loops",5,"dd_loops",5, ...
|
||||
"K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1);
|
||||
output.dbt_results = duobinary_target(eq_,mlse_db_, M, Scpe_sig, Symbols, Tx_bits, ...
|
||||
"precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", []);
|
||||
|
||||
output.dbt_results.metrics.print("description",'Duobinary');
|
||||
|
||||
|
||||
disp('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ')
|
||||
fprintf('\n')
|
||||
|
||||
if 0
|
||||
% -------------------- FFE --------------------
|
||||
ffe_order = [50, 0, 0];
|
||||
eq_ffe = EQ("Ne",ffe_order,"Nb",[0,0,0], ...
|
||||
"training_length",len_tr,"training_loops",5,"dd_loops",5, ...
|
||||
"K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...
|
||||
"FFEmu",0,"plotfinal",0,"ideal_dfe",0);
|
||||
|
||||
% % -------------------- FFE --------------------
|
||||
% ffe_order = [50, 0, 0];
|
||||
% eq_ffe = EQ("Ne",ffe_order,"Nb",[0,0,0], ...
|
||||
% "training_length",len_tr,"training_loops",5,"dd_loops",5, ...
|
||||
% "K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...
|
||||
% "FFEmu",0,"plotfinal",0,"ideal_dfe",0);
|
||||
%
|
||||
% output.ffe_results = ffe(eq_ffe,M,Scpe_sig,Symbols,Tx_bits, ...
|
||||
% "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...
|
||||
% "eth_style_symbol_mapping",0);
|
||||
%
|
||||
% output.ffe_results.metrics.print
|
||||
|
||||
% % -------------------- DFE --------------------
|
||||
% eq_dfe = EQ("Ne",ffe_order,"Nb",[2,0,0], ...
|
||||
% "training_length",len_tr,"training_loops",5,"dd_loops",5, ...
|
||||
% "K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005, ...
|
||||
% "FFEmu",0,"plotfinal",0,"ideal_dfe",0);
|
||||
%
|
||||
% output.dfe_results = ffe(eq_dfe,M,Scpe_sig,Symbols,Tx_bits, ...
|
||||
% "precode_mode",duob_mode,'showAnalysis',0,"postFFE",[], ...
|
||||
% "eth_style_symbol_mapping",0);
|
||||
%
|
||||
% output.dfe_results.metrics.print("description",'DFE');
|
||||
|
||||
|
||||
% % -------------------- VNLE + MLSE --------------------
|
||||
% pf_ncoeffs = 1;
|
||||
% ffe_order3 = [200, 0, 0];
|
||||
% eq_v = EQ("Ne",ffe_order3,"Nb",dfe_order, ...
|
||||
% "training_length",len_tr,"training_loops",5,"dd_loops",5, ...
|
||||
% "K",2,"DCmu",mu_dc,"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);
|
||||
%
|
||||
% [output.vnle_results, output.mlse_results] = vnle_postfilter_mlse(eq_v, pf_, mlse_, M, Scpe_sig, Symbols, Tx_bits, ...
|
||||
% "precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", [], "eth_style_symbol_mapping", 0);
|
||||
|
||||
|
||||
% -------------------- DB target --------------------
|
||||
mlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,'trellis_states',PAMmapper(M,0).levels);
|
||||
ffe_order = [50, 0, 0];
|
||||
eq_ = EQ("Ne",ffe_order,"Nb",dfe_order,"training_length",len_tr,"training_loops",5,"dd_loops",5, ...
|
||||
"K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",0,"ideal_dfe",1);
|
||||
output.dbt_results = duobinary_target(eq_,mlse_db_, M, Scpe_sig, Symbols, Tx_bits, ...
|
||||
"precode_mode", duob_mode, 'showAnalysis', 0, "postFFE", [], "decoding_mode", decoding_mode);
|
||||
|
||||
output.dbt_results.metrics.print("description",'Duobinary');
|
||||
|
||||
|
||||
disp('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ')
|
||||
fprintf('\n')
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user