186 lines
6.9 KiB
Matlab
186 lines
6.9 KiB
Matlab
dsp_options.storage_path = 'Z:\2024\sioe_labor\';
|
|
dsp_options.max_occurences = 1;
|
|
database = DBHandler("dataBase", 'labor_highspeed', "type", 'mysql' );
|
|
|
|
rates = [420e9];
|
|
cols = cbrewer2('BuPu',25);
|
|
cols = [cols(end-10:2:end,:)];
|
|
cols = cbrewer2('Set1',6);
|
|
|
|
fignum = 200;
|
|
fig=figure(fignum);clf;
|
|
|
|
for dbmode = 1%length(rates)
|
|
|
|
|
|
if 0
|
|
rcalpha = 0.05;
|
|
fsym = rates/2;
|
|
pulsef = 1;
|
|
Pform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rrc","pulselength",16,"alpha",rcalpha);
|
|
|
|
Pamsource = PAMsource(...
|
|
"fsym",fsym,"M",4,"order",18,"useprbs",0,...
|
|
"fs_out",fdac,...
|
|
"applyclipping",0,"clipfactor",1.2,...
|
|
"applypulseform",pulsef,"pulseformer",Pform,...
|
|
"randkey",20,...
|
|
"db_precode",dbmode,"db_encode",0,...
|
|
"mrds_code",0,"mrds_blocklength",512);
|
|
|
|
[Digi_sig,Symbols,Bits] = Pamsource.process();
|
|
|
|
Digi_sig = Digi_sig.normalize("mode","rms");
|
|
|
|
%%% 1) PLOT FULL RESPONSE SIGNAL
|
|
Digi_sig.spectrum("displayname","Full Response","fignum",fignum+dbmode,"normalizeToNyquist",0,"normalizeTo0dB",0,"color",[0.2,0.2,0.2],"linestyle",'-','addDCoffset',0,'normalizeToDC',1);
|
|
|
|
|
|
%%% 2) PLOT PREEMPH. TX SIGNAL
|
|
if dbmode == 0
|
|
maxamp = -37;
|
|
precomp_est = ChannelFreqResp("Nacq",2048,"Navg",100,"Ncp",63,'f_ref',Digi_sig.fs);
|
|
|
|
precomp_path = "C:\Users\Silas\Documents\MATLAB\Datensätze\sioe_labor\precomp";
|
|
precomp_fn = "lab_high_speed";
|
|
Digi_sig_pre = precomp_est.precomp(Digi_sig,'maxampdb',maxamp,'loadPath',precomp_path,'fileName',precomp_fn);
|
|
|
|
Digi_sig_pre = Digi_sig_pre.resample("fs_out",fdac);
|
|
|
|
Digi_sig_pre= Digi_sig_pre.normalize("mode","rms");
|
|
|
|
Digi_sig_pre.spectrum("displayname","Strong Precomp","fignum",fignum+dbmode,"normalizeToNyquist",0,"normalizeTo0dB",0,"color",[0,0,0],"linestyle",'-.','addDCoffset',0,'normalizeToDC',1);
|
|
end
|
|
|
|
end
|
|
|
|
% 1 - PAM 4 with preemphasis
|
|
fp = QueryFilter();
|
|
M = 4;
|
|
fp.where('Runs', 'pam_level','EQUALS', M);
|
|
fp.where('Runs', 'bitrate','EQUALS', rates);%360,390
|
|
fp.where('Runs', 'fiber_length','EQUALS', 2);
|
|
fp.where('Runs', 'wavelength','EQUALS', 1310); %1327.4
|
|
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);
|
|
|
|
% 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 = Scpe_cell{1};
|
|
|
|
%%% 3) PLOT DB Tgt. SIGNAL
|
|
if 1
|
|
DB_Symbols = Duobinary().encode(Symbols);
|
|
DB_Symbols.spectrum("fignum",fignum+dbmode,"normalizeTo0dB",1,"displayname",'DB-Response','addDCoffset',0,'color',clr.Set1.blue,'normalizeToNyquist',0,'linestyle','--');
|
|
end
|
|
|
|
%%% 4) Plot RX Signal
|
|
Scpe_sig.spectrum("fignum",fignum+dbmode,"normalizeTo0dB",1,"displayname",'Rx','addDCoffset',1,'color',[0,0,0],'normalizeToNyquist',0,'linestyle',':');
|
|
Scpe_sig.eye(fsym,M,"fignum",47,"displayname",' Eye of AVG Signal');
|
|
% xline(Symbols.fs/2.*1e-9,'Color',cols(r,:),'HandleVisibility','off');
|
|
|
|
average_signals = 1;
|
|
if average_signals
|
|
Scpe_sig_avg = Scpe_sig;
|
|
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;
|
|
|
|
figure(20);hold on
|
|
Symbols.spectrum("fignum",20,"normalizeTo0dB",1,"displayname",'Full Response','addDCoffset',0,'color',clr.Set1.red,'normalizeToNyquist',0,'linestyle','--');
|
|
DB_Symbols.spectrum("fignum",20,"normalizeTo0dB",1,"displayname",'DB-Response','addDCoffset',0,'color',clr.Set1.blue,'normalizeToNyquist',0,'linestyle','--');
|
|
Scpe_sig_avg.spectrum("displayname","Scope PSD","fignum",20,"normalizeTo0dB",1,"addDCoffset",5);
|
|
Scpe_sig_avg.plot("displayname","Scope raw signal","fignum",27,"clear",1);
|
|
Scpe_sig_avg.eye(fsym,M,"fignum",48,"displayname",' Eye of AVG Signal');
|
|
end
|
|
|
|
|
|
fig = figure(fignum+dbmode);
|
|
if dbmode == 0
|
|
ylim([-22,12]);
|
|
else
|
|
ylim([-22,2]);
|
|
end
|
|
xlim([0,105]);
|
|
xticks(-100:20:100);
|
|
yticks(-20:10:10);
|
|
|
|
beautifyBERplot("logscale",0,"setmarkers",0)
|
|
pos = [100.3333 991.6667 358.0000 192.6667];
|
|
set(fig, 'Position', pos);
|
|
|
|
%%%%%%%%%%%%
|
|
drawnow;
|
|
|
|
% Do EQ and find alpha's
|
|
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;
|
|
|
|
%%% FULL RESP TARGET
|
|
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",0);
|
|
pf_1 = Postfilter("ncoeff",1,"useBurg",1);
|
|
|
|
[eq_signal_sd, eq_noise] = eq_.process(Scpe_sig, Symbols);
|
|
|
|
% eq_noise.signal = eq_noise.signal - mean(eq_noise.signal);
|
|
% eq_noise = eq_noise.normalize("mode","rms");
|
|
|
|
[mlse_sig_sd,whitened_noise] = pf_1.process(eq_signal_sd, eq_noise);
|
|
|
|
fig = figure(fignum+dbmode+10); hold on
|
|
|
|
[h, w] = freqz(1, pf_1.coefficients, length(eq_noise), "whole", eq_noise.fs);
|
|
h = h / max(abs(h)); % Normalize the filter response
|
|
w_ = (w - eq_noise.fs / 2);
|
|
|
|
%%% DB TARGET
|
|
db_ref_sequence = Duobinary().encode(Symbols);
|
|
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",0);
|
|
[eq_signal, db_noise] = eq_.process(Scpe_sig,db_ref_sequence);
|
|
|
|
% db_noise.signal = db_noise.signal - mean(db_noise.signal);
|
|
% db_noise = db_noise.normalize("mode","rms");
|
|
|
|
%%% 1-3) Plot EQ Noise EEN
|
|
figure(fignum+dbmode+10)
|
|
eq_noise.spectrum("displayname", 'Noise', "fignum", fignum+dbmode+10, "normalizeTo0dB", 0,"color",clr.Set1.green,"normalizeToDC",0,"addDCoffset",0);
|
|
if dbmode == 1
|
|
offset = 27.7;
|
|
else
|
|
offset = 29.8;
|
|
end
|
|
plot(w_ * 1e-9, 20 * log10(fftshift(abs(h)))-offset, 'DisplayName', ['Burg Coeffs: ', num2str(round(pf_1.coefficients, 2)), ' '], 'LineWidth', 1,'Color',clr.Set1.green,'LineStyle','--');
|
|
db_noise.spectrum("displayname", 'DBt. Noise', "fignum", fignum+dbmode+10, "normalizeTo0dB", 0,"color",clr.Set1.blue,"normalizeToDC",0,"addDCoffset",0);
|
|
|
|
ylim([-54,-25]);
|
|
xlim([0,105]);
|
|
xticks(0:20:110);
|
|
yticks(-50:10:10);
|
|
|
|
beautifyBERplot("logscale",0,"setmarkers",0)
|
|
pos = [100.3333 991.6667 358.0000 192.6667];
|
|
set(fig, 'Position', pos);
|
|
|
|
end
|
|
|
|
|
|
% === FINAL FIGURE SIZE ===
|