1f3cc2c641e2b156e0213f38a03cb36f637c92fa
[4yp.git] / CDCompensation.m
1 function [yCDComp, kstart] = CDCompensation(y, D, lambda, z, Tsamp)
2   %% Chromatic dispersion compensation.
3   %% Params:
4   %%  - y: 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   %%  - yCDComp: y 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   %% Implementing Eq. (9) in [1].
19   N = 2 * floor(abs(D) * lambda^2 * z / (2 * c * Tsamp^2)) + 1;
20   k = -floor(N / 2) : floor(N / 2);
21   kstart = -floor(N/2);
22
23   % h: FIR filter
24   h = sqrt(j * c * Tsamp^2 / (D * lambda^2 * z)) * ...
25       exp(-j * pi * c * Tsamp^2 * k .^ 2 / (D * lambda^2 * z));
26
27   yCDComp = upfirdn(y, h);
28   yCDComp = yCDComp(N:end); % truncate filter transients
29 end
30 %% References
31 %% [1]: S.J. Savory, Digital filters for coherent optical receivers, 2008.