180 lines
6.1 KiB
Matlab
180 lines
6.1 KiB
Matlab
|
|
|
|
|
|
% === 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
|
|
|
|
%% |