Dies und Das (MPI revisit)

This commit is contained in:
Silas Oettinghaus
2026-06-21 23:11:13 +02:00
parent 5c2e27687d
commit 3603fd7853
18 changed files with 656 additions and 209 deletions

View File

@@ -21,12 +21,23 @@ if dsp_options.mode == "load_run_id"
"server", dsp_options.server,...
"user", dsp_options.user, "password", dsp_options.password);
% db = DBHandler("dataBase",'labor',"type","mysql","user","silas","password","silas","server","192.168.178.192");
elseif experiment == "mpi_ecoc_2025"
dsp_options.database_type = 'mysql';
dsp_options.dataBase = 'labor';
dsp_options.storage_path = 'Z:\2025\ECOC Silas\ecoc_2025\';
db = DBHandler("dataBase", [dsp_options.dataBase], "type", dsp_options.database_type);
dsp_options.dataBase = 'labor';
dsp_options.storage_path = 'W:\labdata\ECOC Silas\ECOC Silas\ecoc_2025\';
dsp_options.server = "192.168.178.192";% "134.245.243.254";
dsp_options.user = "silas";
dsp_options.password = "silas";
db = DBHandler("dataBase", [dsp_options.dataBase],...
"type", dsp_options.database_type,...
"server", dsp_options.server,...
"user", dsp_options.user, "password", dsp_options.password);
% db = DBHandler("dataBase",'labor',"type","mysql","user","silas","password","silas","server","192.168.178.192");
end

View File

@@ -0,0 +1,146 @@
% Minimal IMDD model for investigating FFE noise enhancement.
% Parameters mirror the current IMDD_base_system/imdd_it.m,
% IMDD_base_system/imdd_model.m, and the FFE branch in dsp_scope_signal.m.
clearvars;
close all;
%% Sweep parameters from imdd_it.m
fsym_values = 172e9;%(152:16:200).*1e9;
precomp = 0;
laser_wavelength = 1310;
M = 4;
link_length = 2;
channel_alpha = 0.5;
duob_mode = db_mode.db_precoded;
decoding_mode = db_decoder.sequencedetection;
channel_mode = channel_model.physical;
channel_snr_dB = 20;
rop = 0;
%% Inner model parameters from imdd_model.m
bitrate = [];
apply_pulsef = 0;
fdac = 256e9;
fadc = 256e9;
random_key = 1;
rcalpha = 0.05;
kover = 16;
vbias_rel = 0.5;
u_pi = 3;
vbias = -vbias_rel*u_pi;
laser_linewidth = 0;
eml_alpha = 0;
len_tr = 4096*2;
pf_ncoeffs = 1;
mu_dc = 0.005;
nRates = numel(fsym_values);
eq_names = ["FFE","VNLE"];
nEqs = numel(eq_names);
emptyResult = struct("fsym",[],"ROP",[],"equalizer",[],"BER",[],"SNR",[],"numBitErr",[], ...
"eq_noise",[],"eq_signal_sd",[],"eq",[],"Rx_sig",[],"Tx_sig",[],"Tx_symbols",[]);
results = repmat(emptyResult,nRates,nEqs);
cols = flip(cbrewer2('RdYlBu',nRates+4));
midIdx = floor(size(cols,1)/2) + (-1:2);
cols(midIdx,:) = [];
for i = 1:numel(fsym_values)
fsym = fsym_values(i);
fprintf("Running %.0f GBd (%d/%d)\n", fsym*1e-9, i, numel(fsym_values));
if isempty(bitrate)
bitrateCurrent = fsym * log2(M);
end
Pform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rc","pulselength",18,"alpha",rcalpha);
[Digi_sig, Symbols, Bits] = PAMsource( ...
"fsym",fsym,"M",M,"order",18,"useprbs",0, ...
"fs_out",fdac, ...
"applyclipping",0,"clipfactor",1.5, ...
"applypulseform",apply_pulsef,"pulseformer",Pform, ...
"randkey",random_key, ...
"duobinary_mode",duob_mode, ...
"mrds_code",0,"mrds_blocklength",512).process();
rateResults = repmat(emptyResult,nEqs);
Tx_sig = Digi_sig;
El_sig = M8199B("kover",kover).process(Digi_sig);
tx_bwl = 85e9;
El_sig = Filter("filtdegree",4,"f_cutoff",tx_bwl,"fs",fdac*kover, ...
"filterType",filtertypes.bessel_inp,"active",true).process(El_sig);
El_sig = El_sig.normalize("mode","oneone");
scaling = 0.7*(u_pi/2-abs(vbias-u_pi/2));
El_sig = El_sig .* scaling;
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",eml_alpha).process(El_sig);
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);
Rx_sig = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power", ...
"amplification_db",rop).process(Opt_sig);
Rx_sig = Photodiode("fsimu",fdac*kover,"dark_current",2e-08, ...
"responsivity",0.6,"temperature",20,"nep",1.8e-11).process(Rx_sig);
rx_bwl = 90e9;
Rx_sig = Filter("filtdegree",4,"f_cutoff",rx_bwl,"fs",fdac*kover, ...
"filterType",filtertypes.butterworth,"active",true).process(Rx_sig);
Lp_scpe = Filter("filtdegree",4,"f_cutoff",110e9,"fs",fadc, ...
"filterType",filtertypes.butterworth,"active",true);
Rx_sig = Scope("fsimu",fdac*kover,"fadc",fadc, ...
"delay",0,"fixed_delay",0,"filtertype",filtertypes.butterworth, ...
"samplingdelay",0,"rand_samplingdelay",0,"freq_offset",0, ...
"samp_jitter",0,"adcresolution",8,"quantbuffer",0.1, ...
"block_dc",1,"lpf_active",1,"H_lpf",Lp_scpe).process(Rx_sig);
txPulseformer = [];
if apply_pulsef
txPulseformer = Pform;
end
Scpe_sig = preprocessSignal(Rx_sig, Symbols, fsym, ...
"mode","auto", ...
"tx_pulseformer",txPulseformer, ...
"debug_plots",0);
Scpe_sig.signal = Scpe_sig.signal(1:2*Symbols.length);
Scpe_sig.signal = real(Scpe_sig.signal);
%%
% -------------------- VNLE + MLSE --------------------
pf_ncoeffs = 1;
ffe_order3 = [50, 0, 0];
eq_ = FFE("epochs_tr",5,"epochs_dd",5,"len_tr",len_tr, ...
"mu_dd",1e-3,"mu_tr",0.4,"order",50, ...
"sps",2,"decide",0,"optmize_mus",0,"dd_mode",1, ...
"adaption_technique","nlms","mu_dc",1e-3);
pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1);
mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0).levels);
[vnle_results, mlse_results] = vnle_postfilter_mlse(eq_, pf_, mlse_, M, Scpe_sig, Symbols, Bits, ...
"precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", 0);
end

View File

@@ -0,0 +1,241 @@
%%% Run parameters
% TX
M = 4;
m = floor(log2(M)*10)/10;
fsym = 160e9;
apply_pulsef = 0;
fdac = 256e9;
fadc = 256e9;
random_key = 1;
rcalpha = 0.05;
kover = 16;
vbias_rel = 0.5;
u_pi = 3.2;
vbias = -vbias_rel*u_pi;
laser_wavelength = 1310;
laser_linewidth = 0;
eml_alpha = 0;
% Channel
link_length = 0;
vnle_order1 = 50;
vnle_order2 = 0;
vnle_order3 = 0;
vnle_order=[vnle_order1,vnle_order2,vnle_order3];
dfe_order = [0 0 0];
alpha = 0;
len_tr = 4096*2;
mu_ffe1 = 0.0001;
mu_ffe2 = 0.0008;
mu_ffe3 = 0.001;
mu_dc = 0.005;
% mu_dc = 0;
mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3];
mu_dfe = 0.0004;
dfe_ = sum(dfe_order)>0;
duob_mode = db_mode.no_db;
cols = linspecer(6);
rop = -6;
bwl = 0.5:0.1:1.5;
nonlin_mod = 0.5:0.025:0.7;
fsym = ones(size(nonlin_mod)).*fsym;
ffe_results = {};
mlse_results_lin= {};
vnle_results= {};
mlse_results_nonlin= {};
mlse_results_nonlin_states= {};
g_eye = GifWriter('Name','eye','Parallel',true);
g_mod = GifWriter('Name','modulator','Parallel',true);
for r = 1:length(nonlin_mod)
Pform = Pulseformer("fsym",fsym(r),"fdac",4*fsym(r),"pulse","rc","pulselength",16,"alpha",rcalpha);
apply_pulsef = 0;
[Digi_sig,Symbols,Tx_bits] = PAMsource(...
"fsym",fsym(r),"M",M,"order",18,"useprbs",0,...
"fs_out",fdac,...
"applyclipping",0,"clipfactor",1.5,...
"applypulseform",apply_pulsef,"pulseformer",Pform,...
"randkey",random_key,...
"mrds_code",0,"mrds_blocklength",512,"duobinary_mode",duob_mode).process();
% El_sig = AWG("fdac",fdac,"f_cutoff",fsym(r),"lpf_active",0,"kover",kover,"bit_resolution",12,"upsampling_method","samplehold","precomp_sinc_rolloff",0).process(Digi_sig);
El_sig = M8199B("kover",kover).process(Digi_sig);
% AWG("fdac",fdac,"f_cutoff",fsym(r),"lpf_active",0,"kover",kover,"bit_resolution",12,"upsampling_method","samplehold","precomp_sinc_rolloff",0).process(Digi_sig);
%%%%% Low-pass el. components %%%%%%
tx_bwl = 85e9;
El_sig = Filter("filtdegree",4,"f_cutoff",tx_bwl,"fs",fdac*kover, ...
"filterType",filtertypes.bessel_inp,"active",true).process(El_sig);
%%%%% Electrical Driver Amplifier %%%%%%
El_sig = El_sig.normalize("mode","oneone");
% El_sig = El_sig.setPower(1,"dBm");
% figure;histogram(El_sig.signal);
%%%%% MODULATE E/O CONVERSION %%%%%
% scaling = nonlin_mod(r)*(u_pi/2-abs(vbias-u_pi/2));
% El_sig = El_sig .* scaling;
vbias = -nonlin_mod(r)*u_pi;
[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",eml_alpha).process(El_sig);
if 1
figure(15);
hold on
scatter(El_sig.signal(1:100000)+vbias,(abs(Opt_sig.signal(1:100000)).^2)*1e3,0.1,'.','DisplayName','Modulator TF')
xlabel('Input in V')
ylabel('abs(Eopt)2 in mW','Interpreter','latex')
ylim([0 2]);
xlim([-3 0]);
g_mod.addFrame(15, r);
Opt_sig.eye(fsym(r), M, "fignum", 103837);
g_eye.addFrame(103837, r);
end
%%%%%% Fiber %%%%%%
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);
%%%%%% ROP %%%%%%
Opt_sig = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power","amplification_db",rop).process(Opt_sig);
%%%%%% PD Square Law %%%%%%
PD_sig = Photodiode("fsimu",fdac*kover,"dark_current",2e-08,"responsivity",0.6,"temperature",20,"nep",1.8e-11).process(Opt_sig);
%%%%%% Low-pass RX (PD, El. Connectors and Scope %%%%%%
rx_bwl = 90e9;
PD_sig = Filter("filtdegree",4,"f_cutoff",rx_bwl,"fs",fdac*kover, ...
"filterType",filtertypes.butterworth,"active",true).process(PD_sig);
% %%%%%% Low-pass Scope %%%%%%
Lp_scpe = Filter("filtdegree",4,"f_cutoff",110e9,"fs",fadc, ...
"filterType",filtertypes.butterworth,"active",true);
%%%%%% Scope %%%%%%
Scpe_sig = Scope("fsimu",fdac*kover,"fadc",fadc,...
"delay",0,"fixed_delay",0,"filtertype",filtertypes.butterworth,...
"samplingdelay",0,"rand_samplingdelay",0,"freq_offset",0,"samp_jitter",0,...
"adcresolution",8,"quantbuffer",0.1,'block_dc',1,'lpf_active',1,'H_lpf',Lp_scpe).process(PD_sig);
txPulseformer = [];
if apply_pulsef
txPulseformer = Pform;
end
Rx_sig = preprocessSignal(Scpe_sig, Symbols, fsym(r), ...
"mode","auto", ...
"tx_pulseformer",txPulseformer, ...
"debug_plots",0,"gaussian_cutoff_factor",0.55,"apply_gaussian_filter",true);
Rx_sig = Rx_sig.normalize("mode","rms");
Rx_sig.signal = Rx_sig.signal(1:2*Symbols.length);
Rx_sig.spectrum()
if 1
%% 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_results = ffe(eq_ffe,M,Rx_sig,Symbols,Tx_bits,...
% "precode_mode",duob_mode,...
% 'showAnalysis',0,...
% "postFFE",[],...
% "eth_style_symbol_mapping",0);
%
% ffe_results.metrics.print;
% ffe_results.config.equalizer_structure = "ffe";
%
%% MLSE linear
pf_ncoeffs = 1;
ffe_order = [50, 0, 0];
eq_ = 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",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);
[ffe_results{r}, mlse_results_lin{r}] = vnle_postfilter_mlse(eq_, pf_, mlse_, M, Rx_sig, Symbols, Tx_bits, ...
"precode_mode", duob_mode,...
'showAnalysis', 0, ...
"postFFE", [],...
"eth_style_symbol_mapping", 0);
mlse_results_lin{r}.metrics.print;
ffe_results{r}.metrics.print;
%% MLSE nonlinear pre
pf_ncoeffs = 1;
ffe_order = [50, 1, 0];
eq_ = 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",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);
[vnle_results{r}, mlse_results_nonlin{r}] = vnle_postfilter_mlse(eq_, pf_, mlse_, M, Rx_sig, Symbols, Tx_bits, ...
"precode_mode", duob_mode,...
'showAnalysis', 0, ...
"postFFE", [],...
"eth_style_symbol_mapping", 0);
mlse_results_nonlin{r}.metrics.print;
vnle_results{r}.metrics.print;
%% nonlinear states MLSE linear pre
pf_ncoeffs = 1;
ffe_order = [50, 0, 0];
eq_ = 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",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',3);
[~, mlse_results_nonlin_states{r}] = vnle_postfilter_mlse(eq_, pf_, mlse_, M, Rx_sig, Symbols, Tx_bits, ...
"precode_mode", duob_mode,...
'showAnalysis', 0, ...
"postFFE", [],...
"eth_style_symbol_mapping", 0);
mlse_results_nonlin_states{r}.metrics.print;
end
end
g_mod.compile(15);
g_eye.compile(103837);
%%
figure();hold on;
plot(nonlin_mod,cellfun(@(x) x.metrics.BER, ffe_results),'DisplayName','FFE')
plot(nonlin_mod,cellfun(@(x) x.metrics.BER, vnle_results),'DisplayName','VNLE')
plot(nonlin_mod,cellfun(@(x) x.metrics.BER, mlse_results_lin),'DisplayName','FFE+MLSE')
plot(nonlin_mod,cellfun(@(x) x.metrics.BER, mlse_results_nonlin_states),'DisplayName','FFE+nonlin. states MLSE')
plot(nonlin_mod,cellfun(@(x) x.metrics.BER, mlse_results_nonlin),'DisplayName','VNLE+MLSE')
xlabel('Nonlinear Driving');
ylabel('BER')
set(gca,'YScale','log');
legend;
ylim([1e-4 1e-1]);
beautifyBERplot;

View File

@@ -1,16 +1,32 @@
% === SETTINGS ===
% dsp_options.append_to_db = 0;
% dsp_options.max_occurences = 15;
% dsp_options.database_path = 'C:\Users\Silas\Documents\MATLAB\Datensätze\sioe_labor\';
% dsp_options.database_name = 'silas_labor_newdsp_newstructure.db';
% dsp_options.storage_path = 'Z:\2024\sioe_labor\';
%
% dsp_options.parameters = struct();
% dsp_options.parameters.mu_dc = [0.005];
%
% % === Get Run ID's ===
% db = DBHandler("pathToDB", [dsp_options.database_path, dsp_options.database_name], "type", "sqlite");
dsp_options.append_to_db = 0;
dsp_options.max_occurences = 15;
dsp_options.database_path = 'C:\Users\Silas\Documents\MATLAB\Datensätze\sioe_labor\';
dsp_options.database_name = 'silas_labor_newdsp_newstructure.db';
dsp_options.storage_path = 'Z:\2024\sioe_labor\';
dsp_options.database_type = 'mysql';
dsp_options.dataBase = 'labor';
dsp_options.storage_path = 'W:\labdata\ECOC Silas\ECOC Silas\ecoc_2025\';
dsp_options.server = "192.168.178.192";% "134.245.243.254";
dsp_options.user = "silas";
dsp_options.password = "silas";
dsp_options.parameters = struct();
dsp_options.parameters.mu_dc = [0.005];
db = DBHandler("dataBase", [dsp_options.dataBase],...
"type", dsp_options.database_type,...
"server", dsp_options.server,...
"user", dsp_options.user, "password", dsp_options.password);
% === Get Run ID's ===
db = DBHandler("pathToDB", [dsp_options.database_path, dsp_options.database_name], "type", "sqlite");
fp = QueryFilter();
% fp.where('Runs', 'run_id','EQUALS', 5108);
fp.where('Runs', 'is_mpi','EQUALS', 0);
@@ -37,7 +53,7 @@ wh.addStorage("dbenc_package");
% wh.getStoValue('ffe_package',0.005);
% wh.getStoValue('mlse_package',0.005);
[dataTable,~] = db.queryDB(fp, [db.getTableFieldNames('Runs');db.getTableFieldNames('Results');db.getTableFieldNames('Equalizer')]);
[dataTable,~] = db.queryDB(fp, [db.getTableFieldNames('Runs');db.getTableFieldNames('Results');db.getTableFieldNames('EqualizerParameters')]);
dataTable = cleanUpTable(dataTable);

View File

@@ -30,6 +30,7 @@ fsym = dataTable.symbolrate;
M = double(dataTable.pam_level);
try
duob_mode = db_mode.(strrep(char(dataTable.db_mode),'"',''));
catch
duob_mode = db_mode(dataTable.db_mode);
end
@@ -231,6 +232,7 @@ for occ = 1:record_realizations
%%%%%% %db signaling => db encoded %%%%%
if 1
mlse_db_enc = MLSE_viterbi("DIR",[1,1],"duobinary_output",0,"M",M,"trellis_states",PAMmapper(M,0).levels);
eq_db_enc = EQ("Ne",vnle_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);
[result] = duobinary_signaling(eq_db_enc, mlse_db_enc,M, Scpe_sig ,Symbols, Tx_bits);

View File

@@ -1,39 +1,44 @@
savePath = 'Z:\2025\ECOC Silas\ecoc_2025\';
databasePath = 'C:\Users\Silas\Documents\MATLAB\imdd_simulation\projects\ECOC_2025\';
database_name = 'ecoc2025_loops.db';
db = DBHandler("type","mysql");
% savePath = 'Z:\2025\ECOC Silas\ecoc_2025\';
% databasePath = 'C:\Users\Silas\Documents\MATLAB\imdd_simulation\projects\ECOC_2025\';
% database_name = 'ecoc2025_loops.db';
% db = DBHandler("type","mysql");
% db = DBHandler("pathToDB", [databasePath, database_name],"type","sqlite");
dsp_options.append_to_db = 0;
dsp_options.max_occurences = 15;
dsp_options.database_type = 'mysql';
dsp_options.dataBase = 'labor';
dsp_options.storage_path = 'W:\labdata\ECOC Silas\ecoc_2025\';
dsp_options.server = "192.168.178.192";% "134.245.243.254";
dsp_options.user = "silas";
dsp_options.password = "silas";
filterParams = db.tables;
% filterParams.Configurations = struct('run_id', 4001);
filterParams.Configurations = struct( ...
'symbolrate', 112e9, ... %[224,336,360,390,420,448]
'fiber_length', 0, ...
'db_mode', '"no_db"', ...
'interference_attenuation', [], ...
'interference_path_length', [], ...
'is_mpi', 1, ...
'pam_level', 4, ...
'wavelength', 1310, ...
'precomp_amp', [], ...
'signal_attenuation', [], ...
'v_awg', [], ...
'v_bias', 2.65 ...
);
db = DBHandler("dataBase", [dsp_options.dataBase],...
"type", dsp_options.database_type,...
"server", dsp_options.server,...
"user", dsp_options.user, "password", dsp_options.password);
selectedFields = {'Runs.run_id','Runs.loop_id','Runs.tx_bits_path','Runs.tx_signal_path','Runs.tx_symbols_path','Runs.rx_sync_path','Runs.rx_raw_path',...
'Configurations.db_mode','Configurations.pam_level','Configurations.bitrate','Configurations.symbolrate','Configurations.fiber_length','Configurations.wavelength','Configurations.precomp_amp','Measurements.power_rop','Configurations.v_bias',...
'Configurations.interference_attenuation', 'Configurations.interference_path_length'};
fp = QueryFilter();
fp.where('Runs', 'symbolrate', 'EQUALS', 112e9); % [224,336,360,390,420,448]
fp.where('Runs', 'fiber_length', 'EQUALS', 0);
fp.where('Runs', 'db_mode', 'EQUALS', '"no_db"');
% fp.where('Runs', 'interference_attenuation', 'EQUALS', []);
% fp.where('Runs', 'interference_path_length', 'EQUALS', []);
fp.where('Runs', 'is_mpi', 'EQUALS', 1);
fp.where('Runs', 'pam_level', 'EQUALS', 4);
fp.where('Runs', 'wavelength', 'EQUALS', 1310);
% fp.where('Runs', 'precomp_amp', 'EQUALS', []);
% fp.where('Runs', 'signal_attenuation', 'EQUALS', []);
% fp.where('Runs', 'v_awg', 'EQUALS', []);
fp.where('Runs', 'v_bias', 'EQUALS', 2.65);
[dataTable,sql_query] = db.queryDB(filterParams, selectedFields);
[dataTable, ~] = db.queryDB(fp, db.getTableFieldNames('Runs'));
% dataTable(dataTable.loop_id<200,:) = [];
num_occ = 15;
run_par = true;
run_par = false;
run_id = dataTable.run_id;
params = struct();
@@ -57,6 +62,7 @@ params.smoothing_buffer_length = 0;
params.smoothing_buffer_update = 0;
params.mu_dc = 0.005;
futures_list = parallel.FevalFuture.empty();
for id = 1:length(dataTable.run_id)
run_id = dataTable.run_id(id);

View File

@@ -1,5 +1,6 @@
db = DBHandler("type","mysql","dataBase",'labor');
savePath = 'W:\labdata\ECOC Silas\ecoc_2025\';
fp = QueryFilter();
@@ -9,7 +10,7 @@ fp.where('Runs', 'pam_level','EQUALS', M);
fp.where('Runs', 'symbolrate','EQUALS', 112e9);
fp.where('Runs', 'fiber_length','EQUALS', 0);
fp.where('Runs', 'is_mpi','EQUALS', 1);
fp.where('Runs', 'interference_path_length','EQUALS', 70);
fp.where('Runs', 'interference_path_length','EQUALS', 1000);
% fp.where('Runs', 'loop_id','GREATER_THAN', 11);
fp.where('Runs', 'sir','EQUALS',20);
@@ -28,7 +29,7 @@ for i = 1:size(dataTable,1)
M = double(dataTable_.pam_level);
duob_mode = db_mode.(strrep(char(dataTable_.db_mode),'"',''));
Tx_signal = load([savePath, char(dataTable_.tx_signal_path)]);
Tx_signal = load([savePath, char(dataTable_.tx_signal_path),'.mat']);
Tx_signal = Tx_signal.Digi_sig;
Tx_bits = load([savePath, char(dataTable_.tx_bits_path)]);
@@ -40,7 +41,7 @@ for i = 1:size(dataTable,1)
Symbols = Symbols.Symbols;
Scpe_sig_raw = load([savePath, char(dataTable_.rx_raw_path(1))]);
Scpe_sig_raw = Scpe_sig_raw.Scpe_sig_raw;
Scpe_sig_raw = Scpe_sig_raw.Scpe_sig_raw.normalize("mode","rms");
Scpe_sig_raw.plot("displayname",['Scope Signal (Run ID: ',num2str(dataTable_.run_id)],"fignum",dataTable_.run_id,"clear",0);
@@ -65,15 +66,15 @@ for i = 1:size(dataTable,1)
end
disp(num2str(filterParams.Configurations.interference_path_length));
disp(num2str(dataTable_.interference_path_length));
var(sep_sig,0,2,'omitnan')
%%
xax_in_sec = ((1:length(avg_sig)) / fsym) * 1e6;
figure();hold on;
cols = cbrewer2('Paired',8);
% for p = 1:size(avg_sig,1)
% sc=scatter(xax_in_sec,sep_sig(p,:),1,'.','MarkerEdgeColor',cols((2*p)-1,:),'MarkerEdgeAlpha',0.1);
% end
for p = 1:size(avg_sig,1)
sc=scatter(xax_in_sec,sep_sig(p,:),1,'.','MarkerEdgeColor',cols((2*p)-1,:),'MarkerEdgeAlpha',0.2);
end
for p = 1:size(avg_sig,1)
sc=plot(xax_in_sec,avg_sig(p,:),'LineWidth',1,'Color',cols((2*p),:));
end
@@ -83,7 +84,7 @@ for i = 1:size(dataTable,1)
xlabel('time in $\mu$s');
ylabel('Normalized Amplitude');
xlim([0 25]);
ylim([-2 2]);
ylim([-3 3]);
drawnow;
end

View File

@@ -1,8 +1,10 @@
basePath = 'C:\Users\sioe\Documents\MATLAB\imdd_simulation\projects\ECOC_2025\';
database_name = 'ecoc2025.db';
database = DBHandler("pathToDB", [basePath, database_name],"type",'mysql');
% basePath = 'C:\Users\sioe\Documents\MATLAB\imdd_simulation\projects\ECOC_2025\';
% database_name = 'ecoc2025.db';
% database = DBHandler("pathToDB", [basePath, database_name],"type",'mysql');
database = DBHandler("dataBase",'labor',"type","mysql","user","silas","password","silas","server","192.168.178.192");
filterParams = database.tables;
filterParams.Configurations = struct( ...

View File

@@ -1,34 +1,48 @@
basePath = 'C:\Users\sioe\Documents\MATLAB\imdd_simulation\projects\ECOC_2025\';
database_name = 'ecoc2025.db';
database = DBHandler("pathToDB", [basePath, database_name]);
% basePath = 'C:\Users\sioe\Documents\MATLAB\imdd_simulation\projects\ECOC_2025\';
% database_name = 'ecoc2025.db';
% database = DBHandler("pathToDB", [basePath, database_name]);
%
% filterParams = database.tables;
% filterParams.Configurations = struct( ...
% 'symbolrate', 112e9, ... %[224,336,360,390,420,448]
% 'fiber_length', 0, ...
% 'db_mode', '"no_db"', ...
% 'interference_attenuation', [], ...
% 'interference_path_length', [], ...
% 'is_mpi', 0, ...
% 'pam_level', 4, ...
% 'wavelength', 1310, ...
% 'precomp_amp', [], ...
% 'signal_attenuation', [], ...
% 'v_awg', 0.8, ...
% 'v_bias', 2.8 ...
% );
%
% % filterParams.EqualizerParameters.diff_precode = int32(db_mode.db_encoded);
% % filterParams.EqualizerParameters.equalizer_structure = int32(equalizer_structure.vnle);
%
% selectedFields = {'Configurations.run_id' 'Runs.date_of_run' 'Runs.rx_raw_path' 'Configurations.bitrate' 'Configurations.v_bias' 'Configurations.v_awg' 'Configurations.precomp_amp' 'Configurations.symbolrate' 'Configurations.pam_level'...
% 'Configurations.db_mode' 'Configurations.rop_attenuation' 'Configurations.is_mpi' 'Configurations.interference_attenuation' 'Configurations.signal_attenuation' ...
% 'EqualizerParameters.equalizer_structure' 'EqualizerParameters.diff_precode' 'EqualizerParameters.eq_id' 'Measurements.power_pd_in' ...
% 'Measurements.power_mpi_interference' 'Measurements.power_mpi_signal' 'Results.BER' 'Results.BER_precoded' 'Results.SNR' 'Results.GMI' 'Results.Alpha' 'Results.date_of_processing'};
%
% [dataTable,sql_query] = database.queryDB(filterParams, selectedFields);
filterParams = database.tables;
filterParams.Configurations = struct( ...
'symbolrate', 112e9, ... %[224,336,360,390,420,448]
'fiber_length', 0, ...
'db_mode', '"no_db"', ...
'interference_attenuation', [], ...
'interference_path_length', [], ...
'is_mpi', 0, ...
'pam_level', 4, ...
'wavelength', 1310, ...
'precomp_amp', [], ...
'signal_attenuation', [], ...
'v_awg', 0.8, ...
'v_bias', 2.8 ...
);
%%
% filterParams.EqualizerParameters.diff_precode = int32(db_mode.db_encoded);
% filterParams.EqualizerParameters.equalizer_structure = int32(equalizer_structure.vnle);
db = DBHandler("type","mysql","dataBase",'labor');
db = DBHandler("type","mysql","dataBase",'labor');
fp = QueryFilter();
% fp.where('mpi_superview', 'loop_id','EQUALS', 209);
fp.where('mpi_superview', 'symbolrate','EQUALS', 112e9);
fp.where('mpi_superview', 'pam_level','EQUALS', 4);
fn = [db.getTableFieldNames('mpi_superview')];
[dataTable,sql_query] = db.queryDB(fp,fn); %dauert lange! 46k einträge
selectedFields = {'Configurations.run_id' 'Runs.date_of_run' 'Runs.rx_raw_path' 'Configurations.bitrate' 'Configurations.v_bias' 'Configurations.v_awg' 'Configurations.precomp_amp' 'Configurations.symbolrate' 'Configurations.pam_level'...
'Configurations.db_mode' 'Configurations.rop_attenuation' 'Configurations.is_mpi' 'Configurations.interference_attenuation' 'Configurations.signal_attenuation' ...
'EqualizerParameters.equalizer_structure' 'EqualizerParameters.diff_precode' 'EqualizerParameters.eq_id' 'Measurements.power_pd_in' ...
'Measurements.power_mpi_interference' 'Measurements.power_mpi_signal' 'Results.BER' 'Results.BER_precoded' 'Results.SNR' 'Results.GMI' 'Results.Alpha' 'Results.date_of_processing'};
[dataTable,sql_query] = database.queryDB(filterParams, selectedFields);
dataTable = cleanUpTable(dataTable);

View File

@@ -47,7 +47,7 @@ fp = QueryFilter();
fp.where('mpi_superview', 'symbolrate','EQUALS', 112e9);
fp.where('mpi_superview', 'pam_level','EQUALS', 4);
fn = [db.getTableFieldNames('mpi_superview')];
[dataTable,sql_query] = db.queryDB(fp,fn);
[dataTable,sql_query] = db.queryDB(fp,fn); %dauert lange! 46k einträge
%%
@@ -64,10 +64,10 @@ dataTable_clean(dataTable_clean.BER>0.2,:) = [];
cols = linspecer(8); % Ensure color count matches
figure()
tiledlayout(1, 4, 'TileSpacing', 'compact', 'Padding', 'compact');
tiledlayout(1, 1, 'TileSpacing', 'compact', 'Padding', 'compact');
y_here = 0;
figcnt = 0;
for int_len = [0,50,300,1000]
for int_len = 1000%[0,50,300,1000]
figcnt = figcnt+1;
% figure(int_len+1);
nexttile;
@@ -75,7 +75,7 @@ for int_len = [0,50,300,1000]
mode = 4;
for mode = [1,2]
for mode = [1,2,3,4]
hold on;
dataTable = dataTable_clean;
@@ -333,9 +333,11 @@ for int_len = [0,50,300,1000]
ylim([9e-5 0.1 ]);
xticks([13:2:35]);
set(gca,'YScale','log')
% Enable grid and beautify
grid on;
beautifyBERplot;
% beautifyBERplot("logscale",true,"setcolors",false,"setmarkers",false);
end
end

View File

@@ -48,7 +48,7 @@ cols = linspecer(6);
rop = [-8];
bwl = [0.5:0.1:1.5];
fsym = [208:16:256].*1e9;
nonlin_mod = [0.5:0.01:0.75];
nonlin_mod = [0.5:0.1:0.75];
fsym = ones(size(nonlin_mod)).*fsym(1);
ffe_results = {};

View File

@@ -1,7 +1,7 @@
Scope_sig = load("projects/MPI_August/scpe_sig.mat","Scpe_sig");
Scope_sig = load("/MPI_August/scpe_sig.mat","Scpe_sig");
Scope_sig = Scope_sig.Scpe_sig;
Symbols = load("projects/MPI_August/symbols.mat","Symbols");
Symbols = Symbols.Symbols;