BER/SNR plots for discrete BPSK over AWGN
[4yp.git] / SNRvsBER_BPSKdiscrete.m
CommitLineData
54255896
AIL
1function 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
53end