dsp_options.storage_path = 'Z:\2024\sioe_labor\'; dsp_options.max_occurences = 1; database = DBHandler("dataBase", 'labor_highspeed', "type", 'mysql' ); rate = [300e9]; cols = cbrewer2('BuPu',25); cols = [cols(end-10:2:end,:)]; cols = cbrewer2('Set1',6); fignum = 200; fig=figure(fignum);clf; dbmode = 0; % 1 - PAM 4 with preemphasis fp = QueryFilter(); M = 6; fp.where('Runs', 'pam_level','EQUALS', M); fp.where('Runs', 'bitrate','EQUALS', rate);%360,390 fp.where('Runs', 'fiber_length','EQUALS', 2); fp.where('Runs', 'wavelength','EQUALS', 1310); fp.where('Runs', 'db_mode','EQUALS', dbmode); fp.where('Runs', 'rop_attenuation','EQUAL', 0); [dataTable,~] = db.queryDB(fp, database.getTableFieldNames('Runs')); dataTable = queryRunid(dataTable.run_id, database); fsym = dataTable.symbolrate; M = double(dataTable.pam_level); duob_mode = db_mode(strrep(dataTable.db_mode,'"','')); % Load and Sync signal data from DB [Tx_bits, Symbols, Scpe_cell, ~] = loadAndSyncSignalDataFromDb(dataTable, dsp_options); % Preprocess signal Scpe_sig = preprocessSignal(Scpe_cell{1}, Symbols, fsym); Scpe_sig.eye(fsym,M,"fignum",M*10); %% === EXPORT TO TIKZ === % outfile = ['C:\Users\Silas\Documents\latex\JLT_400G copy\media\matlab2tikz\eye_pam_',num2str(M),'.tikz']; % outfile = ['C:\Users\Silas\Documents\latex\JLT_400G copy\media\matlab2tikz\vnle_optimization.tikz']; % matlab2tikz(outfile, ... % 'width','\fwidth', ... % 'height','\fheight', ... % 'showInfo',false, ... % 'extraAxisOptions',{ ... % 'legend style={font=\footnotesize}', ... % 'legend columns=1' ... % } ); %% if duob_mode == db_mode.no_db && M == 6 %only for PAM-6 and no duobinary precoding, otherwise leads to false sequence estimation trellexlusion = 1; else trellexlusion = 0; end mlse_db_ = MLSE("DIR",[1,1],"duobinary_output",0,"M",M,"trellis_states",PAMmapper(M,0).levels,'scale_mode',2,'trellis_exclusion',trellexlusion,'trellis_state_mode',3); len_tr = 4096*2; ffe_order = [50, 5, 5]; dfe_order = [0, 0, 0]; pf_ncoeffs = 1; mu_ffe = [0.0001, 0.0008, 0.001]; mu_dfe = 0.0004; mu_dc = 0.005; dc_buffer_len = 1; mu_tr = 0; mu_dd = 0.05; adaption= 1; use_dd_mode = 1; 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); dbt_results = duobinary_target(eq_, mlse_db_, M, Scpe_sig, Symbols, Tx_bits, ... "precode_mode", duob_mode, ... 'showAnalysis', 1,... "postFFE", []); %% === FINAL FIGURE SIZE === % Existing figure numbers figEye = 249; figConst = 341; % Find axes in the source figures srcAxEye = findobj(figEye, 'Type', 'axes'); srcAxConst = findobj(figConst, 'Type', 'axes'); % Create new combined figure figCombined = figure; t = tiledlayout(figCombined, 1, 2); t.TileSpacing = 'compact'; t.Padding = 'compact'; % ------------------------------------------------------------ % LEFT TILE: EYE DIAGRAM % ------------------------------------------------------------ ax1 = nexttile(t, 1); hold(ax1, 'on') % Copy children (images, lines, patches, hist objects, etc.) copyobj(srcAxEye.Children, ax1); % Copy labels and title ax1.XLabel.String = srcAxEye.XLabel.String; ax1.YLabel.String = srcAxEye.YLabel.String; ax1.Title.String = srcAxEye.Title.String; % Copy axis limits ax1.XLim = srcAxEye.XLim; ax1.YLim = srcAxEye.YLim; ax1.YDir = srcAxEye.YDir; % Copy ticks + labels EXACTLY (including remapped/scaled ones) ax1.XTick = srcAxEye.XTick; ax1.XTickLabel = srcAxEye.XTickLabel; ax1.YTick = srcAxEye.YTick; ax1.YTickLabel = srcAxEye.YTickLabel; % Copy colormap + clim (important for density eye) colormap(ax1, colormap(srcAxEye.Parent)); ax1.CLim = srcAxEye.CLim; % Copy any style props that matter ax1.TickDir = srcAxEye.TickDir; ax1.TickLength = srcAxEye.TickLength; ax1.FontSize = srcAxEye.FontSize; ax1.Box = srcAxEye.Box; grid(ax1,'on'); % ------------------------------------------------------------ % RIGHT TILE: CONSTELLATION HISTOGRAM % ------------------------------------------------------------ ax2 = nexttile(t, 2); hold(ax2, 'on') copyobj(srcAxConst.Children, ax2); % Copy labels and title ax2.XLabel.String = srcAxConst.XLabel.String; ax2.YLabel.String = srcAxConst.YLabel.String; ax2.Title.String = srcAxConst.Title.String; % The histogram uses the same y-axis as the eye % Extract mapping from eye rawTicks = ax1.YTick; rawLabelsCell = ax1.YTickLabel; trueVoltages = str2double(rawLabelsCell); % Apply true voltages to the histogram axis ax2.XTick = flip(trueVoltages); ax2.XTickLabel = flip(rawLabelsCell); % Set histogram y-limits to match the actual voltages ax2.XLim = [min(trueVoltages) max(trueVoltages)]; % Ensure eye diagram prints the same (we *do not* touch ax1.YLim) ax1.XTickLabel = rawLabelsCell; % Copy colormap (your histogram uses same palette) colormap(ax2, colormap(srcAxConst.Parent)); % Style properties ax2.TickDir = srcAxConst.TickDir; ax2.TickLength = srcAxConst.TickLength; ax2.FontSize = srcAxConst.FontSize; ax2.Box = srcAxConst.Box; grid(ax2,'on'); % ============================================================ % remove right y-axis completely % ============================================================ ax2.XAxis.Visible = 'off'; % hides ticks + labels + axis line % BUT we still keep the YTick positions internally for alignment: % ax2.YTick = ; % ============================================================ % minimize distance between the two plots % ============================================================ t.TileSpacing = 'none'; % no space between tiles t.Padding = 'none'; % no outer padding % Also reduce internal padding for each axis ax1.Position(3) = ax1.Position(3) + 0.02; % widen eye a bit ax2.Position(1) = ax2.Position(1) - 0.02; % pull histogram closer % Keep left axis grid visible ax2.YGrid = 'off'; % % ===================================================================== % FINAL POLISHING: unified visual style % ======================================================================= % --- unified font size --- FS = 12; set([ax1 ax2], 'FontSize', FS); % --- unified axis line width (outline stroke thickness) --- LW = 1.0; set([ax1 ax2], 'LineWidth', LW); % --- unified tick length --- TL = [.015 .015]; set([ax1 ax2], 'TickLength', TL); % --- unified grid style --- set([ax1 ax2], 'XGrid', 'on', 'YGrid', 'on'); set([ax1 ax2], 'GridLineStyle', '--'); set([ax1 ax2], 'GridAlpha', 0.2); % --- remove right y-axis ticks and labels --- ax2.YAxis.Visible = 'off'; % --- copy colormap + CLim from the eye to histogram (synchronize look) --- colormap(ax1, colormap(srcAxEye.Parent)); colormap(ax2, colormap(srcAxEye.Parent)); ax2.CLim = ax1.CLim; % --- minimal spacing between tiles --- t.TileSpacing = 'none'; t.Padding = 'none'; % --- pull the panels together (touching boundary effect) --- pos1 = ax1.Position; pos2 = ax2.Position; % Shift histogram left until the outlines touch pos2(1) = pos1(1) + pos1(3) - 0.002; % 0.002 = fine overlap control ax2.Position = pos2; % Expand histogram slightly, remove white band pos2 = ax2.Position; pos2(3) = pos2(3) + 0.01; ax2.Position = pos2; % Ensure the left plot stays correct after the move ax1.Position = pos1; % --- enforce same visible outline --- % For ax2, create a fake left spine (since YAxis is hidden) ax2.Box = 'on'; % keep outline but no ticks on the right ax1.Box = 'on'; ax2.View = [90 -90];