Working Kerr effect; PDM; speedups; removed unused files
[4yp.git] / splitstepfourier.m
CommitLineData
5fae0077
AIL
1function xCDKerr = splitstepfourier(x, D, lambda, z, Tsamp, gamma)
2 %% Simulate chromatic dispersion and Kerr effect,
3 %% with attenuation and amplification.
f9a73e9e
AIL
4 %% Params:
5 %% - x: input waveform (pulse-shaped)
6 %% - D: dispersion coefficient (ps / (nm km))
7 %% - lambda: wavelength (nm)
8 %% - z: length of fibre (km)
9 %% - Tsamp: sampling time (s)
10 %% Output:
5fae0077 11 %% - xCDKerr: x after being dispersed.
f9a73e9e
AIL
12
13 %% Convert everything to SI base units
14 c = 299792458; % m/s
15 D = D * 1e-6; % s/m^2
16 lambda = lambda * 1e-9; % m
17 z = z * 1e3; % m
18
19 gamma = gamma * 1e-3; % watt^-1 / m
5fae0077
AIL
20 dz = 1; % km
21 dz = dz * 1e3; % m
22 stepnum = z / dz;
f9a73e9e 23
5fae0077
AIL
24 alpha = 0.2; % dB/km
25 alpha = alpha / 10 * log(10); % /km
26 alpha = alpha * 1e-3; % /m
f9a73e9e 27
5fae0077 28 hhz = 1j * gamma * dz;
f9a73e9e 29
f9a73e9e 30
5fae0077 31 xCDKerr = x .* exp(abs(x) .^ 2 .* hhz / 2 - alpha * dz / 4);
f9a73e9e 32
f9a73e9e 33 for i = 1 : stepnum
5fae0077
AIL
34 xDFT = fft(xCDKerr);
35 n = length(xCDKerr);
f9a73e9e
AIL
36 fs = 1 / Tsamp;
37
38 omega = (2*pi * fs / n * [(0 : floor((n-1)/2)), (-ceil((n-1)/2) : -1)]).';
39 dispDFT = xDFT .* exp(-1j * omega.^2 * D * lambda^2 * dz / (4 * pi * c));
5fae0077 40 xCDKerr = ifft(dispDFT);
f9a73e9e 41
5fae0077
AIL
42 xCDKerr = xCDKerr .* exp(abs(xCDKerr) .^ 2 .* hhz - alpha * dz / 2);
43 if mod(i, 50) == 0
44 xCDKerr = xCDKerr * 10; % amplification
45 end
f9a73e9e 46 end
5fae0077 47 xCDKerr = xCDKerr .* exp(-abs(xCDKerr) .^ 2 .* hhz / 2 + alpha * dz / 4);
f9a73e9e
AIL
48end
49%% References
50%% [1]: S.J. Savory, Digital filters for coherent optical receivers, 2008.