% === 400G DSP settings === dsp_options = struct(); dsp_options.mode = "run_id"; dsp_options.recipe = @dsp_400g_recipe; dsp_options.append_to_db = false; % dsp_options.append_mpi_reduction_db = false; dsp_options.start_occurence = 1; dsp_options.max_occurences = 16; dsp_options.debug_plots = false; dsp_options.database_type = "mysql"; dsp_options.dataBase = "labor_highspeed"; if ismac dsp_options.storage_path = "/Volumes/media/labdata/sioe_labor"; else dsp_options.storage_path = "W:\labdata\sioe_labor"; end dsp_options.server = "192.168.178.192"; dsp_options.port = 3306; 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); %% Load normal Signal w/o preemphasis cols = cbrewer2('Spectral',6); cols = linspecer(2); len = [1 2 3 5 6 8 10]; idx = 1; for lambda = 1302%[1297.5] fp = QueryFilter(); len = 10; fp.where('Runs','fiber_length','EQUALS', 10); % 1 2 3 5 6 8 10 fp.where('Runs','wavelength','EQUALS', lambda); % fp.where('Runs','bitrate','EQUALS', 450e9); 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, query] = db.queryDB(fp, fields); [~, Symbols_preemph, S, ~] = loadAndSyncRunSignals(dataTable(1,:), dsp_options); average_signals = 1; if average_signals Scpe_sig_avg = S{1}; scope_mean = zeros(size(S{1}.signal)); for n=1:numel(S) scope_mean = scope_mean + S{n}.signal; end scope_mean = scope_mean ./ n; Scpe_sig_avg.signal = scope_mean; ScopeSignal_preemph = preprocessSignal(Scpe_sig_avg, Symbols_preemph, Symbols_preemph.fs,"gaussian_cutoff_factor",0.8); else ScopeSignal = S{1}; ScopeSignal_preemph = preprocessSignal(ScopeSignal, Symbols_preemph, Symbols_preemph.fs); end fignum = 2; dn = sprintf("Rx Spectrum; %d nm",floor(lambda)); ScopeSignal_preemph.spectrum("displayname",dn,'fignum',fignum,'normalizeTo0dB',1,'fft_length',2^15,'show_onesided',1,'color',cols(idx,:)); if len == 10 fp.where('Runs', 'db_mode','EQUALS', 2); fields = db.getTableFieldNames('Runs'); [dataTable, query] = db.queryDB(fp, fields); [~, Symbols_db, S, found_sync] = loadAndSyncRunSignals(dataTable(1,:), dsp_options); ScopeSignal = S{1}; average_signals = 1; if average_signals Scpe_sig_avg = S{1}; scope_mean = zeros(size(S{1}.signal)); for n=1:numel(S) scope_mean = scope_mean + S{n}.signal; end scope_mean = scope_mean ./ n; Scpe_sig_avg.signal = scope_mean; ScopeSignal = preprocessSignal(Scpe_sig_avg, Symbols_preemph, Symbols_preemph.fs,"gaussian_cutoff_factor",0.8); else ScopeSignal = S{1}; ScopeSignal = preprocessSignal(ScopeSignal, Symbols_preemph, Symbols_preemph.fs); end ScopeSignal_DB = preprocessSignal(ScopeSignal, Symbols_db, Symbols_db.fs); end if len == 10 fignum = 2; dn = sprintf("DBS Rx Spectrum; %d nm",floor(lambda)); ScopeSignal_DB.spectrum("displayname",dn,'fignum',fignum,'normalizeTo0dB',1,'fft_length',2^15,'show_onesided',1,'color',cols(idx+1,:)); % Symbols_db.spectrum("displayname",dn,'fignum',fignum,'normalizeTo0dB',1,'fft_length',1024,'show_onesided',1,'color',cols(idx+1,:)); end % Fiber and system parameters lambda0 = 1314e-9; % zero-dispersion wavelength [m] lambda = lambda*1e-9; % operating wavelength [m] S0 = 0.092; % dispersion slope [ps/(nm²·km)] L = 10e3; % fiber length [m] c = physconst('lightspeed'); % Derived quantities S0_si = S0 * 1e3; % → s/m³ D_lambda = (S0/4) * (lambda*1e9 - (lambda0*1e9)^4/(lambda*1e9)^3); % ps/(nm·km) D_si = D_lambda * 1e-6; % → s/m² b2 = -D_si * lambda^2 / (2*pi*c); % s²/m Dacc = D_lambda * L; fprintf('Accumulated Dispersion: %.2f ps/nm \n', Dacc / 1e3); % Frequency grid f_max = 200e9; f = linspace(0, f_max, 5000); % [Hz] % IM/DD transfer function (power fading) phi = 2*pi^2 * b2 * f.^2 * L; H = abs(cos(phi)); % Plot plot(f/1e9, 10*log10(H), 'LineWidth', 1,'Color','black','DisplayName','CD Transfer function','HandleVisibility','on'); grid on; box on; xlabel('Frequency [GHz]'); ylabel('Magnitude [dB]'); % title(sprintf('IM/DD Power Fading: 10 km; 1275nm', lambda*1e9, L/1000),"Interpreter","latex"); % ylim([-20 0]); idx = idx +1; end %% Load normal Signal w/o preemphasis fp.where('Runs', 'db_mode','EQUALS', 0); fields = db.getTableFieldNames('Runs'); [dataTable, query] = db.queryDB(fp, fields); [~, Symbols, Scpe_cell, ~] = loadAndSyncRunSignals(dataTable(1,:), dsp_options); ScopeSignal = Scpe_cell{1}; ScopeSignal_no_preemph = preprocessSignal(ScopeSignal, Symbols, Symbols.fs); fignum = len; ScopeSignal_preemph.spectrum("displayname",'Full Response w/ preemphasis','fignum',fignum,'normalizeTo0dB',0,'color',clr.Paired.dgreen,'fft_length',4096*6); %% Duobinary if len == 10 fp.where('Runs', 'db_mode','EQUALS', 2); fields = db.getTableFieldNames('Runs'); [dataTable, query] = db.queryDB(fp, fields); [~, Symbols_db, Scpe_cell_db, found_sync] = loadAndSyncRunSignals(dataTable(1,:), dsp_options); ScopeSignal = Scpe_cell_db{1}; ScopeSignal_DB = preprocessSignal(ScopeSignal, Symbols_db, Symbols_db.fs); end if len == 10 fignum = 2; dn = sprintf("DBS Rx Spectrum; %d nm",floor(lambda)); ScopeSignal_DB.spectrum("displayname",dn,'fignum',fignum,'normalizeTo0dB',1,'fft_length',2^15,'show_onesided',1,'color',cols(idx,:)); end %%