Simulation preps for high speed.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
% === SETTINGS ===
|
||||
dsp_options.append_to_db = 1;
|
||||
dsp_options.max_occurences = 2;
|
||||
dsp_options.append_to_db = 0;
|
||||
dsp_options.max_occurences = 15;
|
||||
|
||||
experiment = "highspeed_2024";
|
||||
dsp_options.mode = "load_run_id"; % 'simulate' & 'load_files'
|
||||
@@ -39,19 +39,19 @@ end
|
||||
% === Get Run ID's ===
|
||||
|
||||
fp = QueryFilter();
|
||||
% fp.where('Runs', 'run_id','EQUALS', 987);
|
||||
% fp.where('Runs', 'run_id','EQUALS', 2776);
|
||||
M = 4;
|
||||
fp.where('Runs', 'pam_level','EQUALS', M);
|
||||
fp.where('Runs', 'bitrate','EQUALS', 300e9);%360,390
|
||||
% 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', 'fiber_length','EQUALS', 2);
|
||||
% 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', 1);
|
||||
% fp.where('Runs', 'rop_attenuation','EQUAL', 0);
|
||||
fp.where('Runs', 'rop_attenuation','EQUAL', 0);
|
||||
% fp.where('Runs', 'power_pd_in','GREATER_THAN', 7);
|
||||
|
||||
[dataTable,~] = db.queryDB(fp, db.getTableFieldNames('Runs'));
|
||||
@@ -72,203 +72,115 @@ wh.addStorage("mlmlse_package");
|
||||
|
||||
[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);
|
||||
|
||||
%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);
|
||||
|
||||
|
||||
%% =========================================================================
|
||||
% LOAD METADATA
|
||||
% =========================================================================
|
||||
[dataTable, ~] = db.queryDB(fp, db.getTableFieldNames('Runs'));
|
||||
results = results(:).'; % ensure row vector
|
||||
N = numel(results);
|
||||
|
||||
% =========================================================================
|
||||
% PREALLOCATE METRIC ARRAYS
|
||||
% =========================================================================
|
||||
BER_VNLE = nan(1,N);
|
||||
BER_MLSE = nan(1,N);
|
||||
BER_DB = nan(1,N);
|
||||
BER_DB_PREC = nan(1,N);
|
||||
BER_MLMLSE = nan(1,N);
|
||||
BER_MLMLSE_PREC = nan(1,N);
|
||||
|
||||
% =========================================================================
|
||||
% EXTRACT METRICS (ONE LOOP, ROBUST)
|
||||
% =========================================================================
|
||||
for i = 1:N
|
||||
r = results{i};
|
||||
|
||||
% ---- VNLE (no-DB mode) ----
|
||||
if isfield(r, 'vnle_package') && ~isempty(r.vnle_package)
|
||||
pkg = r.vnle_package;
|
||||
BER_VNLE(i) = min(cellfun(@(c) c.metrics.BER, pkg));
|
||||
end
|
||||
|
||||
% ---- Classical MLSE (DB mode) ----
|
||||
if isfield(r, 'mlse_package') && ~isempty(r.mlse_package)
|
||||
pkg = r.mlse_package;
|
||||
BER_MLSE(i) = min(cellfun(@(c) c.metrics.BER, pkg));
|
||||
BER_MLSE_PREC(i) = min(cellfun(@(c) c.metrics.BER_precoded, pkg));
|
||||
end
|
||||
|
||||
% ---- DB Target (DB mode) ----
|
||||
if isfield(r, 'dbtgt_package') && ~isempty(r.dbtgt_package)
|
||||
pkg = r.dbtgt_package;
|
||||
BER_DB(i) = min(cellfun(@(c) c.metrics.BER, pkg));
|
||||
BER_DB_PREC(i) = min(cellfun(@(c) c.metrics.BER_precoded, pkg));
|
||||
end
|
||||
|
||||
% ---- ML-based MLSE (both modes) ----
|
||||
if isfield(r, 'mlmlse_package') && ~isempty(r.mlmlse_package)
|
||||
pkg = r.mlmlse_package;
|
||||
|
||||
% raw BER
|
||||
BER_MLMLSE(i) = min(cellfun(@(c) c.metrics.BER, pkg));
|
||||
|
||||
% precoded BER
|
||||
if isfield(pkg{1}.metrics, 'BER_precoded')
|
||||
BER_MLMLSE_PREC(i) = min(cellfun(@(c) c.metrics.BER_precoded, pkg));
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
figure(11);hold on
|
||||
plot(sort(rop_db),sort(BER_MLMLSE_pre_emph))
|
||||
plot(sort(rop_db),sort(BER_MLMLSE))
|
||||
beautifyBERplot
|
||||
%% =========================================================================
|
||||
% METADATA (ALWAYS INDEX-ALIGNED WITH RESULTS)
|
||||
% =========================================================================
|
||||
bitrate = dataTable.bitrate(:).';
|
||||
baudrate = dataTable.symbolrate(:).';
|
||||
|
||||
%%
|
||||
results_db = results(dataTable.db_mode==1);
|
||||
results_nodb = results(dataTable.db_mode==0);
|
||||
rop_atten = dataTable.rop_attenuation(2:2:end).';
|
||||
rop_pre = dataTable.power_rop(1:2:end).';
|
||||
rop = dataTable.power_rop(2:2:end).';
|
||||
|
||||
for i = 1:numel(results_nodb)
|
||||
% =========================================================================
|
||||
% PLOT STYLE
|
||||
% =========================================================================
|
||||
STYLE_BASE = 2;
|
||||
MARKER_SIZE = STYLE_BASE;
|
||||
LINE_WIDTH = max(2, STYLE_BASE/3);
|
||||
|
||||
% VNLE (from results_nodb)
|
||||
gmi_v = cellfun(@(c) c.metrics.GMI, results_nodb{1,i}.vnle_package);
|
||||
ber_v = cellfun(@(c) c.metrics.BER, results_nodb{1,i}.vnle_package);
|
||||
air_v = cellfun(@(c) c.metrics.AIR, results_nodb{1,i}.vnle_package);
|
||||
snr_v = cellfun(@(c) c.metrics.SNR, results_nodb{1,i}.vnle_package);
|
||||
[BER_VNLE(i), idx_ber] = min(ber_v);
|
||||
GMI_VNLE(i) = gmi_v(idx_ber);
|
||||
AIR_VNLE(i) = air_v(idx_ber);
|
||||
SNR_VNLE(i) = max(snr_v);
|
||||
idx_gmi_min_vnle(i) = find(gmi_v == min(gmi_v), 1);
|
||||
idx_air_max_vnle(i) = find(air_v == max(air_v), 1);
|
||||
cols = cbrewer2('Paired', 8);
|
||||
|
||||
% MLSE (from results_db)
|
||||
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_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);
|
||||
idx_gmi_min_mlse(i) = find(gmi_m == min(gmi_m), 1);
|
||||
idx_air_max_mlse(i) = find(air_m == max(air_m), 1);
|
||||
cm.VNLE = cols(1,:);
|
||||
cm.MLSE = cols(2,:);
|
||||
cm.DB_PREC = cols(3,:);
|
||||
cm.DB = cols(4,:);
|
||||
cm.ML_MLSE = cols(6,:);
|
||||
|
||||
% DB (from results_db, BER_precoded)
|
||||
gmi_db = cellfun(@(c) c.metrics.GMI, results_db{1,i}.dbtgt_package);
|
||||
ber_db = cellfun(@(c) c.metrics.BER, results_db{1,i}.dbtgt_package);
|
||||
ber_db_prec = cellfun(@(c) c.metrics.BER_precoded, results_db{1,i}.dbtgt_package);
|
||||
air_db = cellfun(@(c) c.metrics.AIR, results_db{1,i}.dbtgt_package);
|
||||
[BER_DB(i), idx_ber] = min(ber_db);
|
||||
[BER_DB_PREC(i), idx_ber] = min(ber_db_prec);
|
||||
mk = @(col,shape) {'Marker',shape,'MarkerFaceColor',col,'MarkerEdgeColor',col,'MarkerSize',MARKER_SIZE};
|
||||
|
||||
GMI_DB(i) = gmi_db(idx_ber);
|
||||
AIR_DB(i) = air_db(idx_ber);
|
||||
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)
|
||||
|
||||
% --- 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
|
||||
xGHz = baudrate .* 1e-9;
|
||||
xticks_vals = xGHz;
|
||||
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 1: BER vs BAUDRATE
|
||||
% =========================================================================
|
||||
figure(112+M); clf; hold on;
|
||||
plot(xGHz, BER_VNLE, ...
|
||||
'DisplayName','VNLE', ...
|
||||
mk.VNLE{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.VNLE);
|
||||
plot(xGHz, BER_MLSE, ...
|
||||
'DisplayName','MLSE', ...
|
||||
mk.MLSE{:}, 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.MLSE);
|
||||
plot(xGHz, BER_DB_PREC, ...
|
||||
'DisplayName','Diff. Precode + DB tgt.', ...
|
||||
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);
|
||||
xGHz = baudrate * 1e-9;
|
||||
|
||||
plot(xGHz, BER_VNLE, 'DisplayName','VNLE', 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.VNLE);
|
||||
plot(xGHz, BER_MLSE, 'DisplayName','MLSE', 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.MLSE);
|
||||
% plot(xGHz, BER_MLSE_PREC, 'DisplayName','MLSE', 'LineStyle',':','LineWidth',LINE_WIDTH,'Color',cm.MLSE);
|
||||
plot(xGHz, BER_DB_PREC, 'DisplayName','Diff. Precode + DB', 'LineStyle','-','LineWidth',LINE_WIDTH,'Color',cm.DB_PREC);
|
||||
plot(xGHz, BER_MLMLSE_PREC, 'DisplayName','ML-based 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: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
|
||||
|
||||
|
||||
%%
|
||||
set(gca, 'YScale', 'log'); grid on; legend('Location','best');
|
||||
% beautifyBERplot;
|
||||
|
||||
|
||||
|
||||
@@ -283,7 +195,10 @@ beautifyBERplot
|
||||
|
||||
|
||||
|
||||
% ---------------- FIGURE 15 : GMI ----------------
|
||||
|
||||
|
||||
|
||||
%% ---------------- FIGURE 15 : GMI ----------------
|
||||
figure(113+M); clf; hold on;
|
||||
plot(xGHz, GMI_VNLE, ...
|
||||
'DisplayName','VNLE', ...
|
||||
|
||||
@@ -5,16 +5,16 @@ db = DBHandler("dataBase", [dataBase], "type", database_type);
|
||||
M = 4;
|
||||
fp = QueryFilter();
|
||||
% fp.where('Runs', 'run_id','EQUALS', 987);
|
||||
% fp.where('Runs', 'pam_level','EQUALS', M);
|
||||
fp.where('Runs', 'pam_level','EQUALS', M);
|
||||
% fp.where('Runs', 'symbolrate','EQUALS', 165e9); %150, 165, 180, 195, 210, 225, 240
|
||||
% fp.where('Runs', 'fiber_length','EQUALS', 10);
|
||||
fp.where('Runs', 'fiber_length','EQUALS', 10);
|
||||
% 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', 2); % 0 == high preemphasis // 1 == low preemphasis
|
||||
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);
|
||||
|
||||
fields = db.getTableFieldNames('power_state_info');
|
||||
@@ -25,15 +25,15 @@ fields = [fields; db.getTableFieldNames('dashboard_ungrouped_new')];
|
||||
cfg = struct;
|
||||
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.group_by = {'wavelength','equalizer_structure','pre_emph'};
|
||||
cfg.filters = struct('is_mpi',0,'pam_level',M,'equalizer_structure',[equalizer_structure.ml_mlse,equalizer_structure.vnle,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 = 'iqr'; % 'none' or 'iqr'
|
||||
cfg.show_spread = 'none'; % 'none' or 'iqr'
|
||||
cfg.agg = 'mean'; % or 'median'
|
||||
cfg.show_precoded = 0;
|
||||
cfg.show_precoded = 1;
|
||||
cfg.fec_lines = [2.2e-4 4.85e-3 2e-2]; % optional
|
||||
|
||||
% New styling knobs
|
||||
@@ -46,4 +46,6 @@ cfg.plot.scatterAlpha = 0.35;
|
||||
cfg.plot.legendLocation = 'best';
|
||||
cfg.plot.fecLineWidth = 2.4; % thicker FEC limits
|
||||
|
||||
plot_measurements_gpt(dataTable, cfg);
|
||||
plot_measurements_gpt(dataTable, cfg);
|
||||
|
||||
% beautifyBERplot()
|
||||
Reference in New Issue
Block a user