32 lines
1.2 KiB
Matlab
32 lines
1.2 KiB
Matlab
function dispersion_vector = getDispersionVector(N, D, ref_zdw, randomize_ZDW, randomkey)
|
||
% s.MATLAB version of the Python generator shown above.
|
||
% Returns an N×1 vector (ps/(nm·km)).
|
||
%
|
||
% D is the nominal dispersion magnitude. For D>0 the link is segmented with
|
||
% alternating sign (+D, -D, +D, …). For D==0 it is flat (0) except for
|
||
% ZDW randomization. The ZDW detuning is ~N(0, 2 nm) around 1310 nm and is
|
||
% converted to dispersion via 0.09 ps/(nm·km) per nm.
|
||
|
||
% constants (matching the Python code)
|
||
meanLambda_nm = 1310; % center wavelength
|
||
sigma_nm = 2; % ZDW sigma
|
||
Dslope = 0.07; % ps/(nm·km) per nm detuning
|
||
|
||
% random ZDW-induced dispersion offset
|
||
if randomize_ZDW
|
||
rng(randomkey, 'twister');
|
||
rand_zdws_nm = meanLambda_nm + sigma_nm .* randn(N,1);
|
||
rand_D = (rand_zdws_nm - ref_zdw) .* Dslope; % ps/(nm·km)
|
||
else
|
||
rand_D = zeros(N,1);
|
||
end
|
||
|
||
% nominal segmented pattern (match Python intent; keep length N)
|
||
if D > 0
|
||
base = (-1) .^ ((0:N-1).'); % +1,-1,+1,-1,...
|
||
else % D == 0 (or anything else)
|
||
base = ones(N,1);
|
||
end
|
||
|
||
dispersion_vector = base .* D + rand_D; % ps/(nm·km)
|
||
end |