numSymbs = 10000; M = 4; Rsym = 2.5e10; % symbol rate (sym/sec) rolloff = 0.25; span = 6; % filter span sps = 4; % samples per symbol fs = Rsym * sps; % sampling freq (Hz) Tsamp = 1 / fs; t = (0 : 1 / fs : numSymbs / Rsym + (1.5 * span * sps - 1) / fs)'; EbN0_db = 8; EbN0 = 10 .^ (EbN0_db ./ 10); Es = 1; Eb = Es / log2(M); N0 = Eb ./ EbN0; EsN0 = EbN0 .* log2(M); EsN0_db = 10 .* log10(EsN0); data = randi([0 M - 1], numSymbs, 1); modData = pskmod(data, M, 0, 'gray'); x = txFilter(modData, rolloff, span, sps); linewidthTx = 0;%1e5; % Hz linewidthLO = 1e6; % Hz %%linewidthTx = Rsym * 1e-4; % Hz %%linewidthLO = Rsym * 1e-3; % Hz [xPN, pTxLO] = phaseNoise(x, linewidthTx, linewidthLO, Tsamp); snr = EbN0_db + 10 * log10(log2(M)) - 10 * log10(sps); noiseEnergy = 10 ^ (-snr / 10); y = awgn(xPN, snr, 'measured'); r = rxFilter(y, rolloff, span, sps); [rPhaseEq, phiests] = phaseNoiseCorr(r, M, 40 * sps); rPhaseEq = normalizeEnergy(rPhaseEq, numSymbs, 1 + noiseEnergy); rSampled = rPhaseEq(sps*span/2+1:sps:(numSymbs + span/2) * sps); demodData = pskdemod(rSampled, M, 0, 'gray')'; [bitErrors, ber] = biterr(data, demodData) figure(2); plot(-phiests); hold on; plot(pTxLO); legend('estimate', 'actual'); title('Phase noise estimation'); hold off; figure(3); plot(t(1:length(x)), real(x)); hold on; plot(t, real(rPhaseEq), 'r'); %%sampledTimes = t(sps*span/2+1:sps:(numSymbs+span/2)*sps); %%plot(sampledTimes, real(rSampled), 'x'); legend('original signal', 'corrected received signal'); title('Phase noise correction, linewidth 1 MHz, E_b/N_0=8 dB'); ylabel('Real part of signals'); axis([t(1) t(300) -Inf +Inf]); hold off; formatFigure;