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 ===