cdff01ffef4ecffa2701edc171d4bd6bebfbd96c
[4yp.git] / discretePSK_BER_SNR.m
1 function discretePSK_BER_SNR(M, numSymbs)
2   %% Set defaults for inputs
3   if nargin < 2
4     numSymbs = 1000;
5   end
6   if nargin < 1
7     M = 2;
8   end
9
10   EbN0_db = 0:0.2:10;
11   EbN0 = 10 .^ (EbN0_db ./ 10);
12
13   Es = 1;
14   Eb = Es / log2(M);
15   N0 = Eb ./ EbN0;
16
17   EsN0 = EbN0 .* log2(M);
18   EsN0_db = 10 .* log10(EsN0);
19
20   plotlen = length(EbN0);
21
22   ber = zeros(1, plotlen);
23
24   data = randi([0, M - 1], 1, numSymbs);
25   txsig = pskmod(data, M, 0, 'gray');
26
27   for i = 1:plotlen
28     rxsig = awgn(txsig, EsN0_db(i));
29     demodData = pskdemod(rxsig, M, 0, 'gray');
30
31     [bitErrors, ber(i)] = biterr(data, demodData);
32   end
33
34   figure(1);
35   clf;
36
37   %% Plot simulated results
38   semilogy(EbN0_db, ber, 'r', 'LineWidth', 2);
39   hold on;
40
41   theoreticalPSK(EbN0_db, M, 'b', 'LineWidth', 1);
42
43   if M == 2 || M == 4
44     legend('Simulated', 'Theoretical');
45   else
46     legend('Simulated', 'Approximation');
47   end
48
49   title(strcat(num2str(M), '-PSK with Gray code'));
50   grid on;
51   xlabel('$E_b/N_0$ (dB)');
52   ylabel('BER');
53
54   formatFigure;
55   %saveas(gcf, strcat('BER_SNR_', num2str(M), 'PSK_', num2str(numSymbs), ...
56   %                   '.svg'));
57 end