ML Equalizer works now.
Not yet perfectly integrated into all the routines
This commit is contained in:
@@ -20,7 +20,7 @@ fp.where('Runs', 'rop_attenuation','EQUALS', 0);
|
||||
|
||||
|
||||
fields = db.getTableFieldNames('power_state_info');
|
||||
fields = [fields; db.getTableFieldNames('dashboard_ungrouped')];
|
||||
fields = [fields; db.getTableFieldNames('dashboard_ungrouped_new')];
|
||||
[dataTable,~] = db.queryDB(fp, fields);
|
||||
|
||||
eqstructures = unique(dataTable.equalizer_structure);
|
||||
|
||||
@@ -41,7 +41,9 @@ plotdefs = struct( ...
|
||||
'legendLocation' , 'best', ...
|
||||
'fecLineWidth' , 2.2, ... % thicker FEC limits
|
||||
'fecColor' , [0.25 0.25 0.25], ...
|
||||
'capSize' , 6 ...
|
||||
'capSize' , 6, ...
|
||||
'lineStyle_default' , '-', ...
|
||||
'use_pre_emph_styling' , true ...
|
||||
);
|
||||
cfg.plot = filldefaults(cfg.plot, plotdefs);
|
||||
|
||||
@@ -131,8 +133,23 @@ for gi = 1:nG
|
||||
yu = yu(ord); ylo = ylo(ord); yhi = yhi(ord);
|
||||
|
||||
% Styles
|
||||
pre = logical(grpTbl.pre_emph(gi));
|
||||
ls = tern(pre, cfg.plot.lineStyle_pre_emph_on, cfg.plot.lineStyle_pre_emph_off);
|
||||
% Decide if we style by pre_emph
|
||||
canStyleByPre = cfg.plot.use_pre_emph_styling && ismember('pre_emph', T.Properties.VariableNames);
|
||||
|
||||
if canStyleByPre
|
||||
if any(strcmp(group_by,'pre_emph'))
|
||||
% pre_emph is an explicit grouping key -> take it from the group table
|
||||
pre = logical(grpTbl.pre_emph(gi));
|
||||
else
|
||||
% pre_emph not grouped, but available in the rows -> infer from the members of this group
|
||||
pre = logical(mode(T.pre_emph(G==gi)));
|
||||
end
|
||||
ls = tern(pre, cfg.plot.lineStyle_pre_emph_on, cfg.plot.lineStyle_pre_emph_off);
|
||||
else
|
||||
% no pre-emph styling → use a single default style
|
||||
ls = cfg.plot.lineStyle_default;
|
||||
end
|
||||
|
||||
lbl = buildLabel(grpTbl(gi,:), group_by);
|
||||
|
||||
% Main line (dark)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
% === SETTINGS ===
|
||||
dsp_options.append_to_db = 1;
|
||||
dsp_options.max_occurences = 15;
|
||||
dsp_options.max_occurences = 2;
|
||||
|
||||
experiment = "highspeed_2024";
|
||||
dsp_options.mode = "load_run_id"; % 'simulate' & 'load_files'
|
||||
@@ -42,16 +42,16 @@ fp = QueryFilter();
|
||||
% fp.where('Runs', 'run_id','EQUALS', 987);
|
||||
M = 4;
|
||||
fp.where('Runs', 'pam_level','EQUALS', M);
|
||||
fp.where('Runs', 'bitrate','EQUALS', 420e9);%360,390
|
||||
% fp.where('Runs', 'symbolrate','EQUALS', 162e9);
|
||||
fp.where('Runs', 'fiber_length','EQUALS', 2);
|
||||
fp.where('Runs', 'bitrate','EQUALS', 300e9);%360,390
|
||||
% fp.where('Runs', 'symbolrate','EQUALS', 195e9);
|
||||
% fp.where('Runs', 'fiber_length','EQUALS', 1);
|
||||
fp.where('Runs', 'is_mpi','EQUALS', 0);
|
||||
% fp.where('Runs', 'interference_path_length','EQUALS', 1000);
|
||||
% fp.where('Runs', 'loop_id','GREATER_THAN', 11);
|
||||
% fp.where('Runs', 'sir','EQUALS',18);
|
||||
fp.where('Runs', 'wavelength','EQUAL', 1310);
|
||||
fp.where('Runs', 'db_mode','EQUALS', 0);
|
||||
fp.where('Runs', 'rop_attenuation','EQUAL', 0);
|
||||
fp.where('Runs', 'db_mode','EQUALS', 1);
|
||||
% fp.where('Runs', 'rop_attenuation','EQUAL', 0);
|
||||
% fp.where('Runs', 'power_pd_in','GREATER_THAN', 7);
|
||||
|
||||
[dataTable,~] = db.queryDB(fp, db.getTableFieldNames('Runs'));
|
||||
@@ -66,15 +66,41 @@ wh.addStorage("mlse_package");
|
||||
wh.addStorage("vnle_package");
|
||||
wh.addStorage("dbtgt_package");
|
||||
wh.addStorage("dbenc_package");
|
||||
wh.addStorage("mlmlse_package");
|
||||
|
||||
% === RUN IT ===
|
||||
%% === RUN IT ===
|
||||
|
||||
[results,wh] = submitJobs(dataTable.run_id(:), dsp_options, "serial", 'wh', wh, 'waitbar', true);
|
||||
|
||||
%%
|
||||
results_db = results(dataTable.db_mode==1);
|
||||
results_nodb = results(dataTable.db_mode==0);
|
||||
|
||||
for i = 1:numel(results_db)
|
||||
%BER for ML based MLSE
|
||||
for i = 1:length(results_db)
|
||||
ber_m = cellfun(@(c) c.metrics.BER_precoded, results_db{1,i}.mlmlse_package);
|
||||
[BER_MLMLSE_pre_emph(i), ~] = min(ber_m);
|
||||
|
||||
ber_m = cellfun(@(c) c.metrics.BER_precoded, results_nodb{1,i}.mlmlse_package);
|
||||
[BER_MLMLSE(i), ~] = min(ber_m);
|
||||
|
||||
ber_m = cellfun(@(c) c.metrics.BER_precoded, results_nodb{1,i}.mlmlse_package);
|
||||
[BER_MLMLSE(i), ~] = min(ber_m);
|
||||
|
||||
baudrate(i) = dataTable.symbolrate(i);
|
||||
rop_db(i) = dataTable.power_rop((2*i)-1);
|
||||
end
|
||||
|
||||
figure(11);hold on
|
||||
plot(sort(rop_db),sort(BER_MLMLSE_pre_emph))
|
||||
plot(sort(rop_db),sort(BER_MLMLSE))
|
||||
beautifyBERplot
|
||||
|
||||
%%
|
||||
results_db = results(dataTable.db_mode==1);
|
||||
results_nodb = results(dataTable.db_mode==0);
|
||||
|
||||
for i = 1:numel(results_nodb)
|
||||
|
||||
% VNLE (from results_nodb)
|
||||
gmi_v = cellfun(@(c) c.metrics.GMI, results_nodb{1,i}.vnle_package);
|
||||
@@ -89,9 +115,9 @@ for i = 1:numel(results_db)
|
||||
idx_air_max_vnle(i) = find(air_v == max(air_v), 1);
|
||||
|
||||
% MLSE (from results_db)
|
||||
gmi_m = cellfun(@(c) c.metrics.GMI, results_nodb{1,i}.mlse_package);
|
||||
gmi_m = cellfun(@(c) c.metrics.GMI, results_db{1,i}.mlse_package);
|
||||
ber_m = cellfun(@(c) c.metrics.BER, results_nodb{1,i}.mlse_package);
|
||||
air_m = cellfun(@(c) c.metrics.AIR, results_nodb{1,i}.mlse_package);
|
||||
air_m = cellfun(@(c) c.metrics.AIR, results_db{1,i}.mlse_package);
|
||||
[BER_MLSE(i), idx_ber] = min(ber_m);
|
||||
GMI_MLSE(i) = gmi_m(idx_ber);
|
||||
AIR_MLSE(i) = air_m(idx_ber);
|
||||
@@ -111,11 +137,22 @@ for i = 1:numel(results_db)
|
||||
idx_gmi_min_db(i) = find(gmi_db == min(gmi_db), 1);
|
||||
idx_air_max_db(i) = find(air_db == max(air_db), 1);
|
||||
|
||||
%BER for ML based MLSE
|
||||
ber_m = cellfun(@(c) c.metrics.BER, results_nodb{1,i}.mlmlse_package);
|
||||
[BER_MLMLSE(i), idx_ber] = min(ber_m);
|
||||
ber_m = cellfun(@(c) c.metrics.BER_precoded, results_db{1,i}.mlmlse_package);
|
||||
[BER_MLMLSE_PREC(i), idx_ber] = min(ber_m);
|
||||
|
||||
% metadata
|
||||
bitrate(i) = dataTable.bitrate(i);
|
||||
baudrate(i) = dataTable.symbolrate(i);
|
||||
rop_atten(i) = dataTable.rop_attenuation(2*i);
|
||||
rop_pre(i) = dataTable.power_rop((2*i)-1);
|
||||
rop(i) = dataTable.power_rop((2*i));
|
||||
end
|
||||
|
||||
|
||||
%%
|
||||
STYLE_BASE = 2; % adjust this single number to scale markers & lines
|
||||
MARKER_SIZE = STYLE_BASE; % marker size (MATLAB MarkerSize)
|
||||
LINE_WIDTH = max(2, STYLE_BASE/3); % line width (keeps lines reasonable when STYLE_BASE large)
|
||||
@@ -128,6 +165,7 @@ cm.VNLE = cols(1 + d, :);
|
||||
cm.MLSE = cols(2 + d, :);
|
||||
cm.DB_precode = cols(3 + d, :);
|
||||
cm.DB = cols(4 + d, :); % duobinary
|
||||
cm.ML_MLSE = cols(6 + d, :);
|
||||
|
||||
% prepare x values in GBd
|
||||
xGHz = baudrate .* 1e-9;
|
||||
@@ -139,7 +177,7 @@ mk.VNLE = {'Marker','o','MarkerFaceColor',cm.VNLE,'MarkerEdgeColor',cm.VNLE,'
|
||||
mk.MLSE = {'Marker','*','MarkerFaceColor',cm.MLSE,'MarkerEdgeColor',cm.MLSE,'MarkerSize',MARKER_SIZE};
|
||||
mk.DB_precode = {'Marker','^','MarkerFaceColor',cm.DB_precode,'MarkerEdgeColor',cm.DB_precode,'MarkerSize',MARKER_SIZE};
|
||||
mk.DB = {'Marker','d','MarkerFaceColor',cm.DB,'MarkerEdgeColor',cm.DB,'MarkerSize',MARKER_SIZE};
|
||||
|
||||
mk.ML_MLSE = {'Marker','^','MarkerFaceColor',cm.ML_MLSE,'MarkerEdgeColor',cm.ML_MLSE,'MarkerSize',MARKER_SIZE};
|
||||
|
||||
% ---------------- FIGURE : BER ----------------
|
||||
figure(112+M); clf; hold on;
|
||||
@@ -149,20 +187,100 @@ plot(xGHz, BER_VNLE, ...
|
||||
plot(xGHz, BER_MLSE, ...
|
||||
'DisplayName','MLSE', ...
|
||||
mk.MLSE{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.MLSE);
|
||||
plot(xGHz, BER_DB, ...
|
||||
'DisplayName','DB tgt.', ...
|
||||
mk.DB{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.DB);
|
||||
plot(xGHz, BER_DB_PREC, ...
|
||||
'DisplayName','Diff. Precode + DB tgt.', ...
|
||||
mk.DB{:}, 'LineStyle',':','LineWidth',LINE_WIDTH,'Color',cm.DB);
|
||||
mk.DB{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.DB);
|
||||
plot(xGHz, BER_MLMLSE_PREC, ...
|
||||
'DisplayName','ML-based MLSE (L=2)', ...
|
||||
mk.ML_MLSE{:}, 'LineStyle',':','LineWidth',LINE_WIDTH,'Color',cm.ML_MLSE);
|
||||
|
||||
yline(2e-2,'LineWidth',1,'HandleVisibility','off');
|
||||
yline(4.85e-3,'LineWidth',1,'HandleVisibility','off');
|
||||
yline(2.2e-4,'LineWidth',1,'HandleVisibility','off');
|
||||
xlabel('Baudrate in GBd');
|
||||
ylabel('BER');
|
||||
set(gca, 'yscale', 'log');
|
||||
set(gca, 'XTick', xticks_vals(1:2:end), 'XTickLabel', xtick_labels(1:2:end));
|
||||
set(gca, 'XTick', xticks_vals(1:end), 'XTickLabel', xtick_labels(1:end));
|
||||
grid on;
|
||||
legend('Location','best');
|
||||
beautifyBERplot
|
||||
|
||||
|
||||
|
||||
%%
|
||||
%%
|
||||
STYLE_BASE = 2; % adjust this single number to scale markers & lines
|
||||
MARKER_SIZE = STYLE_BASE; % marker size (MATLAB MarkerSize)
|
||||
LINE_WIDTH = max(2, STYLE_BASE/3); % line width (keeps lines reasonable when STYLE_BASE large)
|
||||
|
||||
% --- color map / method -> color assignment (keeps colors consistent) ---
|
||||
cols = cbrewer2('Paired',8);
|
||||
cols = linspecer(6);
|
||||
d = 0;
|
||||
cm.VNLE = cols(1 + d, :);
|
||||
cm.MLSE = cols(2 + d, :);
|
||||
cm.DB_precode = cols(3 + d, :);
|
||||
cm.DB = cols(4 + d, :); % duobinary
|
||||
cm.ML_MLSE = cols(6 + d, :);
|
||||
|
||||
% prepare x values in GBd
|
||||
xdbm = flip(sort(rop));
|
||||
xticks_vals = xdbm;
|
||||
xtick_labels = arrayfun(@(v) sprintf('%d', round(v)), xticks_vals, 'UniformOutput', false);
|
||||
|
||||
% common marker settings (filled, same face+edge color)
|
||||
mk.VNLE = {'Marker','o','MarkerFaceColor',cm.VNLE,'MarkerEdgeColor',cm.VNLE,'MarkerSize',MARKER_SIZE};
|
||||
mk.MLSE = {'Marker','*','MarkerFaceColor',cm.MLSE,'MarkerEdgeColor',cm.MLSE,'MarkerSize',MARKER_SIZE};
|
||||
mk.DB_precode = {'Marker','^','MarkerFaceColor',cm.DB_precode,'MarkerEdgeColor',cm.DB_precode,'MarkerSize',MARKER_SIZE};
|
||||
mk.DB = {'Marker','d','MarkerFaceColor',cm.DB,'MarkerEdgeColor',cm.DB,'MarkerSize',MARKER_SIZE};
|
||||
mk.ML_MLSE = {'Marker','^','MarkerFaceColor',cm.ML_MLSE,'MarkerEdgeColor',cm.ML_MLSE,'MarkerSize',MARKER_SIZE};
|
||||
|
||||
% ---------------- FIGURE : BER ----------------
|
||||
figure(112+M); clf; hold on;
|
||||
plot(flip(sort(rop)), sort(BER_VNLE), ...
|
||||
'DisplayName','VNLE', ...
|
||||
mk.VNLE{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.VNLE);
|
||||
plot(flip(sort(rop)), sort(BER_MLSE), ...
|
||||
'DisplayName','MLSE', ...
|
||||
mk.MLSE{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.MLSE);
|
||||
plot(flip(sort(rop)), sort(BER_MLSE), ...
|
||||
'DisplayName','MLSE', ...
|
||||
mk.MLSE{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.MLSE);
|
||||
plot(flip(sort(rop_pre)), sort(BER_DB_PREC), ...
|
||||
'DisplayName','Diff. Precode + DB tgt.', ...
|
||||
mk.DB{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.DB);
|
||||
plot(flip(sort(rop_pre)), sort(BER_MLMLSE_PREC), ...
|
||||
'DisplayName','ML-based MLSE Diff. Prec. (L=2)', ...
|
||||
mk.ML_MLSE{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.ML_MLSE);
|
||||
plot(flip(sort(rop_pre)), sort(BER_MLMLSE), ...
|
||||
'DisplayName','ML-based MLSE (L=2)', ...
|
||||
mk.ML_MLSE{:}, 'LineStyle',':','LineWidth',LINE_WIDTH,'Color',cm.DB_precode);
|
||||
|
||||
yline(2e-2,'LineWidth',1,'HandleVisibility','off');
|
||||
yline(4.85e-3,'LineWidth',1,'HandleVisibility','off');
|
||||
yline(2.2e-4,'LineWidth',1,'HandleVisibility','off');
|
||||
xlabel('ROP in dBm');
|
||||
ylabel('BER');
|
||||
set(gca, 'yscale', 'log');
|
||||
% set(gca, 'XTick', xticks_vals(1:end), 'XTickLabel', xtick_labels(1:end));
|
||||
grid on;
|
||||
legend('Location','best');
|
||||
beautifyBERplot
|
||||
|
||||
|
||||
%%
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
% ---------------- FIGURE 15 : GMI ----------------
|
||||
|
||||
@@ -6,31 +6,32 @@ M = 4;
|
||||
fp = QueryFilter();
|
||||
% fp.where('Runs', 'run_id','EQUALS', 987);
|
||||
% fp.where('Runs', 'pam_level','EQUALS', M);
|
||||
% fp.where('Runs', 'symbolrate','EQUALS', 150e9);
|
||||
% fp.where('Runs', 'symbolrate','EQUALS', 165e9); %150, 165, 180, 195, 210, 225, 240
|
||||
% fp.where('Runs', 'fiber_length','EQUALS', 10);
|
||||
fp.where('Runs', 'is_mpi','EQUALS', 0);
|
||||
% fp.where('Runs', 'is_mpi','EQUALS', 0);
|
||||
% fp.where('Runs', 'power_pd_in','GREATER_THAN', 7);
|
||||
% fp.where('Runs', 'interference_path_length','EQUALS', 1000);
|
||||
% fp.where('Runs', 'loop_id','GREATER_THAN', 11);
|
||||
% fp.where('Runs', 'sir','EQUALS',18);
|
||||
% fp.where('Runs', 'wavelength','EQUALS', 1310);
|
||||
fp.where('Runs', 'db_mode','EQUALS', 1); % 0 == high preemphasis // 1 == low preemphasis
|
||||
fp.where('Runs', 'rop_attenuation','EQUALS', 0);
|
||||
fp.where('Runs', 'db_mode','EQUALS', 2); % 0 == high preemphasis // 1 == low preemphasis
|
||||
% fp.where('Runs', 'rop_attenuation','EQUALS', 0);
|
||||
|
||||
fields = db.getTableFieldNames('power_state_info');
|
||||
fields = db.getTableFieldNames('power_state_info');
|
||||
fields = [fields; db.getTableFieldNames('dashboard_ungrouped_new')];
|
||||
[dataTable,~] = db.queryDB(fp, fields);
|
||||
|
||||
%%
|
||||
cfg = struct;
|
||||
cfg.x_axis = 'wavelength'; % 'symbolrate' | 'baudrate' | 'bitrate' | 'wavelength'
|
||||
cfg.y_axis = 'power_mzm'; % 'BER' | 'GMI' | 'AIR' | ...
|
||||
cfg.group_by = {};
|
||||
cfg.filters = struct('is_mpi',0,'pam_level',M,'equalizer_structure',[equalizer_structure.vnle,equalizer_structure.ffe,equalizer_structure.vnle_pf_mlse,equalizer_structure.vnle_db_mlse,equalizer_structure.dfe]);
|
||||
cfg.x_axis = 'symbolrate'; % 'symbolrate' | 'bitrate' | 'wavelength'
|
||||
cfg.y_axis = 'BER'; % 'BER' | 'GMI' | 'AIR' | ...
|
||||
cfg.group_by = {'wavelength'};
|
||||
cfg.filters = struct('is_mpi',0,'pam_level',M,'equalizer_structure',[equalizer_structure.vnle_db_mlse]);%,equalizer_structure.ffe,equalizer_structure.vnle_pf_mlse,equalizer_structure.vnle_db_mlse,equalizer_structure.dfe]);
|
||||
|
||||
cfg.y_scale = 'auto'; % auto -> log for BER*, linear otherwise
|
||||
cfg.outlier = 'mad'; % simple, robust; 'none' or 'pctl' also available
|
||||
cfg.show_raw = true;
|
||||
cfg.show_spread = 'none'; % 'none' or 'iqr'
|
||||
cfg.show_spread = 'iqr'; % 'none' or 'iqr'
|
||||
cfg.agg = 'mean'; % or 'median'
|
||||
cfg.show_precoded = 0;
|
||||
cfg.fec_lines = [2.2e-4 4.85e-3 2e-2]; % optional
|
||||
@@ -45,5 +46,4 @@ cfg.plot.scatterAlpha = 0.35;
|
||||
cfg.plot.legendLocation = 'best';
|
||||
cfg.plot.fecLineWidth = 2.4; % thicker FEC limits
|
||||
|
||||
|
||||
plot_measurements_gpt(dataTable, cfg);
|
||||
Reference in New Issue
Block a user