diff --git a/projects/HighSpeedExperiment_2024/a_minimal_example.m b/projects/HighSpeedExperiment_2024/a_minimal_example.m index 966d5b9..2a94e13 100644 --- a/projects/HighSpeedExperiment_2024/a_minimal_example.m +++ b/projects/HighSpeedExperiment_2024/a_minimal_example.m @@ -4,70 +4,77 @@ dsp_options.storage_path = 'Z:\2024\sioe_labor\'; dsp_options.max_occurences = 1; db = DBHandler("dataBase", 'labor_highspeed', "type", 'mysql' ); -fp = QueryFilter(); - -fp.where('Runs','fiber_length','EQUALS', 2); -fp.where('Runs','wavelength','EQUALS', 1310); -fp.where('Runs','bitrate','EQUALS', 300e9); -fp.where('Runs','pam_level','EQUALS', 4); -fp.where('Runs','rop_attenuation','EQUALS', 0); -fp.where('Runs','is_mpi','EQUALS', 0); -fp.where('Runs', 'db_mode','EQUALS', 0); -% fields = db.getTableFieldNames('Runs'); -% [dataTable,~] = db.queryDB(fp, fields); -fields = db.getTableFieldNames('power_state_info'); -fields = [fields; db.getTableFieldNames('Runs')]; -fields = [fields; db.getTableFieldNames('dashboard_ungrouped_alltime')]; %dashboard_ungrouped_after_nov_2025 dashboard_ungrouped_aug_nov_2025 -fields = unique(fields); -[dataTable,~] = db.queryDB(fp, fields); - - -fsym = dataTable(1,:).symbolrate; -M = double(dataTable(1,:).pam_level); -duob_mode = db_mode(strrep(dataTable(1,:).db_mode,'"','')); - - -% Load and Sync signal data from DB -[Tx_bits, Symbols, Scpe_cell, ~] = loadAndSyncSignalDataFromDb(dataTable(1,:), dsp_options); - -% Preprocess signal -Scpe_sig = preprocessSignal(Scpe_cell{1}, Symbols, fsym); - -% Show spectrum -Scpe_sig.spectrum("fignum",1,"displayname",'Rx') - -% meta = struct(); -% meta.varnames = dataTable.Properties.VariableNames; +% fp = QueryFilter(); % -% for k = 1:numel(meta.varnames) -% v = meta.varnames{k}; -% col = dataTable.(v); +% fp.where('Runs','fiber_length','EQUALS', 2); +% fp.where('Runs','wavelength','EQUALS', 1310); +% fp.where('Runs','bitrate','EQUALS', 300e9); +% fp.where('Runs','pam_level','EQUALS', 4); +% fp.where('Runs','rop_attenuation','EQUALS', 0); +% fp.where('Runs','is_mpi','EQUALS', 0); +% fp.where('Runs', 'db_mode','EQUALS', 0); +% % fields = db.getTableFieldNames('Runs'); +% % [dataTable,~] = db.queryDB(fp, fields); % -% if isnumeric(col) || islogical(col) -% meta.(v) = col; -% elseif isstring(col) -% meta.(v) = cellstr(col); -% elseif iscellstr(col) -% meta.(v) = col; -% else -% error("Unsupported table column type: %s", class(col)) -% end -% end -% exp_data.metadata = meta; -exp_data = struct(); -exp_data.metadata = dataTable; -exp_data.tx_bits = Tx_bits.signal; -exp_data.tx_signal = Symbols.signal; -exp_data.rx_signal_2sps = Scpe_sig.signal; +run_ids = [ 993 1205 1413 1623 1833 2043 2253 2628 2836 2958 3000 3042 3323 5098 5225 5267 5309]; -fname = dataTable(1,:).rx_raw_path; -[~, filename, ext] = fileparts(fname); -filename = strrep(filename,"_raw_signal",""); -filename = filename + ext; -savepath = fullfile('F:\2024\sioe_labor\export_skuehl\',filename); -save(savepath,'exp_data','-v7.3'); +for id = run_ids + + fp = QueryFilter(); + fp.where('Runs', 'run_id','EQUALS', id); + fields = db.getTableFieldNames('power_state_info'); + fields = [fields; db.getTableFieldNames('Runs')]; + fields = [fields; db.getTableFieldNames('dashboard_ungrouped_alltime')]; %dashboard_ungrouped_after_nov_2025 dashboard_ungrouped_aug_nov_2025 + fields = unique(fields); + [dataTable,~] = db.queryDB(fp, fields); + + fsym = dataTable(1,:).symbolrate; + M = double(dataTable(1,:).pam_level); + duob_mode = db_mode(strrep(dataTable(1,:).db_mode,'"','')); + + % Load and Sync signal data from DB + [Tx_bits, Symbols, Scpe_cell, ~] = loadAndSyncSignalDataFromDb(dataTable(1,:), dsp_options); + + % Preprocess signal + Scpe_sig = preprocessSignal(Scpe_cell{1}, Symbols, fsym); + + % Show spectrum + Scpe_sig.spectrum("fignum",1,"displayname",'Rx') + + meta = struct(); + meta.varnames = dataTable.Properties.VariableNames; + + for k = 1:numel(meta.varnames) + v = meta.varnames{k}; + col = dataTable.(v); + + if isnumeric(col) || islogical(col) + meta.(v) = col; + elseif isstring(col) + meta.(v) = cellstr(col); + elseif iscellstr(col) + meta.(v) = col; + else + error("Unsupported table column type: %s", class(col)) + end + end + exp_data.metadata = meta; + + exp_data = struct(); + exp_data.metadata = dataTable; + exp_data.tx_bits = Tx_bits.signal; + exp_data.tx_signal = Symbols.signal; + exp_data.rx_signal_2sps = Scpe_sig.signal; + + fname = dataTable(1,:).rx_raw_path; + [~, filename, ext] = fileparts(fname); + filename = strrep(filename,"_raw_signal",""); + filename = filename + ext; + savepath = fullfile('F:\2024\sioe_labor\export_skuehl\',filename); + save(savepath,'exp_data','-v7.3'); +end diff --git a/projects/WDM/WDM_auswertung.m b/projects/WDM/WDM_auswertung.m index d13c97f..1f3b949 100644 --- a/projects/WDM/WDM_auswertung.m +++ b/projects/WDM/WDM_auswertung.m @@ -21,7 +21,7 @@ Smlse = cell(1,N); Sdbt = cell(1,N); % Choose your quantile band. For your old style, use 0.04/0.99: -qLow = 0.0; % lower quantile (e.g., 0.04 for old script) +qLow = 0.0; % lower quantile (e.g.,s 0.04 for old script) qHigh = 1; % upper quantile (e.g., 0.99 for old script) cols = linspecer(N); % one color per wavelength (Ch) cols = cbrewer2('set1',N); @@ -51,10 +51,10 @@ for l = 1:N showLegend = 1; % one legend entry per technique % Plot shaded band + mean line with boundedline - % plotBandMeanBL(rop, ffe_mat, cols(l,:), sprintf('FFE @ %.1d nm',round(wavelengthplan(l))), qLow, qHigh, '--s', showLegend); + plotBandMeanBL(rop, ffe_mat, cols(l,:), sprintf('FFE @ %.1d nm',round(wavelengthplan(l))), qLow, qHigh, '--s', showLegend); % scatter(Sffe,fec.*ones(size(Sffe)),20,'v','MarkerFaceColor','black'); - plotBandMeanBL(rop, vnle_mat, cols(l,:), sprintf('VNLE @ %.1d nm',round(wavelengthplan(l))), qLow, qHigh, '--x', showLegend); + % plotBandMeanBL(rop, vnle_mat, cols(l,:), sprintf('VNLE @ %.1d nm',round(wavelengthplan(l))), qLow, qHigh, '--x', showLegend); % plotBandMeanBL(rop, mlse_mat, cols(l,:), sprintf('VNLE+PF+MLSE @ %.1d nm',round(wavelengthplan(l))), qLow, qHigh, '-o', showLegend); @@ -73,7 +73,7 @@ ylim([1e-5 0.3]); grid on; legend show; - +%% S_cell = Sdbt; S_cell =Smlse; S_cell = {Svnle,Smlse,Sdbt}; @@ -106,7 +106,7 @@ for i = 1:length(S_cell) 'Bandwidth', 0.05); ylim([floor(min(S_mat,[],'all')), ceil(max(S_mat,[],'all'))]) - ylim([-8 0]); + % ylim([-8 0]); ylabel('ROP at FEC crossing'); title(sprintf('RROP to cross BER %.2e', fec)); grid on; box on; @@ -118,10 +118,6 @@ end - - - - %% ================= helper ================= function plotBandMeanBL(x, Y, color, techLabel, qLow, qHigh, lineSpec, showLegend) % Y: (nPoints x nRealizations) diff --git a/projects/WDM/WDM_model_16x200.m b/projects/WDM/WDM_model_16x200.m index 7000966..3d6dac9 100644 --- a/projects/WDM/WDM_model_16x200.m +++ b/projects/WDM/WDM_model_16x200.m @@ -6,9 +6,9 @@ run(fullfile(fileparts(mfilename('fullpath')),'WDM_settings.m')); s.num_realiz = 2; s.wavelengthplan = calcWavelengthPlan(16,400e9,1310); % wavelengthplan = [1295,1305,1315,1325]; -link_length = 0; -pmd = 0.1; -gamma = 0.0023; +link_length = 1; +s.pmd = 0.1; +s.gamma = 0.0023; s.M = 4; m = floor(log2(s.M)*10)/10; @@ -52,7 +52,7 @@ f_plan = physconst('lightspeed')./(s.wavelengthplan.*1e-9); margin = 25e12; % some THz left and right f_span = (max(f_plan)+margin)-(min(f_plan)-margin); f_nyq = f_span/2; -kover = 8; +kover = 4; upsample_required = f_nyq./(fdac*kover/2); upsample_pow = 2^nextpow2(upsample_required); upsample_ceil = ceil(upsample_required); @@ -64,13 +64,23 @@ signal_cell = {}; Symbols = {}; Tx_bits = {}; -s.rop = -6:0.75:-0.75; +s.rop = -12:0.75:-0.75; output_ffe = cell(length(s.wavelengthplan),length(s.rop),s.num_realiz); output_vnle = cell(length(s.wavelengthplan),length(s.rop),s.num_realiz); output_mlse = cell(length(s.wavelengthplan),length(s.rop),s.num_realiz); output_dbt = cell(length(s.wavelengthplan),length(s.rop),s.num_realiz); +s.p = "pair"; +switch s.p + case "co" + pol_rot = 100.*ones(1,length(s.wavelengthplan)); + case "pair" + pol_rot = repmat([100,100,0,0],1,length(s.wavelengthplan)/4); + case "alt" + pol_rot = repmat([100,0,100,0],1,length(s.wavelengthplan)/4); +end + for realiz = 1:s.num_realiz @@ -100,7 +110,7 @@ for realiz = 1:s.num_realiz %%%%% s.MODULATE E/O CONVERSION %%%%% Eml_out = EML("mode",eml_mode.im_cosinus,"power",3,"fsimu",El_sig.fs,"lambda",s.wavelengthplan(l),"bias",vbias,"u_pi",u_pi,"linewidth",laser_linewidth,"randomkey",s.random_key+l+realiz).process(El_sig); - signal_cell{l} = Polarization_Controller("mode","rot_power","desired_power",100).process(Eml_out); + signal_cell{l} = Polarization_Controller("mode","rot_power","desired_power",pol_rot(l)).process(Eml_out); end Opt_sig_wdm = Optical_Multiplex("fs_in",fdac*kover,"fs_out",upsample_pow*fdac*kover,... @@ -108,7 +118,7 @@ for realiz = 1:s.num_realiz Opt_sig_wdm = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power","amplification_db",3+10*log10(N)).process(Opt_sig_wdm); - % Opt_sig_wdm.spectrum("fignum",101,"displayname",'bla','normalizeTo0dB',0,'lambda0_nm',1310,'useWavelengthAxis',0); + Opt_sig_wdm.spectrum("fignum",101,"displayname",'bla','normalizeTo0dB',0,'lambda0_nm',1310,'useWavelengthAxis',0); % Opt_sig_wdm.spectrum("fignum",101,"displayname",'bla','normalizeTo0dB',1,'max_num_lines',2); @@ -123,7 +133,7 @@ for realiz = 1:s.num_realiz Dvec = getDispersionVector(nSegments, D_local, zdw, randomize_D, s.random_key+realiz); for seg = 1:nSegments - Opt_sig_wdm_fib = DP_Fiber("L",segment_length,"D",Dvec(s),"Dpmd",pmd,"Ds",0.07,... + Opt_sig_wdm_fib = DP_Fiber("L",segment_length,"D",Dvec(seg),"Dpmd",s.pmd,"Ds",0.07,... "beat_len",10,"corr_len",100,"dz",1,"manakov",0,... "gamma",s.gamma,"lambda",zdw,"n_waveplates",10,"SS_dphimax",0.01,... "SS_dzmax",50,"SS_dzmin",10,"X_alpha",0.3,"X_beta",0,"rng",1).process(Opt_sig_wdm_fib); @@ -135,11 +145,11 @@ for realiz = 1:s.num_realiz % Opt_sig_wdm_fib.move_it_spectrum("fignum",100212,"displayname",'bla'); % Opt_sig = Fiber("fsimu",Opt_sig.fs,"fiber_length",s.link_length/1000,"alpha",0.3,"D",0,"lambda0",1310,"s.gamma",0,"Dslope",0.07).process(Opt_sig) - Opt_sig_wdm_demux = Optical_Demultiplex("attenuation",0,"B",200e9,"filtype",1,"fs_out",Opt_sig_wdm_rx.fs/upsample_pow,"fs_in",Opt_sig_wdm_rx.fs,"lambda_center",1310).process(Opt_sig_wdm_fib); + Opt_sig_wdm_demux = Optical_Demultiplex("attenuation",0,"B",200e9,"filtype",1,"fs_out",fdac*kover,"fs_in",fdac*kover*upsample_pow,"lambda_center",1310).process(Opt_sig_wdm_fib); for ri = 1:length(s.rop) - parfor l = 1:N + for l = 1:N %%%%%% ROP %%%%%% Opt_sig_wdm_rx = Amplifier("amp_mode","ideal_no_noise","gain_mode","output_power","amplification_db",s.rop(ri)).process(Opt_sig_wdm_demux{l}); % rop+10*log10(N)