4a6c30dd8c889baa006a10152194439f97747dd1
[4yp.git] / SNRvsBER_BPSKdiscrete.m
1 function SNRvsBER_BPSKdiscrete(numBits)
2   if nargin < 1
3     numBits = 1000;
4   end
5
6   if isOctave()
7     pkg load communications
8   end
9
10   %% SNR: Eb/N0
11   snr_db = 0:0.2:10;
12   snr = 10 .^ (snr_db ./ 10);
13
14   %% Eb is assumed to be 1
15   %% noise N ~ Gaussian(mean=0, variance=N0/2)
16   N0 = 1 ./ snr;
17
18   ber = zeros(1, length(snr));
19
20   data = randomPSK(2, numBits);
21
22   for i = 1:length(snr)
23     noisyData = discreteAWGN(data, N0(i));
24     decodedData = decodeNoisyBPSK(noisyData);
25
26     bitErrors = sum(data ~= decodedData);
27     ber(i) = bitErrors / numBits;
28   end
29
30   fig1 = figure(1);
31   clf;
32
33   %% Plot simulated results
34   semilogy(snr_db, ber, 'r', 'LineWidth', 2);
35   hold on;
36
37   %% Plot theoretical curve
38   %% BPSK: bit error when noise N > sqrt(Eb)
39   %%   Pr(N > sqrt(Eb))
40   %% = Pr(Z > sqrt(Eb) / sqrt(N0/2))
41   %% = Q(sqrt(2 * SNR))
42   ber_th = qfunc(sqrt(2 * snr));
43   semilogy(snr_db, ber_th, 'b', 'LineWidth', 1);
44
45   grid on;
46   xlabel('$E_b/N_0$ (dB)');
47   ylabel('BER');
48   legend('Simulated', '$Q\left(\sqrt{2 E_b / N_0}\right)$');
49
50   formatFigure;
51   saveas(gcf, strcat('BPSK_BER_SNR_', num2str(numBits), '.svg'));
52
53 end