%% ============================================================ % IM/DD Fading Notch – λ_null vs. Bandwidth (Fixed 10 km) % ============================================================ clear; clc; %% Fiber and dispersion parameters lambda0 = 1310e-9; % Zero-dispersion wavelength [m] S0 = 0.09; % Dispersion slope at ZDW [ps/(nm²·km)] L = 10e3; % Fiber length [m] c = physconst('lightspeed'); %% Frequency sweep (defines the desired first-fading notch) f_targets = linspace(40e9, 150e9, 200); % [Hz] f_GHz = f_targets / 1e9; %% Compute wavelength λ_null for each target f_null [lambda_vec, Dacc_vec] = lambda_for_first_null_full(f_targets, L, lambda0, S0); lambda_nm = lambda_vec * 1e9; % Convert to nm Dacc = Dacc_vec; % [ps/nm] %% ------------------------------------------------------------ % Plot λ_null vs. f_null for 10 km fiber % ------------------------------------------------------------ cols = cbrewer2('Paired',10); figure('Color','w'); hold on; hLine = plot(lambda_nm, f_GHz, ... 'LineWidth', 2, ... 'DisplayName', sprintf('L = %.1f km', L/1000), ... 'Color', cols(2,:)); xlabel('Wavelength λ [nm]'); ylabel('First fading notch f_{null} [GHz]'); title('IM/DD Fading Notch Position vs. Wavelength'); grid on; box on; lim = (lambda0.*1e9) - [8, 40]; xlim([lim(2) lim(1)]); yticks([56,75,90,112]); %% ------------------------------------------------------------ % Custom DataTip Template % ------------------------------------------------------------ % Add accumulated dispersion value to the DataTip hLine.DataTipTemplate.DataTipRows(1).Label = 'λ [nm]'; hLine.DataTipTemplate.DataTipRows(2).Label = 'f_{null} [GHz]'; % Create a new row for Dacc dRow = dataTipTextRow('D_{acc} [ps/nm]', Dacc); hLine.DataTipTemplate.DataTipRows(end+1) = dRow; %% ------------------------------------------------------------ % Helper function: lambda_for_first_null_full % ------------------------------------------------------------ function [lambda_vec, Dacc_vec] = lambda_for_first_null_full(f_target, L, lambda0, S0) c = physconst('lightspeed'); S0_si = S0 * 1e3; % ps/(nm²·km) -> s/(m³) lambda_min = 1260e-9; lambda_max = 1360e-9; f_target = f_target(:); N = numel(f_target); lambda_vec = zeros(N,1); Dacc_vec = zeros(N,1); for k = 1:N RHS = c * 0.5 / (f_target(k)^2 * L); fun = @(lambda) -(S0_si/4).*(lambda - (lambda0^4)./(lambda.^3)).*lambda.^2 - RHS; try lambda_sol = fzero(fun, [lambda_min, lambda0 * 0.999]); catch lambda_sol = lambda_min; end lambda_sol = min(max(lambda_sol, lambda_min), lambda_max); lambda_vec(k) = lambda_sol; D_lambda = (S0_si/4) * (lambda_sol - (lambda0^4)/(lambda_sol^3)) / 1e-6; % ps/(nm·km) Dacc_val = D_lambda * (L/1000); % ps/nm Dacc_val = min(max(Dacc_val, -100), 100); Dacc_vec(k) = Dacc_val; end end