%% ============================================================ % IM/DD Fading Notch – λ_null vs. Bandwidth (Fixed 10 km) % ============================================================ %% Fiber and dispersion parameters lambda0 = 1315e-9; % Zero-dispersion wavelength [m] S0 = 0.08; % 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 %% ------------------------------------------------------------ % Plot λ_null vs. f_null for 10 km fiber % ------------------------------------------------------------ % figure('Color','w'); % plot(lambda_nm,f_GHz, 'LineWidth', 2); % grid on; box on; cols = cbrewer2('Paired',10); figure('Color','w');hold on plot(lambda_nm, f_GHz, 'LineWidth',2,'DisplayName',sprintf('%d km',L),'Color',cols(2,:)); yticks([56,75,90,112]) f_GHz = [56,75,90,112] * 1e9; [lambda_vec, Dacc_vec] = lambda_for_first_null_full(f_GHz, L, lambda0, S0); lambda_nm = lambda_vec * 1e9; % Convert to nm xticks(round(lambda_nm)) xlabel('$\Delta \lambda$ from ZDW [nm]'); ylabel('$F_{null}$ [GHz]'); grid on; box on; lim=(lambda0.*1e9)-[8,40]; xlim([lim(2) lim(1)]); % ylim([40,130]) %% ------------------------------------------------------------ % Helper function: lambda_for_first_null_full % Stable, single-branch, clamped to O-band % ------------------------------------------------------------ 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³) % Define O-band boundaries [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); % Normal-dispersion branch (λ < λ0) fun = @(lambda) -(S0_si/4).*(lambda - (lambda0^4)./(lambda.^3)).*lambda.^2 - RHS; % Solve within normal-dispersion range try lambda_sol = fzero(fun, [lambda_min, lambda0 * 0.999]); catch lambda_sol = lambda_min; end % Clamp to O-band lambda_sol = min(max(lambda_sol, lambda_min), lambda_max); lambda_vec(k) = lambda_sol; % Compute D(lambda) and accumulated dispersion 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