Commit | Line | Data |
---|---|---|
5117fc58 AIL |
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 |