Minor bug fixes and code formatting
[100GbE-PON.git] / CDCompensation.m
CommitLineData
5117fc58
AIL
1function 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
37end