279 lines
8.3 KiB
Matlab
279 lines
8.3 KiB
Matlab
dsp_options.storage_path = 'Z:\2024\sioe_labor\';
|
|
dsp_options.max_occurences = 1;
|
|
database = DBHandler("dataBase", 'labor_highspeed', "type", 'mysql' );
|
|
|
|
|
|
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 = 8;
|
|
rate = [360e9];
|
|
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,~] = database.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);
|
|
|
|
Scpe_sig_syncd = Scpe_cell{1};
|
|
Scpe_sig_syncd.eye(fsym,M,"fignum",rate.*1e-9*M+1,"displayname",' Eye of Signal');
|
|
%%%%%% SNR CHEAT - Avges the measured signal occurences found after correlation in "tsynch" %%%%%%
|
|
average_signals = 1;
|
|
if average_signals
|
|
Scpe_sig_avg = Scpe_sig_syncd;
|
|
scope_mean = zeros(size(Scpe_cell{1}.signal));
|
|
for n=1:numel(Scpe_cell)
|
|
scope_mean = scope_mean + Scpe_cell{n}.signal;
|
|
end
|
|
scope_mean = scope_mean ./ n;
|
|
Scpe_sig_avg.signal = scope_mean;
|
|
|
|
Scpe_sig_avg.spectrum("displayname","Scope PSD","fignum",20,"normalizeTo0dB",1);
|
|
Scpe_sig_avg.plot("displayname","Scope raw signal","fignum",27,"clear",1);
|
|
Scpe_sig_avg = Scpe_sig_avg.*1.25;
|
|
Scpe_sig_avg.eye(fsym,M,"fignum",rate.*1e-9*M,"displayname",' Eye of AVG Signal');
|
|
end
|
|
|
|
% Preprocess signal
|
|
Scpe_sig = preprocessSignal(Scpe_sig_avg, Symbols, fsym);
|
|
|
|
Scpe_sig.eye(fsym,M,"fignum",M*10);
|
|
|
|
|
|
|
|
%% === EXPORT TO TIKZ ===
|
|
|
|
% outfile = ['C:\Users\Silas\Documents\latex\JLT_400G_submission\media\matlab2tikz\eye_pam_',num2str(M),'-2.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 = <values already set earlier> ;
|
|
|
|
|
|
% ============================================================
|
|
% 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]; |