Minor bug fixes and code formatting
[100GbE-PON.git] / CDCompensation.m
1 function x = CDCompensation(xCD, D, lambda, z, Tsamp)
2   %% Chromatic dispersion compensation.
3   %% Params:
4   %%  - xCD: received waveform with CD
5   %%  - D: dispersion coefficient (ps / (nm km))
6   %%  - lambda: wavelength (nm)
7   %%  - z: length of fibre (km)
8   %%  - Tsamp: sampling time (s)
9   %% Output:
10   %%  - x: xCD after performing CD compensation
11
12   %% Convert everything to SI base units
13   c = 299792458; % m/s
14   D = D * 1e-6; % s/m^2
15   lambda = lambda * 1e-9; % m
16   z = z * 1e3; % m
17
18   %% Discrete FIR filter:
19   %% N: filter length;   k: filter index;   h: filter coefficients.
20   N = 2 * floor(abs(D) * lambda^2 * z / (2 * c * Tsamp^2)) + 1;
21   k = -floor(N / 2) : floor(N / 2);
22   h = exp(-1j * pi * c * Tsamp^2 * k .^ 2 / (D * lambda^2 * z));
23
24   %% Perform filtering in frequency domain
25   len_fft = max(length(xCD), length(h));
26   H = fft(h, len_fft);
27   XCD = fft(xCD, len_fft);
28   x = ifft(H.' .* XCD);
29
30   %% Re-order due to circular convolution
31   l = (N - 1) / 2;
32   if l > 0
33     x = [x(l:end); x(1:l-1)];
34   else
35     x = [x(end); x(1:end-1)];
36   end
37 end