Added adaptive CMA equalizer, "fixed" CD and phase noise
[4yp.git] / CD_AWGN.m
CommitLineData
1eeb62fb
AIL
1numSymbs = 10000;
2M = 4;
3
4Rsym = 2.5e10; % symbol rate (sym/sec)
5
6rolloff = 0.25;
7span = 6; % filter span
8sps = 4; % samples per symbol
9
10fs = Rsym * sps; % sampling freq (Hz)
11Tsamp = 1 / fs;
12
5e9be3c4 13t = (0 : 1 / fs : numSymbs / Rsym + (1.5 * span * sps - 1) / fs).';
1eeb62fb
AIL
14
15EbN0_db = 0:0.2:14;
16EbN0 = 10 .^ (EbN0_db ./ 10);
17
18Es = 1;
19Eb = Es / log2(M);
20N0 = Eb ./ EbN0;
21
22EsN0 = EbN0 .* log2(M);
23EsN0_db = 10 .* log10(EsN0);
24
25plotlen = length(EbN0);
26
27ber = zeros(1, plotlen);
5e9be3c4
AIL
28berNoComp = zeros(1, plotlen);
29berAdapt = zeros(1, plotlen);
30berMatlabAdapt = zeros(1, plotlen);
1eeb62fb
AIL
31
32data = randi([0 M - 1], numSymbs, 1);
5e9be3c4 33modData = pskmod(data, M, pi / M, 'gray');
1eeb62fb
AIL
34x = txFilter(modData, rolloff, span, sps);
35
36%% Simulate chromatic dispersion
5e9be3c4 37D = 17; % ps / (nm km)
1eeb62fb
AIL
38lambda = 1550; % nm
39z = 10; % km
40
41xCD = chromaticDispersion(x, D, lambda, z, Tsamp);
42xCD = normalizeEnergy(xCD, numSymbs, 1);
43
1eeb62fb
AIL
44for i = 1:plotlen
45 snr = EbN0_db(i) + 10 * log10(log2(M)) - 10 * log10(sps);
46 noiseEnergy = 10 ^ (-snr / 10);
47
48 y = awgn(xCD, snr, 'measured');
49
50 yCDComp = CDCompensation(y, D, lambda, z, Tsamp);
51
52 r = rxFilter(yCDComp, rolloff, span, sps);
5e9be3c4 53 rNoComp = rxFilter(y, rolloff, span, sps);
1eeb62fb
AIL
54 %% normalize energy
55 %r = normalizeEnergy(r, numSymbs, 1 + noiseEnergy);
56
57 rSampled = r(sps*span/2+1:sps:(numSymbs + span/2) * sps);
5e9be3c4
AIL
58 rNoCompSampled = rNoComp(sps*span/2+1:sps:(numSymbs+span/2)*sps);
59
60 %% rotate rNoCompSampled to match original data
61 theta = angle(-sum(rNoCompSampled .^ M)) / M;
62 %% if theta approx +pi/M, wrap to -pi/M
63 if abs(theta - pi / M) / (pi / M) < 0.1
64 theta = -pi / M;
65 end
66 theta
67 rNoCompSampled = rNoCompSampled .* exp(-j * theta);
68
69 %% adaptive filter
70 adaptFilterOut = adaptiveCMA(rSampled);
71
72 demodData = pskdemod(rSampled, M, pi / M, 'gray');
73 demodNoComp = pskdemod(rNoCompSampled, M, pi / M, 'gray');
74 demodAdapt = pskdemod(adaptFilterOut, M, pi / M, 'gray');
75 %%demodMatlabAdapt = pskdemod(matlabEq, M, pi / M, 'gray');
1eeb62fb
AIL
76
77 [bitErrors, ber(i)] = biterr(data, demodData);
5e9be3c4
AIL
78 [bitErrors, berNoComp(i)] = biterr(data, demodNoComp);
79 [~, berAdapt(i)] = biterr(data, demodAdapt);
80 %%[~, berMatlabAdapt(i)] = biterr(data, demodMatlabAdapt);
81
82
83 if EbN0_db(i) == 12
84 figure(1);
85 scatterplot(rSampled);
86 title('Constellation after CD compensation');
87 %%scatterplot(modData);
88 %%title('Original constellation');
89 scatterplot(rNoCompSampled);
90 title('Constellation without CD compensation');
91 scatterplot(adaptFilterOut);
92 title('Constellation with CD compensation and adaptive filter');
93 %scatterplot(matlabEq);
94 %title('Matlab equalizer');
95 ber(i)
96 %berNoComp(i)
97 berAdapt(i)
98 berMatlabAdapt(i)
99 end
100
1eeb62fb
AIL
101end
102
103figure(1);
104clf;
105
106%% Plot simulated results
107semilogy(EbN0_db, ber, 'r', 'LineWidth', 2);
108hold on;
5e9be3c4
AIL
109%%semilogy(EbN0_db, berNoComp, 'g', 'LineWidth', 2);
110semilogy(EbN0_db, berAdapt, 'm', 'LineWidth', 1.4);
111%%%semilogy(EbN0_db, berMatlabAdapt, 'c', 'LineWidth', 1.4);
1eeb62fb
AIL
112
113theoreticalPSK(EbN0_db, M, 'b', 'LineWidth', 1);
5e9be3c4
AIL
114legend({'CD + AWGN + CD comp.', 'CD + AWGN + CD comp.~+ CMA', ...
115 'Theoretical AWGN'}, 'Location', 'southwest');
1eeb62fb
AIL
116
117title(strcat(num2str(M), '-PSK with chromatic dispersion and compensation'));
118grid on;
119xlabel('$E_b/N_0$ (dB)');
120ylabel('BER');
121
122formatFigure;