diff --git a/Classes/00_signals/Signal.m b/Classes/00_signals/Signal.m index 6261b91..97a8f14 100644 --- a/Classes/00_signals/Signal.m +++ b/Classes/00_signals/Signal.m @@ -198,65 +198,65 @@ classdef Signal end %% Add signals from one signal to another, the first object will sustain - function Sum = plus(X,y) - - if isa(X,'Signal') && isa(y,'Signal') - Sum = X; - Sum.signal = X.signal + y.signal; - elseif isa(X,'Signal') && isnumeric(y) - Sum = X; - Sum.signal = X.signal + y; - elseif isnumeric(X) && isa(y,'Signal') - Sum = y; - Sum.signal = X + y.signal; - end - - end + function Sum = plus(X,y) + + if isa(X,'Signal') && isa(y,'Signal') + Sum = X; + Sum.signal = X.signal + y.signal; + elseif isa(X,'Signal') && isnumeric(y) + Sum = X; + Sum.signal = X.signal + y; + elseif isnumeric(X) && isa(y,'Signal') + Sum = y; + Sum.signal = X + y.signal; + end + + end %% Add signals from one signal to another, the first object will sustain - function Diff = minus(X,y) - - if isa(X,'Signal') && isa(y,'Signal') - Diff = X; - Diff.signal = X.signal - y.signal; - elseif isa(X,'Signal') && isnumeric(y) - Diff = X; - Diff.signal = X.signal - y; - elseif isnumeric(X) && isa(y,'Signal') - Diff = y; - Diff.signal = X - y.signal; - end - - end - - function Product = times(X,y) - - if isa(X,'Signal') && isa(y,'Signal') - Product = X; - Product.signal = X.signal .* y.signal; - elseif isa(X,'Signal') && isnumeric(y) - Product = X; - Product.signal = X.signal .* y; - elseif isnumeric(X) && isa(y,'Signal') - Product = y; - Product.signal = X .* y.signal; - end - - end - - function Product = mtimes(X,y) - - if (isa(X,'Signal') && isnumeric(y) && isscalar(y)) || ... - (isnumeric(X) && isscalar(X) && isa(y,'Signal')) - Product = times(X,y); - else - error('Signal:mtimes:UnsupportedOperands', ... - 'Use element-wise .* for Signal multiplication, or scalar * Signal for scaling.'); - end - - end - - %% Display length + function Diff = minus(X,y) + + if isa(X,'Signal') && isa(y,'Signal') + Diff = X; + Diff.signal = X.signal - y.signal; + elseif isa(X,'Signal') && isnumeric(y) + Diff = X; + Diff.signal = X.signal - y; + elseif isnumeric(X) && isa(y,'Signal') + Diff = y; + Diff.signal = X - y.signal; + end + + end + + function Product = times(X,y) + + if isa(X,'Signal') && isa(y,'Signal') + Product = X; + Product.signal = X.signal .* y.signal; + elseif isa(X,'Signal') && isnumeric(y) + Product = X; + Product.signal = X.signal .* y; + elseif isnumeric(X) && isa(y,'Signal') + Product = y; + Product.signal = X .* y.signal; + end + + end + + function Product = mtimes(X,y) + + if (isa(X,'Signal') && isnumeric(y) && isscalar(y)) || ... + (isnumeric(X) && isscalar(X) && isa(y,'Signal')) + Product = times(X,y); + else + error('Signal:mtimes:UnsupportedOperands', ... + 'Use element-wise .* for Signal multiplication, or scalar * Signal for scaling.'); + end + + end + + %% Display length function return_length = length(obj) %METHOD1 Summary of this method goes here % Detailed explanation goes here @@ -856,6 +856,10 @@ classdef Signal S{c}.logbook = []; end + if ~isempty(S) + obj = S{1}; + end + else %do nothing when shifts are negative or there are none... @@ -1030,47 +1034,47 @@ classdef Signal elseif mode == 1 % generate eye diagram using histogram - finite_eye = eye_mat(isfinite(eye_mat)); - if isempty(finite_eye) - finite_eye = sig(isfinite(sig)); - end - amp_min = min(finite_eye); - amp_max = max(finite_eye); - amp_center = (amp_max + amp_min) / 2; - amp_span = amp_max - amp_min; - if amp_span == 0 - amp_span = max(abs(amp_center),1); - end - amp_margin = 0.08 * amp_span; - maxA = amp_center + amp_span/2 + amp_margin; - minA = amp_center - amp_span/2 - amp_margin; - if ~isa(obj,'Opticalsignal') && minA < 0 && maxA > 0 - targetStep = max(abs([minA maxA])) / 2; - if targetStep > 0 - stepMagnitude = 10^floor(log10(targetStep)); - normalizedStep = targetStep / stepMagnitude; - if normalizedStep <= 1 - tickStep = stepMagnitude; - elseif normalizedStep <= 2 - tickStep = 2 * stepMagnitude; - elseif normalizedStep <= 5 - tickStep = 5 * stepMagnitude; - else - tickStep = 10 * stepMagnitude; - end - axisLimit = 2 * tickStep; - maxA = axisLimit; - minA = -axisLimit; - end - end + finite_eye = eye_mat(isfinite(eye_mat)); + if isempty(finite_eye) + finite_eye = sig(isfinite(sig)); + end + amp_min = min(finite_eye); + amp_max = max(finite_eye); + amp_center = (amp_max + amp_min) / 2; + amp_span = amp_max - amp_min; + if amp_span == 0 + amp_span = max(abs(amp_center),1); + end + amp_margin = 0.08 * amp_span; + maxA = amp_center + amp_span/2 + amp_margin; + minA = amp_center - amp_span/2 - amp_margin; + if ~isa(obj,'Opticalsignal') && minA < 0 && maxA > 0 + targetStep = max(abs([minA maxA])) / 2; + if targetStep > 0 + stepMagnitude = 10^floor(log10(targetStep)); + normalizedStep = targetStep / stepMagnitude; + if normalizedStep <= 1 + tickStep = stepMagnitude; + elseif normalizedStep <= 2 + tickStep = 2 * stepMagnitude; + elseif normalizedStep <= 5 + tickStep = 5 * stepMagnitude; + else + tickStep = 10 * stepMagnitude; + end + axisLimit = 2 * tickStep; + maxA = axisLimit; + minA = -axisLimit; + end + end % maxA = 0.12; % minA = -0.08; difference= maxA-minA; - data_ind_y=round((eye_mat-minA)/difference*(histpoints-1)) +1; - data_ind_y = min(max(data_ind_y,1),histpoints); + data_ind_y=round((eye_mat-minA)/difference*(histpoints-1)) +1; + data_ind_y = min(max(data_ind_y,1),histpoints); for n=1:size(data_ind_y,1) nn=histcounts(data_ind_y(n,:),1:histpoints+1); @@ -1096,22 +1100,22 @@ classdef Signal if isa(obj,'Opticalsignal') title(['Optical Eye ',options.displayname]) ylabel("Power in mW"); - yTickValues = linspace(maxA.*1e3,minA.*1e3,5); - min_ = min(abs(obj.signal(100:end-100)).^2); - max_ = abs(max(obj.signal(100:end-100)).^2); - elseif isa(obj,'Electricalsignal') - title(['Electrical Eye ',options.displayname]) - ylabel("Voltage in V"); - yTickValues = linspace(maxA,minA,5); - min_ = min(obj.signal(100:end-100)); - max_ = abs(max(obj.signal(100:end-100))); - else - title(['Digital Eye ',options.displayname]) - ylabel("Digital Signal Amplitude"); - yTickValues = linspace(maxA,minA,5); - min_ = min(obj.signal(100:end-100)); - max_ = abs(max(obj.signal(100:end-100))); - end + yTickValues = linspace(maxA.*1e3,minA.*1e3,5); + min_ = min(abs(obj.signal(100:end-100)).^2); + max_ = abs(max(obj.signal(100:end-100)).^2); + elseif isa(obj,'Electricalsignal') + title(['Electrical Eye ',options.displayname]) + ylabel("Voltage in V"); + yTickValues = linspace(maxA,minA,5); + min_ = min(obj.signal(100:end-100)); + max_ = abs(max(obj.signal(100:end-100))); + else + title(['Digital Eye ',options.displayname]) + ylabel("Digital Signal Amplitude"); + yTickValues = linspace(maxA,minA,5); + min_ = min(obj.signal(100:end-100)); + max_ = abs(max(obj.signal(100:end-100))); + end xlabel('Time in ps') @@ -1149,14 +1153,14 @@ classdef Signal hist_interest_smoth = smooth(hist_interest,20); a = scatter(hist_interest_smoth+posxall,1:length(hist_interest_smoth),4,'.','MarkerEdgeColor','red'); - minPeakDistance = max(10, floor(histpoints / (2*M))); - minPeakProminence = max(3, 0.05 * max(hist_interest_smoth)); - [pk,loc] = findpeaks(hist_interest_smoth, ... - "MinPeakDistance",minPeakDistance, ... - "NPeaks",M, ... - "MinPeakProminence",minPeakProminence, ... - "SortStr","descend"); - loc = sort(loc); + minPeakDistance = max(10, floor(histpoints / (2*M))); + minPeakProminence = max(3, 0.05 * max(hist_interest_smoth)); + [pk,loc] = findpeaks(hist_interest_smoth, ... + "MinPeakDistance",minPeakDistance, ... + "NPeaks",M, ... + "MinPeakProminence",minPeakProminence, ... + "SortStr","descend"); + loc = sort(loc); scatter(posxall,loc,'red','Marker','x','LineWidth',2); @@ -1239,14 +1243,14 @@ classdef Signal end - yTickPositions = linspace(1,histpoints,numel(yTickValues)); - yticks(yTickPositions); - yticklabels(sprintfc('%.2f', yTickValues)); - - xTickValues = linspace(0, 2/fsym, 6) .* 1e12; - xticks(linspace(1,histpoints_horizontal,numel(xTickValues))) - x_tickstring = sprintfc('%.2f', xTickValues); - xticklabels(x_tickstring); + yTickPositions = linspace(1,histpoints,numel(yTickValues)); + yticks(yTickPositions); + yticklabels(sprintfc('%.2f', yTickValues)); + + xTickValues = linspace(0, 2/fsym, 6) .* 1e12; + xticks(linspace(1,histpoints_horizontal,numel(xTickValues))) + x_tickstring = sprintfc('%.2f', xTickValues); + xticklabels(x_tickstring); % end diff --git a/Classes/04_DSP/Equalizer/FFE_DCremoval_adaptive_mu.m b/Classes/04_DSP/Equalizer/FFE_DCremoval_adaptive_mu.m index 9265652..911370e 100644 --- a/Classes/04_DSP/Equalizer/FFE_DCremoval_adaptive_mu.m +++ b/Classes/04_DSP/Equalizer/FFE_DCremoval_adaptive_mu.m @@ -246,7 +246,7 @@ classdef FFE_DCremoval_adaptive_mu < handle obj.mu_dc = min(max(obj.mu_dc + delta_mu, mu_min), mu_max); err_prev = e_val; - % DC buffer update & periodic estimate + % DC buffer update & periodic estimate -- new "P_err" is "e_val^2" P_err = alpha*P_err + (1-alpha)*e_val^2; mu_dc_norm = obj.mu_dc / (P_err + eps); diff --git a/Classes/DataBaseHandler/DBHandler.m b/Classes/DataBaseHandler/DBHandler.m index fad15e4..6810357 100644 --- a/Classes/DataBaseHandler/DBHandler.m +++ b/Classes/DataBaseHandler/DBHandler.m @@ -23,7 +23,7 @@ classdef DBHandler < handle arguments options.dataBase = "labor_highspeed"; % Default value for pathToDB if not provided options.type = "mysql"; - options.server = "134.245.243.254"; + options.server = "192.168.178.192"; % university coffee PC: "134.245.243.254"; options.port = 3306; options.user = "silas"; options.password = "silas"; diff --git a/Functions/EQ_structures/preprocessSignal.m b/Functions/EQ_structures/preprocessSignal.m index cc02b01..2161b2f 100644 --- a/Functions/EQ_structures/preprocessSignal.m +++ b/Functions/EQ_structures/preprocessSignal.m @@ -33,7 +33,8 @@ switch preprocessMode error('preprocessSignal:InvalidMode', 'Unsupported preprocessing mode "%s".', preprocessMode); end -[Scpe_sig, ~] = Scpe_sig.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", options.debug_plots); +[Scpe_sig, Scpe_cell] = Scpe_sig.tsynch("reference", Symbols, "fs_ref", fsym, "debug_plots", options.debug_plots); + % Scpe_sig = Scpe_cell{1}; % Apply Gaussian filter if options.apply_gaussian_filter diff --git a/Functions/EQ_structures/vnle_postfilter_mlse.m b/Functions/EQ_structures/vnle_postfilter_mlse.m index 7a0eaac..5bcf959 100644 --- a/Functions/EQ_structures/vnle_postfilter_mlse.m +++ b/Functions/EQ_structures/vnle_postfilter_mlse.m @@ -274,6 +274,7 @@ eq_noise.spectrum("displayname",'Equalized Signal','fignum',336,'normalizeTo0dB' showEQNoisePSD(eq_noise, "fignum", 338, "displayname", 'Residual Noise after VNLE', 'postfilter_taps', pf_.coefficients); for t = 1:4 + pf_.ncoeff = t; [~,~] = pf_.process(eq_signal_sd, eq_noise); showEQNoisePSD(eq_noise, "fignum", 339, "displayname", 'Residual Noise after VNLE', 'postfilter_taps', pf_.coefficients); diff --git a/Functions/EQ_visuals/showEQNoisePSD.m b/Functions/EQ_visuals/showEQNoisePSD.m index 84f4d1e..bfb0a12 100644 --- a/Functions/EQ_visuals/showEQNoisePSD.m +++ b/Functions/EQ_visuals/showEQNoisePSD.m @@ -23,7 +23,7 @@ end end % Ensure the figure is ready before calling spectrum - eq_noise.spectrum("displayname", options.displayname, "fignum", fig.Number, "normalizeTo0dB", 0,"color",options.color); + eq_noise.spectrum("displayname", options.displayname, "fignum", fig.Number, "normalizeTo0dB", 1,"color",options.color); if ~isnan(options.postfilter_taps) % Hold on to the figure for further plotting diff --git a/projects/Advanced_DSP_for_400G_IMDD_experiments/Auswertung_JLT/run_dsp_from_db.m b/projects/Advanced_DSP_for_400G_IMDD_experiments/Auswertung_JLT/run_dsp_from_db.m index 27b8aca..ceaa0a2 100644 --- a/projects/Advanced_DSP_for_400G_IMDD_experiments/Auswertung_JLT/run_dsp_from_db.m +++ b/projects/Advanced_DSP_for_400G_IMDD_experiments/Auswertung_JLT/run_dsp_from_db.m @@ -21,12 +21,23 @@ if dsp_options.mode == "load_run_id" "server", dsp_options.server,... "user", dsp_options.user, "password", dsp_options.password); + % db = DBHandler("dataBase",'labor',"type","mysql","user","silas","password","silas","server","192.168.178.192"); + elseif experiment == "mpi_ecoc_2025" dsp_options.database_type = 'mysql'; - dsp_options.dataBase = 'labor'; - dsp_options.storage_path = 'Z:\2025\ECOC Silas\ecoc_2025\'; - db = DBHandler("dataBase", [dsp_options.dataBase], "type", dsp_options.database_type); + dsp_options.dataBase = 'labor'; + dsp_options.storage_path = 'W:\labdata\ECOC Silas\ECOC Silas\ecoc_2025\'; + dsp_options.server = "192.168.178.192";% "134.245.243.254"; + dsp_options.user = "silas"; + dsp_options.password = "silas"; + + db = DBHandler("dataBase", [dsp_options.dataBase],... + "type", dsp_options.database_type,... + "server", dsp_options.server,... + "user", dsp_options.user, "password", dsp_options.password); + + % db = DBHandler("dataBase",'labor',"type","mysql","user","silas","password","silas","server","192.168.178.192"); end diff --git a/projects/Diss/investigate_channel_memory.m b/projects/Diss/investigate_channel_memory.m new file mode 100644 index 0000000..517b686 --- /dev/null +++ b/projects/Diss/investigate_channel_memory.m @@ -0,0 +1,146 @@ + +% Minimal IMDD model for investigating FFE noise enhancement. +% Parameters mirror the current IMDD_base_system/imdd_it.m, +% IMDD_base_system/imdd_model.m, and the FFE branch in dsp_scope_signal.m. + +clearvars; +close all; + +%% Sweep parameters from imdd_it.m +fsym_values = 172e9;%(152:16:200).*1e9; + +precomp = 0; +laser_wavelength = 1310; +M = 4; +link_length = 2; +channel_alpha = 0.5; +duob_mode = db_mode.db_precoded; +decoding_mode = db_decoder.sequencedetection; +channel_mode = channel_model.physical; +channel_snr_dB = 20; +rop = 0; + +%% Inner model parameters from imdd_model.m +bitrate = []; +apply_pulsef = 0; +fdac = 256e9; +fadc = 256e9; +random_key = 1; + +rcalpha = 0.05; +kover = 16; + +vbias_rel = 0.5; +u_pi = 3; +vbias = -vbias_rel*u_pi; + +laser_linewidth = 0; +eml_alpha = 0; + +len_tr = 4096*2; +pf_ncoeffs = 1; +mu_dc = 0.005; + +nRates = numel(fsym_values); + +eq_names = ["FFE","VNLE"]; +nEqs = numel(eq_names); +emptyResult = struct("fsym",[],"ROP",[],"equalizer",[],"BER",[],"SNR",[],"numBitErr",[], ... + "eq_noise",[],"eq_signal_sd",[],"eq",[],"Rx_sig",[],"Tx_sig",[],"Tx_symbols",[]); +results = repmat(emptyResult,nRates,nEqs); +cols = flip(cbrewer2('RdYlBu',nRates+4)); +midIdx = floor(size(cols,1)/2) + (-1:2); +cols(midIdx,:) = []; + +for i = 1:numel(fsym_values) + fsym = fsym_values(i); + fprintf("Running %.0f GBd (%d/%d)\n", fsym*1e-9, i, numel(fsym_values)); + + if isempty(bitrate) + bitrateCurrent = fsym * log2(M); + end + + Pform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rc","pulselength",18,"alpha",rcalpha); + [Digi_sig, Symbols, Bits] = PAMsource( ... + "fsym",fsym,"M",M,"order",18,"useprbs",0, ... + "fs_out",fdac, ... + "applyclipping",0,"clipfactor",1.5, ... + "applypulseform",apply_pulsef,"pulseformer",Pform, ... + "randkey",random_key, ... + "duobinary_mode",duob_mode, ... + "mrds_code",0,"mrds_blocklength",512).process(); + + rateResults = repmat(emptyResult,nEqs); + + + Tx_sig = Digi_sig; + + El_sig = M8199B("kover",kover).process(Digi_sig); + + tx_bwl = 85e9; + El_sig = Filter("filtdegree",4,"f_cutoff",tx_bwl,"fs",fdac*kover, ... + "filterType",filtertypes.bessel_inp,"active",true).process(El_sig); + + El_sig = El_sig.normalize("mode","oneone"); + scaling = 0.7*(u_pi/2-abs(vbias-u_pi/2)); + El_sig = El_sig .* scaling; + + Opt_sig = EML("mode",eml_mode.im_cosinus,"power",3,"fsimu",El_sig.fs, ... + "lambda",laser_wavelength,"bias",vbias,"u_pi",u_pi, ... + "linewidth",laser_linewidth,"randomkey",random_key+1, ... + "alpha",eml_alpha).process(El_sig); + + Opt_sig = Fiber("fsimu",Opt_sig.fs,"fiber_length",link_length, ... + "alpha",0.3,"D",0,"lambda0",1310,"gamma",0,"Dslope",0.07).process(Opt_sig); + + + + Rx_sig = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power", ... + "amplification_db",rop).process(Opt_sig); + + Rx_sig = Photodiode("fsimu",fdac*kover,"dark_current",2e-08, ... + "responsivity",0.6,"temperature",20,"nep",1.8e-11).process(Rx_sig); + + rx_bwl = 90e9; + Rx_sig = Filter("filtdegree",4,"f_cutoff",rx_bwl,"fs",fdac*kover, ... + "filterType",filtertypes.butterworth,"active",true).process(Rx_sig); + + Lp_scpe = Filter("filtdegree",4,"f_cutoff",110e9,"fs",fadc, ... + "filterType",filtertypes.butterworth,"active",true); + + Rx_sig = Scope("fsimu",fdac*kover,"fadc",fadc, ... + "delay",0,"fixed_delay",0,"filtertype",filtertypes.butterworth, ... + "samplingdelay",0,"rand_samplingdelay",0,"freq_offset",0, ... + "samp_jitter",0,"adcresolution",8,"quantbuffer",0.1, ... + "block_dc",1,"lpf_active",1,"H_lpf",Lp_scpe).process(Rx_sig); + + txPulseformer = []; + if apply_pulsef + txPulseformer = Pform; + end + + Scpe_sig = preprocessSignal(Rx_sig, Symbols, fsym, ... + "mode","auto", ... + "tx_pulseformer",txPulseformer, ... + "debug_plots",0); + Scpe_sig.signal = Scpe_sig.signal(1:2*Symbols.length); + Scpe_sig.signal = real(Scpe_sig.signal); + + %% + % -------------------- VNLE + MLSE -------------------- + pf_ncoeffs = 1; + ffe_order3 = [50, 0, 0]; + eq_ = FFE("epochs_tr",5,"epochs_dd",5,"len_tr",len_tr, ... + "mu_dd",1e-3,"mu_tr",0.4,"order",50, ... + "sps",2,"decide",0,"optmize_mus",0,"dd_mode",1, ... + "adaption_technique","nlms","mu_dc",1e-3); + pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); + + mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0).levels); + + [vnle_results, mlse_results] = vnle_postfilter_mlse(eq_, pf_, mlse_, M, Scpe_sig, Symbols, Bits, ... + "precode_mode", duob_mode, 'showAnalysis', 1, "postFFE", [], "eth_style_symbol_mapping", 0); + +end + + diff --git a/projects/Diss/simulation_nonlin_dsp.m b/projects/Diss/simulation_nonlin_dsp.m new file mode 100644 index 0000000..e55b44f --- /dev/null +++ b/projects/Diss/simulation_nonlin_dsp.m @@ -0,0 +1,241 @@ +%%% Run parameters +% TX +M = 4; +m = floor(log2(M)*10)/10; +fsym = 160e9; + +apply_pulsef = 0; +fdac = 256e9; +fadc = 256e9; +random_key = 1; + +rcalpha = 0.05; +kover = 16; +vbias_rel = 0.5; +u_pi = 3.2; +vbias = -vbias_rel*u_pi; +laser_wavelength = 1310; +laser_linewidth = 0; +eml_alpha = 0; + + +% Channel +link_length = 0; + +vnle_order1 = 50; +vnle_order2 = 0; +vnle_order3 = 0; + +vnle_order=[vnle_order1,vnle_order2,vnle_order3]; +dfe_order = [0 0 0]; + +alpha = 0; + +len_tr = 4096*2; + +mu_ffe1 = 0.0001; +mu_ffe2 = 0.0008; +mu_ffe3 = 0.001; +mu_dc = 0.005; +% mu_dc = 0; + +mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3]; +mu_dfe = 0.0004; + +dfe_ = sum(dfe_order)>0; + +duob_mode = db_mode.no_db; +cols = linspecer(6); +rop = -6; +bwl = 0.5:0.1:1.5; +nonlin_mod = 0.5:0.025:0.7; +fsym = ones(size(nonlin_mod)).*fsym; + +ffe_results = {}; +mlse_results_lin= {}; +vnle_results= {}; +mlse_results_nonlin= {}; +mlse_results_nonlin_states= {}; + +g_eye = GifWriter('Name','eye','Parallel',true); +g_mod = GifWriter('Name','modulator','Parallel',true); + +for r = 1:length(nonlin_mod) + + Pform = Pulseformer("fsym",fsym(r),"fdac",4*fsym(r),"pulse","rc","pulselength",16,"alpha",rcalpha); + + apply_pulsef = 0; + + [Digi_sig,Symbols,Tx_bits] = PAMsource(... + "fsym",fsym(r),"M",M,"order",18,"useprbs",0,... + "fs_out",fdac,... + "applyclipping",0,"clipfactor",1.5,... + "applypulseform",apply_pulsef,"pulseformer",Pform,... + "randkey",random_key,... + "mrds_code",0,"mrds_blocklength",512,"duobinary_mode",duob_mode).process(); + + % El_sig = AWG("fdac",fdac,"f_cutoff",fsym(r),"lpf_active",0,"kover",kover,"bit_resolution",12,"upsampling_method","samplehold","precomp_sinc_rolloff",0).process(Digi_sig); + El_sig = M8199B("kover",kover).process(Digi_sig); + % AWG("fdac",fdac,"f_cutoff",fsym(r),"lpf_active",0,"kover",kover,"bit_resolution",12,"upsampling_method","samplehold","precomp_sinc_rolloff",0).process(Digi_sig); + + %%%%% Low-pass el. components %%%%%% + tx_bwl = 85e9; + El_sig = Filter("filtdegree",4,"f_cutoff",tx_bwl,"fs",fdac*kover, ... + "filterType",filtertypes.bessel_inp,"active",true).process(El_sig); + + %%%%% Electrical Driver Amplifier %%%%%% + El_sig = El_sig.normalize("mode","oneone"); + % El_sig = El_sig.setPower(1,"dBm"); + % figure;histogram(El_sig.signal); + + %%%%% MODULATE E/O CONVERSION %%%%% + % scaling = nonlin_mod(r)*(u_pi/2-abs(vbias-u_pi/2)); + % El_sig = El_sig .* scaling; + vbias = -nonlin_mod(r)*u_pi; + [Opt_sig] = EML("mode",eml_mode.im_cosinus,"power",3,"fsimu",El_sig.fs, ... + "lambda",laser_wavelength,"bias",vbias,"u_pi",u_pi, ... + "linewidth",laser_linewidth,"randomkey",random_key+1, ... + "alpha",eml_alpha).process(El_sig); + + if 1 + figure(15); + hold on + scatter(El_sig.signal(1:100000)+vbias,(abs(Opt_sig.signal(1:100000)).^2)*1e3,0.1,'.','DisplayName','Modulator TF') + xlabel('Input in V') + ylabel('abs(Eopt)2 in mW','Interpreter','latex') + ylim([0 2]); + xlim([-3 0]); + g_mod.addFrame(15, r); + + Opt_sig.eye(fsym(r), M, "fignum", 103837); + g_eye.addFrame(103837, r); + end + + %%%%%% Fiber %%%%%% + Opt_sig = Fiber("fsimu",Opt_sig.fs,"fiber_length",link_length,"alpha",0.3,"D",0,"lambda0",1310,"gamma",0,"Dslope",0.07).process(Opt_sig); + + %%%%%% ROP %%%%%% + Opt_sig = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power","amplification_db",rop).process(Opt_sig); + + %%%%%% PD Square Law %%%%%% + PD_sig = Photodiode("fsimu",fdac*kover,"dark_current",2e-08,"responsivity",0.6,"temperature",20,"nep",1.8e-11).process(Opt_sig); + + %%%%%% Low-pass RX (PD, El. Connectors and Scope %%%%%% + rx_bwl = 90e9; + PD_sig = Filter("filtdegree",4,"f_cutoff",rx_bwl,"fs",fdac*kover, ... + "filterType",filtertypes.butterworth,"active",true).process(PD_sig); + + % %%%%%% Low-pass Scope %%%%%% + Lp_scpe = Filter("filtdegree",4,"f_cutoff",110e9,"fs",fadc, ... + "filterType",filtertypes.butterworth,"active",true); + + %%%%%% Scope %%%%%% + Scpe_sig = Scope("fsimu",fdac*kover,"fadc",fadc,... + "delay",0,"fixed_delay",0,"filtertype",filtertypes.butterworth,... + "samplingdelay",0,"rand_samplingdelay",0,"freq_offset",0,"samp_jitter",0,... + "adcresolution",8,"quantbuffer",0.1,'block_dc',1,'lpf_active',1,'H_lpf',Lp_scpe).process(PD_sig); + + txPulseformer = []; + if apply_pulsef + txPulseformer = Pform; + end + + + Rx_sig = preprocessSignal(Scpe_sig, Symbols, fsym(r), ... + "mode","auto", ... + "tx_pulseformer",txPulseformer, ... + "debug_plots",0,"gaussian_cutoff_factor",0.55,"apply_gaussian_filter",true); + + + Rx_sig = Rx_sig.normalize("mode","rms"); + Rx_sig.signal = Rx_sig.signal(1:2*Symbols.length); + Rx_sig.spectrum() + + if 1 + + %% FFE + % ffe_order = [50, 0, 0]; + % eq_ffe = EQ("Ne",ffe_order,"Nb",[0,0,0],"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); + % + % ffe_results = ffe(eq_ffe,M,Rx_sig,Symbols,Tx_bits,... + % "precode_mode",duob_mode,... + % 'showAnalysis',0,... + % "postFFE",[],... + % "eth_style_symbol_mapping",0); + % + % ffe_results.metrics.print; + % ffe_results.config.equalizer_structure = "ffe"; + % + + %% MLSE linear + + pf_ncoeffs = 1; + ffe_order = [50, 0, 0]; + eq_ = EQ("Ne",ffe_order,"Nb",[0,0,0],"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); + pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); + mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0).levels,'scale_mode',2,'trellis_exclusion',0,'trellis_state_mode',2,'debug',0); + + [ffe_results{r}, mlse_results_lin{r}] = vnle_postfilter_mlse(eq_, pf_, mlse_, M, Rx_sig, Symbols, Tx_bits, ... + "precode_mode", duob_mode,... + 'showAnalysis', 0, ... + "postFFE", [],... + "eth_style_symbol_mapping", 0); + + mlse_results_lin{r}.metrics.print; + ffe_results{r}.metrics.print; + + %% MLSE nonlinear pre + + pf_ncoeffs = 1; + ffe_order = [50, 1, 0]; + eq_ = EQ("Ne",ffe_order,"Nb",[0,0,0],"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); + pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); + mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0).levels,'scale_mode',2,'trellis_exclusion',0,'trellis_state_mode',2); + + [vnle_results{r}, mlse_results_nonlin{r}] = vnle_postfilter_mlse(eq_, pf_, mlse_, M, Rx_sig, Symbols, Tx_bits, ... + "precode_mode", duob_mode,... + 'showAnalysis', 0, ... + "postFFE", [],... + "eth_style_symbol_mapping", 0); + + mlse_results_nonlin{r}.metrics.print; + vnle_results{r}.metrics.print; + + %% nonlinear states MLSE linear pre + + pf_ncoeffs = 1; + ffe_order = [50, 0, 0]; + eq_ = EQ("Ne",ffe_order,"Nb",[0,0,0],"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); + pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); + mlse_ = MLSE("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0).levels,'scale_mode',2,'trellis_exclusion',0,'trellis_state_mode',3); + + [~, mlse_results_nonlin_states{r}] = vnle_postfilter_mlse(eq_, pf_, mlse_, M, Rx_sig, Symbols, Tx_bits, ... + "precode_mode", duob_mode,... + 'showAnalysis', 0, ... + "postFFE", [],... + "eth_style_symbol_mapping", 0); + + mlse_results_nonlin_states{r}.metrics.print; + + end +end + +g_mod.compile(15); +g_eye.compile(103837); + +%% + +figure();hold on; +plot(nonlin_mod,cellfun(@(x) x.metrics.BER, ffe_results),'DisplayName','FFE') +plot(nonlin_mod,cellfun(@(x) x.metrics.BER, vnle_results),'DisplayName','VNLE') +plot(nonlin_mod,cellfun(@(x) x.metrics.BER, mlse_results_lin),'DisplayName','FFE+MLSE') +plot(nonlin_mod,cellfun(@(x) x.metrics.BER, mlse_results_nonlin_states),'DisplayName','FFE+nonlin. states MLSE') +plot(nonlin_mod,cellfun(@(x) x.metrics.BER, mlse_results_nonlin),'DisplayName','VNLE+MLSE') +xlabel('Nonlinear Driving'); +ylabel('BER') +set(gca,'YScale','log'); +legend; +ylim([1e-4 1e-1]); +beautifyBERplot; + + diff --git a/projects/ECOC_2025_MPI/auswertung_algorithms/run_offline_dsp.m b/projects/ECOC_2025_MPI/auswertung_algorithms/run_offline_dsp.m index af3e9d7..a61927e 100644 --- a/projects/ECOC_2025_MPI/auswertung_algorithms/run_offline_dsp.m +++ b/projects/ECOC_2025_MPI/auswertung_algorithms/run_offline_dsp.m @@ -1,16 +1,32 @@ % === SETTINGS === + +% dsp_options.append_to_db = 0; +% dsp_options.max_occurences = 15; +% dsp_options.database_path = 'C:\Users\Silas\Documents\MATLAB\Datensätze\sioe_labor\'; +% dsp_options.database_name = 'silas_labor_newdsp_newstructure.db'; +% dsp_options.storage_path = 'Z:\2024\sioe_labor\'; +% +% dsp_options.parameters = struct(); +% dsp_options.parameters.mu_dc = [0.005]; +% +% % === Get Run ID's === +% db = DBHandler("pathToDB", [dsp_options.database_path, dsp_options.database_name], "type", "sqlite"); + dsp_options.append_to_db = 0; dsp_options.max_occurences = 15; -dsp_options.database_path = 'C:\Users\Silas\Documents\MATLAB\Datensätze\sioe_labor\'; -dsp_options.database_name = 'silas_labor_newdsp_newstructure.db'; -dsp_options.storage_path = 'Z:\2024\sioe_labor\'; +dsp_options.database_type = 'mysql'; +dsp_options.dataBase = 'labor'; +dsp_options.storage_path = 'W:\labdata\ECOC Silas\ECOC Silas\ecoc_2025\'; +dsp_options.server = "192.168.178.192";% "134.245.243.254"; +dsp_options.user = "silas"; +dsp_options.password = "silas"; -dsp_options.parameters = struct(); -dsp_options.parameters.mu_dc = [0.005]; +db = DBHandler("dataBase", [dsp_options.dataBase],... + "type", dsp_options.database_type,... + "server", dsp_options.server,... + "user", dsp_options.user, "password", dsp_options.password); -% === Get Run ID's === -db = DBHandler("pathToDB", [dsp_options.database_path, dsp_options.database_name], "type", "sqlite"); fp = QueryFilter(); % fp.where('Runs', 'run_id','EQUALS', 5108); fp.where('Runs', 'is_mpi','EQUALS', 0); @@ -37,7 +53,7 @@ wh.addStorage("dbenc_package"); % wh.getStoValue('ffe_package',0.005); % wh.getStoValue('mlse_package',0.005); -[dataTable,~] = db.queryDB(fp, [db.getTableFieldNames('Runs');db.getTableFieldNames('Results');db.getTableFieldNames('Equalizer')]); +[dataTable,~] = db.queryDB(fp, [db.getTableFieldNames('Runs');db.getTableFieldNames('Results');db.getTableFieldNames('EqualizerParameters')]); dataTable = cleanUpTable(dataTable); diff --git a/projects/ECOC_2025_MPI/dsp_run_id.m b/projects/ECOC_2025_MPI/dsp_run_id.m index ae4280b..5f58f5b 100644 --- a/projects/ECOC_2025_MPI/dsp_run_id.m +++ b/projects/ECOC_2025_MPI/dsp_run_id.m @@ -30,6 +30,7 @@ fsym = dataTable.symbolrate; M = double(dataTable.pam_level); try duob_mode = db_mode.(strrep(char(dataTable.db_mode),'"','')); + catch duob_mode = db_mode(dataTable.db_mode); end @@ -231,6 +232,7 @@ for occ = 1:record_realizations %%%%%% %db signaling => db encoded %%%%% if 1 + mlse_db_enc = MLSE_viterbi("DIR",[1,1],"duobinary_output",0,"M",M,"trellis_states",PAMmapper(M,0).levels); eq_db_enc = EQ("Ne",vnle_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); [result] = duobinary_signaling(eq_db_enc, mlse_db_enc,M, Scpe_sig ,Symbols, Tx_bits); diff --git a/projects/ECOC_2025_MPI/dsp_standalone.m b/projects/ECOC_2025_MPI/dsp_standalone.m index b28e6ff..68c36ea 100644 --- a/projects/ECOC_2025_MPI/dsp_standalone.m +++ b/projects/ECOC_2025_MPI/dsp_standalone.m @@ -1,39 +1,44 @@ -savePath = 'Z:\2025\ECOC Silas\ecoc_2025\'; -databasePath = 'C:\Users\Silas\Documents\MATLAB\imdd_simulation\projects\ECOC_2025\'; -database_name = 'ecoc2025_loops.db'; -db = DBHandler("type","mysql"); +% savePath = 'Z:\2025\ECOC Silas\ecoc_2025\'; +% databasePath = 'C:\Users\Silas\Documents\MATLAB\imdd_simulation\projects\ECOC_2025\'; +% database_name = 'ecoc2025_loops.db'; +% db = DBHandler("type","mysql"); % db = DBHandler("pathToDB", [databasePath, database_name],"type","sqlite"); +dsp_options.append_to_db = 0; +dsp_options.max_occurences = 15; +dsp_options.database_type = 'mysql'; +dsp_options.dataBase = 'labor'; +dsp_options.storage_path = 'W:\labdata\ECOC Silas\ecoc_2025\'; +dsp_options.server = "192.168.178.192";% "134.245.243.254"; +dsp_options.user = "silas"; +dsp_options.password = "silas"; -filterParams = db.tables; -% filterParams.Configurations = struct('run_id', 4001); -filterParams.Configurations = struct( ... - 'symbolrate', 112e9, ... %[224,336,360,390,420,448] - 'fiber_length', 0, ... - 'db_mode', '"no_db"', ... - 'interference_attenuation', [], ... - 'interference_path_length', [], ... - 'is_mpi', 1, ... - 'pam_level', 4, ... - 'wavelength', 1310, ... - 'precomp_amp', [], ... - 'signal_attenuation', [], ... - 'v_awg', [], ... - 'v_bias', 2.65 ... - ); +db = DBHandler("dataBase", [dsp_options.dataBase],... +"type", dsp_options.database_type,... +"server", dsp_options.server,... +"user", dsp_options.user, "password", dsp_options.password); -selectedFields = {'Runs.run_id','Runs.loop_id','Runs.tx_bits_path','Runs.tx_signal_path','Runs.tx_symbols_path','Runs.rx_sync_path','Runs.rx_raw_path',... - 'Configurations.db_mode','Configurations.pam_level','Configurations.bitrate','Configurations.symbolrate','Configurations.fiber_length','Configurations.wavelength','Configurations.precomp_amp','Measurements.power_rop','Configurations.v_bias',... - 'Configurations.interference_attenuation', 'Configurations.interference_path_length'}; +fp = QueryFilter(); +fp.where('Runs', 'symbolrate', 'EQUALS', 112e9); % [224,336,360,390,420,448] +fp.where('Runs', 'fiber_length', 'EQUALS', 0); +fp.where('Runs', 'db_mode', 'EQUALS', '"no_db"'); +% fp.where('Runs', 'interference_attenuation', 'EQUALS', []); +% fp.where('Runs', 'interference_path_length', 'EQUALS', []); +fp.where('Runs', 'is_mpi', 'EQUALS', 1); +fp.where('Runs', 'pam_level', 'EQUALS', 4); +fp.where('Runs', 'wavelength', 'EQUALS', 1310); +% fp.where('Runs', 'precomp_amp', 'EQUALS', []); +% fp.where('Runs', 'signal_attenuation', 'EQUALS', []); +% fp.where('Runs', 'v_awg', 'EQUALS', []); +fp.where('Runs', 'v_bias', 'EQUALS', 2.65); -[dataTable,sql_query] = db.queryDB(filterParams, selectedFields); +[dataTable, ~] = db.queryDB(fp, db.getTableFieldNames('Runs')); -% dataTable(dataTable.loop_id<200,:) = []; num_occ = 15; -run_par = true; +run_par = false; run_id = dataTable.run_id; params = struct(); @@ -57,6 +62,7 @@ params.smoothing_buffer_length = 0; params.smoothing_buffer_update = 0; params.mu_dc = 0.005; + futures_list = parallel.FevalFuture.empty(); for id = 1:length(dataTable.run_id) run_id = dataTable.run_id(id); diff --git a/projects/ECOC_2025_MPI/load_signal_standalone.m b/projects/ECOC_2025_MPI/load_signal_standalone.m index e54816a..c8a801c 100644 --- a/projects/ECOC_2025_MPI/load_signal_standalone.m +++ b/projects/ECOC_2025_MPI/load_signal_standalone.m @@ -1,5 +1,6 @@ db = DBHandler("type","mysql","dataBase",'labor'); +savePath = 'W:\labdata\ECOC Silas\ecoc_2025\'; fp = QueryFilter(); @@ -9,7 +10,7 @@ fp.where('Runs', 'pam_level','EQUALS', M); fp.where('Runs', 'symbolrate','EQUALS', 112e9); fp.where('Runs', 'fiber_length','EQUALS', 0); fp.where('Runs', 'is_mpi','EQUALS', 1); -fp.where('Runs', 'interference_path_length','EQUALS', 70); +fp.where('Runs', 'interference_path_length','EQUALS', 1000); % fp.where('Runs', 'loop_id','GREATER_THAN', 11); fp.where('Runs', 'sir','EQUALS',20); @@ -28,7 +29,7 @@ for i = 1:size(dataTable,1) M = double(dataTable_.pam_level); duob_mode = db_mode.(strrep(char(dataTable_.db_mode),'"','')); - Tx_signal = load([savePath, char(dataTable_.tx_signal_path)]); + Tx_signal = load([savePath, char(dataTable_.tx_signal_path),'.mat']); Tx_signal = Tx_signal.Digi_sig; Tx_bits = load([savePath, char(dataTable_.tx_bits_path)]); @@ -40,7 +41,7 @@ for i = 1:size(dataTable,1) Symbols = Symbols.Symbols; Scpe_sig_raw = load([savePath, char(dataTable_.rx_raw_path(1))]); - Scpe_sig_raw = Scpe_sig_raw.Scpe_sig_raw; + Scpe_sig_raw = Scpe_sig_raw.Scpe_sig_raw.normalize("mode","rms"); Scpe_sig_raw.plot("displayname",['Scope Signal (Run ID: ',num2str(dataTable_.run_id)],"fignum",dataTable_.run_id,"clear",0); @@ -65,15 +66,15 @@ for i = 1:size(dataTable,1) end - disp(num2str(filterParams.Configurations.interference_path_length)); + disp(num2str(dataTable_.interference_path_length)); var(sep_sig,0,2,'omitnan') -%% + xax_in_sec = ((1:length(avg_sig)) / fsym) * 1e6; figure();hold on; cols = cbrewer2('Paired',8); - % for p = 1:size(avg_sig,1) - % sc=scatter(xax_in_sec,sep_sig(p,:),1,'.','MarkerEdgeColor',cols((2*p)-1,:),'MarkerEdgeAlpha',0.1); - % end + for p = 1:size(avg_sig,1) + sc=scatter(xax_in_sec,sep_sig(p,:),1,'.','MarkerEdgeColor',cols((2*p)-1,:),'MarkerEdgeAlpha',0.2); + end for p = 1:size(avg_sig,1) sc=plot(xax_in_sec,avg_sig(p,:),'LineWidth',1,'Color',cols((2*p),:)); end @@ -83,7 +84,7 @@ for i = 1:size(dataTable,1) xlabel('time in $\mu$s'); ylabel('Normalized Amplitude'); xlim([0 25]); - ylim([-2 2]); + ylim([-3 3]); drawnow; end \ No newline at end of file diff --git a/projects/ECOC_2025_MPI/plots_from_database/bias_vs_ber.m b/projects/ECOC_2025_MPI/plots_from_database/bias_vs_ber.m index b92698e..8941c82 100644 --- a/projects/ECOC_2025_MPI/plots_from_database/bias_vs_ber.m +++ b/projects/ECOC_2025_MPI/plots_from_database/bias_vs_ber.m @@ -1,8 +1,10 @@ -basePath = 'C:\Users\sioe\Documents\MATLAB\imdd_simulation\projects\ECOC_2025\'; -database_name = 'ecoc2025.db'; -database = DBHandler("pathToDB", [basePath, database_name],"type",'mysql'); +% basePath = 'C:\Users\sioe\Documents\MATLAB\imdd_simulation\projects\ECOC_2025\'; +% database_name = 'ecoc2025.db'; +% database = DBHandler("pathToDB", [basePath, database_name],"type",'mysql'); + +database = DBHandler("dataBase",'labor',"type","mysql","user","silas","password","silas","server","192.168.178.192"); filterParams = database.tables; filterParams.Configurations = struct( ... diff --git a/projects/ECOC_2025_MPI/plots_from_database/plot_bias_awg_vs_ber.m b/projects/ECOC_2025_MPI/plots_from_database/plot_bias_awg_vs_ber.m index 3603ac1..30b2657 100644 --- a/projects/ECOC_2025_MPI/plots_from_database/plot_bias_awg_vs_ber.m +++ b/projects/ECOC_2025_MPI/plots_from_database/plot_bias_awg_vs_ber.m @@ -1,34 +1,48 @@ -basePath = 'C:\Users\sioe\Documents\MATLAB\imdd_simulation\projects\ECOC_2025\'; -database_name = 'ecoc2025.db'; -database = DBHandler("pathToDB", [basePath, database_name]); +% basePath = 'C:\Users\sioe\Documents\MATLAB\imdd_simulation\projects\ECOC_2025\'; +% database_name = 'ecoc2025.db'; +% database = DBHandler("pathToDB", [basePath, database_name]); +% +% filterParams = database.tables; +% filterParams.Configurations = struct( ... +% 'symbolrate', 112e9, ... %[224,336,360,390,420,448] +% 'fiber_length', 0, ... +% 'db_mode', '"no_db"', ... +% 'interference_attenuation', [], ... +% 'interference_path_length', [], ... +% 'is_mpi', 0, ... +% 'pam_level', 4, ... +% 'wavelength', 1310, ... +% 'precomp_amp', [], ... +% 'signal_attenuation', [], ... +% 'v_awg', 0.8, ... +% 'v_bias', 2.8 ... +% ); +% +% % filterParams.EqualizerParameters.diff_precode = int32(db_mode.db_encoded); +% % filterParams.EqualizerParameters.equalizer_structure = int32(equalizer_structure.vnle); +% +% selectedFields = {'Configurations.run_id' 'Runs.date_of_run' 'Runs.rx_raw_path' 'Configurations.bitrate' 'Configurations.v_bias' 'Configurations.v_awg' 'Configurations.precomp_amp' 'Configurations.symbolrate' 'Configurations.pam_level'... +% 'Configurations.db_mode' 'Configurations.rop_attenuation' 'Configurations.is_mpi' 'Configurations.interference_attenuation' 'Configurations.signal_attenuation' ... +% 'EqualizerParameters.equalizer_structure' 'EqualizerParameters.diff_precode' 'EqualizerParameters.eq_id' 'Measurements.power_pd_in' ... +% 'Measurements.power_mpi_interference' 'Measurements.power_mpi_signal' 'Results.BER' 'Results.BER_precoded' 'Results.SNR' 'Results.GMI' 'Results.Alpha' 'Results.date_of_processing'}; +% +% [dataTable,sql_query] = database.queryDB(filterParams, selectedFields); -filterParams = database.tables; -filterParams.Configurations = struct( ... - 'symbolrate', 112e9, ... %[224,336,360,390,420,448] - 'fiber_length', 0, ... - 'db_mode', '"no_db"', ... - 'interference_attenuation', [], ... - 'interference_path_length', [], ... - 'is_mpi', 0, ... - 'pam_level', 4, ... - 'wavelength', 1310, ... - 'precomp_amp', [], ... - 'signal_attenuation', [], ... - 'v_awg', 0.8, ... - 'v_bias', 2.8 ... - ); +%% -% filterParams.EqualizerParameters.diff_precode = int32(db_mode.db_encoded); -% filterParams.EqualizerParameters.equalizer_structure = int32(equalizer_structure.vnle); +db = DBHandler("type","mysql","dataBase",'labor'); +db = DBHandler("type","mysql","dataBase",'labor'); + +fp = QueryFilter(); +% fp.where('mpi_superview', 'loop_id','EQUALS', 209); +fp.where('mpi_superview', 'symbolrate','EQUALS', 112e9); +fp.where('mpi_superview', 'pam_level','EQUALS', 4); +fn = [db.getTableFieldNames('mpi_superview')]; +[dataTable,sql_query] = db.queryDB(fp,fn); %dauert lange! 46k einträge -selectedFields = {'Configurations.run_id' 'Runs.date_of_run' 'Runs.rx_raw_path' 'Configurations.bitrate' 'Configurations.v_bias' 'Configurations.v_awg' 'Configurations.precomp_amp' 'Configurations.symbolrate' 'Configurations.pam_level'... - 'Configurations.db_mode' 'Configurations.rop_attenuation' 'Configurations.is_mpi' 'Configurations.interference_attenuation' 'Configurations.signal_attenuation' ... - 'EqualizerParameters.equalizer_structure' 'EqualizerParameters.diff_precode' 'EqualizerParameters.eq_id' 'Measurements.power_pd_in' ... - 'Measurements.power_mpi_interference' 'Measurements.power_mpi_signal' 'Results.BER' 'Results.BER_precoded' 'Results.SNR' 'Results.GMI' 'Results.Alpha' 'Results.date_of_processing'}; -[dataTable,sql_query] = database.queryDB(filterParams, selectedFields); dataTable = cleanUpTable(dataTable); diff --git a/projects/ECOC_2025_MPI/plots_from_database/plot_mpi_trial.m b/projects/ECOC_2025_MPI/plots_from_database/plot_mpi_trial.m index 276c7d2..0359b37 100644 --- a/projects/ECOC_2025_MPI/plots_from_database/plot_mpi_trial.m +++ b/projects/ECOC_2025_MPI/plots_from_database/plot_mpi_trial.m @@ -47,7 +47,7 @@ fp = QueryFilter(); fp.where('mpi_superview', 'symbolrate','EQUALS', 112e9); fp.where('mpi_superview', 'pam_level','EQUALS', 4); fn = [db.getTableFieldNames('mpi_superview')]; -[dataTable,sql_query] = db.queryDB(fp,fn); +[dataTable,sql_query] = db.queryDB(fp,fn); %dauert lange! 46k einträge %% @@ -64,10 +64,10 @@ dataTable_clean(dataTable_clean.BER>0.2,:) = []; cols = linspecer(8); % Ensure color count matches figure() -tiledlayout(1, 4, 'TileSpacing', 'compact', 'Padding', 'compact'); +tiledlayout(1, 1, 'TileSpacing', 'compact', 'Padding', 'compact'); y_here = 0; figcnt = 0; -for int_len = [0,50,300,1000] +for int_len = 1000%[0,50,300,1000] figcnt = figcnt+1; % figure(int_len+1); nexttile; @@ -75,7 +75,7 @@ for int_len = [0,50,300,1000] mode = 4; - for mode = [1,2] + for mode = [1,2,3,4] hold on; dataTable = dataTable_clean; @@ -333,9 +333,11 @@ for int_len = [0,50,300,1000] ylim([9e-5 0.1 ]); xticks([13:2:35]); + set(gca,'YScale','log') + % Enable grid and beautify grid on; - beautifyBERplot; + % beautifyBERplot("logscale",true,"setcolors",false,"setmarkers",false); end end diff --git a/projects/MLSE_nonuniform_states/simulation_nonlin_dsp.m b/projects/MLSE_nonuniform_states/simulation_nonlin_dsp.m index acfa6e0..3e66590 100644 --- a/projects/MLSE_nonuniform_states/simulation_nonlin_dsp.m +++ b/projects/MLSE_nonuniform_states/simulation_nonlin_dsp.m @@ -48,7 +48,7 @@ cols = linspecer(6); rop = [-8]; bwl = [0.5:0.1:1.5]; fsym = [208:16:256].*1e9; -nonlin_mod = [0.5:0.01:0.75]; +nonlin_mod = [0.5:0.1:0.75]; fsym = ones(size(nonlin_mod)).*fsym(1); ffe_results = {}; diff --git a/projects/MPI/MPI_August/EQ_development_ffe_dc_avg.m b/projects/MPI/MPI_August/EQ_development_ffe_dc_avg.m index 1f56f4f..3cf707e 100644 --- a/projects/MPI/MPI_August/EQ_development_ffe_dc_avg.m +++ b/projects/MPI/MPI_August/EQ_development_ffe_dc_avg.m @@ -1,7 +1,7 @@ -Scope_sig = load("projects/MPI_August/scpe_sig.mat","Scpe_sig"); +Scope_sig = load("/MPI_August/scpe_sig.mat","Scpe_sig"); Scope_sig = Scope_sig.Scpe_sig; Symbols = load("projects/MPI_August/symbols.mat","Symbols"); Symbols = Symbols.Symbols;