%% ============================================================ % LOAD DATA (PAM-4, sweep over ROP) % ============================================================ database_type = 'mysql'; db = DBHandler("dataBase", "labor_highspeed", "type", database_type); pam_level = 4; fiberL = 1; % 1 km wlen = 1310; baudrate = 360e9; fp = QueryFilter(); fp.where('Runs','pam_level','EQUALS', pam_level); fp.where('Runs','fiber_length','EQUALS', fiberL); fp.where('Runs','wavelength','EQUALS', wlen); fp.where('Runs','bitrate','EQUALS', baudrate); fp.where('Runs','power_pd_in','LESS_THAN', 7); fields = [ db.getTableFieldNames('power_state_info'); db.getTableFieldNames('dashboard_ungrouped_alltime') ]; [dataTable,~] = db.queryDB(fp, fields); %% ============================================================ % DSP SCHEMES (Best combinations only) % ============================================================ curves = struct; curves(1).name = 'VNLE'; curves(1).eq = equalizer_structure.vnle; curves(1).color = clr.Paired.red; curves(2).name = 'PF + MLSE'; curves(2).eq = equalizer_structure.vnle_pf_mlse; curves(2).color = clr.Paired.green; curves(3).name = 'DB-target + MLSE'; curves(3).eq = equalizer_structure.vnle_db_mlse; curves(3).color = clr.Paired.blue; curves(4).name = 'ML-based MLSE'; curves(4).eq = equalizer_structure.ml_mlse; curves(4).color = clr.Paired.purple; %% ============================================================ % ANALYSIS ENGINE (No plotting) % ============================================================ results = struct; for k = 1:numel(curves) pre_emph = decide_preemph(pam_level,curves(k).eq); precoded = decide_precoded(pam_level,curves(k).eq); cfg = struct; cfg.x_axis = 'power_mzm'; % ROP axis cfg.y_axis = 'BER'; cfg.agg = 'min'; cfg.outlier = 'none'; cfg.show_raw = false; cfg.filters = struct( ... 'pam_level', pam_level, ... 'fiber_length', fiberL, ... 'wavelength', wlen, ... 'bitrate', baudrate, ... 'is_mpi', 0, ... 'equalizer_structure', curves(k).eq, ... 'pre_emph', pre_emph); A = analyze_measurements_gpt(dataTable, cfg); results(k).x = A.group{1}.x; if precoded results(k).ber = A.group{1}.y_precoded; else results(k).ber = A.group{1}.y; end end %% ============================================================ % PLOT — BER vs ROP (Single Axis) % ============================================================ fig = figure(); clf; hold on; lw = 2.0; ms = 7; for k = 1:numel(curves) plot(results(k).x, results(k).ber, ... '-o', ... 'Color', curves(k).color, ... 'MarkerFaceColor', curves(k).color, ... 'MarkerSize', ms, ... 'LineWidth', lw, ... 'DisplayName', curves(k).name); end set(gca,'YScale','log'); grid on; xlabel('ROP / Power (MZM) [dBm]'); ylabel('BER'); ylim([1e-4 2e-1]); title(sprintf('BER vs ROP — PAM-%d, %.0f km, %.0f GBd, %.0f nm', ... pam_level, fiberL, baudrate*1e-9, wlen)); legend('Location','best'); beautifyBERplot(); pos = 1e3.*[0.2 0.6 1.3 0.4]; set(fig, 'Position', pos); %% ============================================================ % DECISION LOGIC (INLINE FUNCTIONS) % ============================================================ function pe = decide_preemph(M, eq) % PRE-EMPH RULES: switch M case 4 if eq == equalizer_structure.vnle pe = 1; % PAM4: VNLE → pre-emph on else pe = 0; % PAM4: all others → off end case {6,8} pe = 1; % PAM6/8: all → pre-emph on otherwise pe = 0; end end function flag = decide_precoded(M, eq) % PRE-CODE RULES: if eq == equalizer_structure.vnle_db_mlse flag = 1; % Always for DB-target elseif eq == equalizer_structure.ml_mlse && M == 4 flag = 1; % PAM4: ML-based → precoded else flag = 0; end end