Commit | Line | Data |
---|---|---|
5e9be3c4 AIL |
1 | numSymbs = 5e5; |
2 | M = 4; | |
3 | rolloff = 0.5; | |
1eeb62fb | 4 | |
5e9be3c4 | 5 | Rsym = 2.5e10; % symbol rate (sym/sec) |
1eeb62fb | 6 | |
5e9be3c4 AIL |
7 | span = 6; % filter span |
8 | sps = 4; % samples per symbol | |
1eeb62fb | 9 | |
5e9be3c4 AIL |
10 | fs = Rsym * sps; % sampling freq (Hz) |
11 | Tsamp = 1 / fs; | |
1eeb62fb | 12 | |
5e9be3c4 | 13 | t = (0 : 1 / fs : numSymbs / Rsym + (1.5 * span * sps - 1) / fs).'; |
1eeb62fb | 14 | |
1eeb62fb | 15 | |
5e9be3c4 AIL |
16 | EbN0_db = 0:0.2:14; |
17 | EbN0 = 10 .^ (EbN0_db ./ 10); | |
1eeb62fb | 18 | |
5e9be3c4 AIL |
19 | Es = 1; |
20 | Eb = Es / log2(M); | |
21 | N0 = Eb ./ EbN0; | |
1eeb62fb | 22 | |
5e9be3c4 AIL |
23 | EsN0 = EbN0 .* log2(M); |
24 | EsN0_db = 10 .* log10(EsN0); | |
1eeb62fb | 25 | |
5e9be3c4 | 26 | plotlen = length(EbN0); |
1eeb62fb | 27 | |
5e9be3c4 | 28 | ber = zeros(1, plotlen); |
1eeb62fb | 29 | |
5e9be3c4 AIL |
30 | data = randi([0 M - 1], numSymbs, 1); |
31 | %%modData = dpskmod(data, M, pi / M, 'gray'); | |
32 | modData = dpskmod(data, M, 0, 'gray'); | |
1eeb62fb | 33 | |
5e9be3c4 | 34 | x = txFilter(modData, rolloff, span, sps); |
1eeb62fb | 35 | |
5e9be3c4 AIL |
36 | linewidthTx = 0; % Hz |
37 | %%linewidthLO = 1e6; % Hz | |
38 | linewidthLO = Rsym * 1e-3; | |
1eeb62fb | 39 | |
1eeb62fb | 40 | |
5e9be3c4 | 41 | avgSa = 40; |
1eeb62fb | 42 | |
1eeb62fb | 43 | |
5e9be3c4 | 44 | [xPN, pTxLO] = phaseNoise(x, linewidthTx, linewidthLO, Tsamp); |
1eeb62fb | 45 | |
5e9be3c4 AIL |
46 | for i = 1:plotlen |
47 | snr = EbN0_db(i) + 10 * log10(log2(M)) - 10 * log10(sps); | |
48 | noiseEnergy = 10 ^ (-snr / 10); | |
1eeb62fb | 49 | |
5e9be3c4 | 50 | y = awgn(xPN, snr, 'measured'); |
1eeb62fb | 51 | |
5e9be3c4 AIL |
52 | r = rxFilter(y, rolloff, span, sps); |
53 | %% normalize energy | |
54 | r = normalizeEnergy(r, numSymbs, 1 + noiseEnergy); | |
1eeb62fb | 55 | |
5e9be3c4 AIL |
56 | rSampled = r(sps*span/2+1:sps:(numSymbs+span/2)*sps); |
57 | [rSaPhEq, phiests] = phaseNoiseCorr(rSampled, M, avgSa); | |
1eeb62fb | 58 | |
5e9be3c4 | 59 | adaptiveFilterOut = adaptiveCMA(rSaPhEq.'); |
1eeb62fb | 60 | |
5e9be3c4 AIL |
61 | demodData = dpskdemod(rSaPhEq, M, 0, 'gray').'; |
62 | demodAdapt = dpskdemod(adaptiveFilterOut, M, 0, 'gray'); | |
1eeb62fb | 63 | |
5e9be3c4 | 64 | [~, ber(i)] = biterr(data, demodData); |
1eeb62fb | 65 | |
5e9be3c4 AIL |
66 | if EbN0_db(i) == 8 |
67 | figure(1234); | |
68 | plot(repelem(-phiests, sps)); | |
69 | hold on; | |
70 | plot(pTxLO); | |
71 | legend('estimate', 'actual'); | |
72 | hold off; | |
1eeb62fb | 73 | |
5e9be3c4 AIL |
74 | figure(1); |
75 | scatterplot(rSaPhEq); | |
76 | title('rSaPhEq'); | |
1eeb62fb | 77 | end |
5e9be3c4 | 78 | end |
1eeb62fb AIL |
79 | |
80 | ||
5e9be3c4 AIL |
81 | figure(1); |
82 | clf; | |
1eeb62fb | 83 | |
5e9be3c4 AIL |
84 | %% Plot simulated results |
85 | semilogy(EbN0_db, ber, 'r', 'LineWidth', 2); | |
86 | hold on; | |
1eeb62fb | 87 | |
5e9be3c4 AIL |
88 | theoreticalPSK(EbN0_db, M, 'b', 'LineWidth', 1); |
89 | legend({'Simulated phase noise + correction', 'Theoretical AWGN'}, ... | |
90 | 'Location', 'southwest'); | |
1eeb62fb | 91 | |
1eeb62fb | 92 | |
5e9be3c4 AIL |
93 | title({'QPSK with phase nosie and correction', ... |
94 | strcat(num2str(numSymbs * log2(M) / 1e3), '~kbit, LO~', ... | |
95 | num2str(linewidthLO / 1e6), '~MHz, Av~', num2str(avgSa), ... | |
96 | '~Sa')}); | |
97 | grid on; | |
98 | xlabel('$E_b/N_0$ (dB)'); | |
99 | ylabel('BER'); | |
100 | ||
101 | formatFigure; |