Chromatic dispersion and line width phase noise
[4yp.git] / passband.m
index 5424ea4..9e88af6 100644 (file)
@@ -10,25 +10,12 @@ function passband(rolloff, M, numSymbs)
     rolloff = 0.5;
   end
 
-
   %% https://www.mathworks.com/help/comm/examples/passband-modulation-with-adjacent-channel-interference.html
-  Rsym = 1e6; % symbol rate (sym/sec)
+  Rsym = 2.5e10; % symbol rate (sym/sec)
 
   span = 6; % filter span
   sps = 4; % samples per symbol
 
-  txFilter = comm.RaisedCosineTransmitFilter...
-                 ('Shape', 'Square root', ...
-                  'RolloffFactor', rolloff, ...
-                  'FilterSpanInSymbols', span, ...
-                  'OutputSamplesPerSymbol', sps);
-  rxFilter = comm.RaisedCosineReceiveFilter...
-                 ('Shape', 'Square root', ...
-                  'RolloffFactor', rolloff, ...
-                  'FilterSpanInSymbols', span, ...
-                  'InputSamplesPerSymbol', sps, ...
-                  'DecimationFactor', 1);
-
   fs = Rsym * sps; % sampling freq (Hz)
 
   t = (0 : 1 / fs : numSymbs / Rsym + (1.5 * span * sps - 1) / fs)';
@@ -49,80 +36,39 @@ function passband(rolloff, M, numSymbs)
   ber = zeros(1, plotlen);
 
 
-
-
   data = randi([0 M - 1], numSymbs, 1);
   modData = pskmod(data, M, 0, 'gray');
 
-  xBaseband = txFilter([modData; zeros(span, 1)]);
-
+  xBaseband = txFilter(modData, rolloff, span, sps);
 
-  %fc = 2.5e6; % Carrier freq (Hz)
-  %carrier = sqrt(2) * exp(j * 2 * pi * fc * t);
-
-  %xPassbandIdeal = normalizeEnergy...
-  %                   (real(xBaseband .* carrier(1:length(xBaseband))), numSymbs, 1);
-
-  %txLOFreq = [2.49e6, 2.5e6, 2.51e6];
-  %%txLOEnergy = [0.05, 0.9, 0.05];
-  %txLOEnergy = [0 1 0];
-  txLOFreq = [1e8];
-  txLOEnergy = [1];
-
-  carrier = zeros(length(t), 1);
-  for i = 1 : length(txLOFreq)
-    carrier = carrier + ...
-              sqrt(2 * txLOEnergy(i)) * exp(j * 2 * pi * txLOFreq(i) * t);
-  end
+  fc = 1e12; % Carrier freq (Hz)
+  carrier = sqrt(2) * exp(j * 2 * pi * fc * t);
 
-  xPassband = normalizeEnergy...
-                (xBaseband .* carrier(1:length(xBaseband)), numSymbs, 1);
+  xPassband = xBaseband .* carrier(1:length(xBaseband));
 
   for i = 1:plotlen
-    snr = EbN0_db(i) + 10 * log10(log2(M)) - 10 * log10(sps); % why sps?
+    snr = EbN0_db(i) + 10 * log10(log2(M)) - 10 * log10(sps);
     noiseEnergy = 10 ^ (-snr / 10);
 
     yPassband = awgn(xPassband, snr, 'measured');
-
-    rBaseband = rxFilter([yPassband .* conj(carrier(1:length(yPassband))); zeros(span * sps, 1)]);
-    %% truncate filter transients
-    rBaseband = rBaseband(span * sps / 2 + 1 : end);
-    %% normalize energy
-    rBaseband = normalizeEnergy(rBaseband, numSymbs, 1 + noiseEnergy);
+    yLO = yPassband .* conj(carrier(1:length(yPassband)));
+    rBaseband = rxFilter(yLO, rolloff, span, sps);
 
     rSampled = rBaseband(sps*span/2+1:sps:(numSymbs + span/2) * sps);
 
     demodData = pskdemod(rSampled, M, 0, 'gray');
     [bitErrors, ber(i)] = biterr(data, demodData);
-
   end
 
-  fig1 = figure(1);
+  figure(1);
   clf;
 
   %% Plot simulated results
   semilogy(EbN0_db, ber, 'r', 'LineWidth', 2);
   hold on;
 
-  %% Plot theoretical curve
-  %% BPSK: bit error when noise Nr > sqrt(Eb)
-  %%   Pr(Nr > sqrt(Eb))
-  %% = Pr(Z > sqrt(Eb) / sqrt(N0/2))
-  %%
-  %% QPSK = 2 BPSKs, one real and one imaginary, each with one bit
-  %% so BER is the same as BPSK (assuming Gray code)
-  if M == 2 || M == 4
-    ber_th = qfunc(sqrt(2 * EbN0));
-    semilogy(EbN0_db, ber_th, 'b', 'LineWidth', 1);
-    legend('Simulated RRC', 'Discrete');
-  else
-    %% Approximation: J.G. Proakis and M. Salehi, 2000, Contemporary
-    %%                Communication Systems using MATLAB (Equations
-    %%                7.3.18 and 7.3.19), Brooks/Cole.
-    ber_ap = 2 * qfunc(sqrt(EbN0 * log2(M) * 2) * sin(pi / M)) / log2(M);
-    semilogy(EbN0_db, ber_ap, 'b', 'LineWidth', 1);
-    legend('Simulated RRC', 'Discrete');
-  end
+  theoreticalPSK(EbN0_db, M, 'b', 'LineWidth', 1);
+  legend('Simulated RRC', 'Discrete');
 
   title(strcat(num2str(M), '-PSK RRC with Gray code'));
   grid on;
@@ -130,16 +76,4 @@ function passband(rolloff, M, numSymbs)
   ylabel('BER');
 
   formatFigure;
-  %saveas(gcf, strcat('BER_SNR_', num2str(M), 'PSK_', num2str(numSymbs), ...
-  %                   '.svg'));
-
-  %scatterplot(rxFilt);
-  %eyediagram(rxFilt, sps);
-
-end
-
-
-function y = normalizeEnergy(x, numSymbs, e)
-  energy = sum(abs(x) .^ 2) / numSymbs;
-  y = x * sqrt(e / energy);
 end