Working Kerr effect; PDM; speedups; removed unused files
[4yp.git] / splitstepfourier.m
1 function xCDKerr = splitstepfourier(x, D, lambda, z, Tsamp, gamma)
2   %% Simulate chromatic dispersion and Kerr effect,
3   %% with attenuation and amplification.
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:
11   %%  - xCDKerr: x after being dispersed.
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
20   dz = 1; % km
21   dz = dz * 1e3; % m
22   stepnum = z / dz;
23
24   alpha = 0.2; % dB/km
25   alpha = alpha / 10 * log(10); % /km
26   alpha = alpha * 1e-3; % /m
27
28   hhz = 1j * gamma * dz;
29
30
31   xCDKerr = x .* exp(abs(x) .^ 2 .* hhz / 2 - alpha * dz / 4);
32
33   for i = 1 : stepnum
34     xDFT = fft(xCDKerr);
35     n = length(xCDKerr);
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));
40     xCDKerr = ifft(dispDFT);
41
42     xCDKerr = xCDKerr .* exp(abs(xCDKerr) .^ 2 .* hhz - alpha * dz / 2);
43     if mod(i, 50) == 0
44       xCDKerr = xCDKerr * 10; % amplification
45     end
46   end
47   xCDKerr = xCDKerr .* exp(-abs(xCDKerr) .^ 2 .* hhz / 2 + alpha * dz / 4);
48 end
49 %% References
50 %% [1]: S.J. Savory, Digital filters for coherent optical receivers, 2008.