4 Rsym = 2.5e10; % symbol rate (sym/sec)
6 span = 6; % filter span
7 sps = 4; % samples per symbol
9 fs = Rsym * sps; % sampling freq (Hz)
12 t = (0 : 1 / fs : numSymbs / Rsym + (1.5 * span * sps - 1) / fs)';
16 EbN0 = 10 .^ (EbN0_db ./ 10);
22 EsN0 = EbN0 .* log2(M);
23 EsN0_db = 10 .* log10(EsN0);
26 data = randi([0 M - 1], numSymbs, 1);
27 modData = pskmod(data, M, 0, 'gray');
29 x = txFilter(modData, rolloff, span, sps);
31 linewidthTx = 0;%1e5; % Hz
32 linewidthLO = 1e6; % Hz
33 %%linewidthTx = Rsym * 1e-4; % Hz
34 %%linewidthLO = Rsym * 1e-3; % Hz
36 [xPN, pTxLO] = phaseNoise(x, linewidthTx, linewidthLO, Tsamp);
38 snr = EbN0_db + 10 * log10(log2(M)) - 10 * log10(sps);
39 noiseEnergy = 10 ^ (-snr / 10);
41 y = awgn(xPN, snr, 'measured');
43 r = rxFilter(y, rolloff, span, sps);
45 [rPhaseEq, phiests] = phaseNoiseCorr(r, M, 40 * sps);
46 rPhaseEq = normalizeEnergy(rPhaseEq, numSymbs, 1 + noiseEnergy);
48 rSampled = rPhaseEq(sps*span/2+1:sps:(numSymbs + span/2) * sps);
49 demodData = pskdemod(rSampled, M, 0, 'gray')';
51 [bitErrors, ber] = biterr(data, demodData)
59 legend('estimate', 'actual');
60 title('Phase noise estimation');
64 plot(t(1:length(x)), real(x));
66 plot(t, real(rPhaseEq), 'r');
67 %%sampledTimes = t(sps*span/2+1:sps:(numSymbs+span/2)*sps);
68 %%plot(sampledTimes, real(rSampled), 'x');
69 legend('original signal', 'corrected received signal');
70 title('Phase noise correction, linewidth 1 MHz, E_b/N_0=8 dB');
71 ylabel('Real part of signals');
72 axis([t(1) t(300) -Inf +Inf]);