Commit | Line | Data |
---|---|---|
1eeb62fb AIL |
1 | numSymbs = 10000; |
2 | M = 4; | |
3 | ||
4 | Rsym = 2.5e10; % symbol rate (sym/sec) | |
5e9be3c4 | 5 | rolloff = 0.5; |
1eeb62fb | 6 | span = 6; % filter span |
5fae0077 | 7 | sps = 8; % samples per symbol |
1eeb62fb AIL |
8 | |
9 | fs = Rsym * sps; % sampling freq (Hz) | |
10 | Tsamp = 1 / fs; | |
11 | ||
5e9be3c4 | 12 | t = (0 : 1 / fs : numSymbs / Rsym + (1.5 * span * sps - 1) / fs).'; |
1eeb62fb AIL |
13 | |
14 | ||
15 | EbN0_db = 8; | |
16 | EbN0 = 10 .^ (EbN0_db ./ 10); | |
17 | ||
18 | Es = 1; | |
19 | Eb = Es / log2(M); | |
20 | N0 = Eb ./ EbN0; | |
21 | ||
22 | EsN0 = EbN0 .* log2(M); | |
23 | EsN0_db = 10 .* log10(EsN0); | |
24 | ||
25 | ||
26 | data = randi([0 M - 1], numSymbs, 1); | |
f9a73e9e AIL |
27 | pskSym = pskmod(data, M, pi/M, 'gray'); |
28 | dpskSym = dpskmod(data, M, pi/M, 'gray'); | |
1eeb62fb | 29 | |
f9a73e9e AIL |
30 | xPSK = txFilter(pskSym, rolloff, span, sps); |
31 | xDPSK = txFilter(dpskSym, rolloff, span, sps); | |
1eeb62fb | 32 | |
5e9be3c4 | 33 | linewidthTx = 0; % Hz |
f9a73e9e AIL |
34 | linewidthLO = 10e6; % Hz |
35 | ||
36 | [xPSKpn, pTxLoPSK] = phaseNoise(xPSK, linewidthTx, linewidthLO, Tsamp); | |
37 | [xDPSKpn, pTxLoDPSK] = phaseNoise(xDPSK, linewidthTx, linewidthLO, Tsamp); | |
1eeb62fb | 38 | |
1eeb62fb AIL |
39 | |
40 | snr = EbN0_db + 10 * log10(log2(M)) - 10 * log10(sps); | |
1eeb62fb | 41 | |
f9a73e9e AIL |
42 | yPSK = awgn(xPSKpn, snr, 'measured'); |
43 | yDPSK = xDPSKpn; | |
44 | ||
45 | rPSK = rxFilter(yPSK, rolloff, span, sps); | |
46 | rDPSK = rxFilter(yDPSK, rolloff, span, sps); | |
1eeb62fb | 47 | |
5fae0077 AIL |
48 | sps = 2; |
49 | Tsamp = Tsamp * 4; | |
1eeb62fb | 50 | |
5fae0077 AIL |
51 | rPSKSa = rPSK(1:2:end); |
52 | rDPSKSa = rDPSK(1:2:end); | |
1eeb62fb | 53 | |
5fae0077 | 54 | [rPSKSaPhEq, phiestsPSK] = phaseNoiseCorr(rPSKSa, M, pi/M, 80); |
1eeb62fb | 55 | |
f9a73e9e AIL |
56 | demodPSK = pskdemod(rPSKSaPhEq, M, pi/M, 'gray'); |
57 | demodDPSK = dpskdemod(rDPSKSa, M, pi/M, 'gray'); | |
1eeb62fb | 58 | |
f9a73e9e AIL |
59 | |
60 | [bitErrors, ber] = biterr(data, demodPSK.') | |
1eeb62fb AIL |
61 | |
62 | ||
63 | figure(2); | |
5fae0077 | 64 | plot(t(1:80000), repelem(-phiestsPSK, 8)); |
1eeb62fb | 65 | hold on; |
5fae0077 | 66 | plot(t(1:80000), pTxLoPSK(1:80000)); |
1eeb62fb AIL |
67 | legend('estimate', 'actual'); |
68 | title('Phase noise estimation'); | |
69 | hold off; | |
f9a73e9e | 70 | return |
1eeb62fb | 71 | figure(3); |
5e9be3c4 | 72 | plot(t(1:length(x)), real(normalizeEnergy(x, numSymbs*sps, 1))); |
1eeb62fb | 73 | hold on; |
5e9be3c4 AIL |
74 | %%plot(t, real(rPhaseEq), 'r'); |
75 | sampledTimes = t(sps*span/2+1:sps:(numSymbs+span/2)*sps); | |
1eeb62fb | 76 | %%plot(sampledTimes, real(rSampled), 'x'); |
5e9be3c4 | 77 | plot(sampledTimes, real(normalizeEnergy(rSaPhEq, numSymbs, 1)), 'x'); |
1eeb62fb | 78 | legend('original signal', 'corrected received signal'); |
5e9be3c4 | 79 | title('Phase noise correction, linewidth 1 MHz, $E_b/N_0=8$ dB'); |
1eeb62fb AIL |
80 | ylabel('Real part of signals'); |
81 | axis([t(1) t(300) -Inf +Inf]); | |
82 | hold off; | |
83 | formatFigure; |