1 function SNRvsBER_BPSKdiscrete(numBits)
7 pkg load communications
12 snr = 10 .^ (snr_db ./ 10);
14 %% Eb is assumed to be 1
15 %% noise N ~ Gaussian(mean=0, variance=N0/2)
18 ber = zeros(1, length(snr));
20 data = randomPSK(2, numBits);
23 noisyData = discreteAWGN(data, N0(i));
24 decodedData = decodeNoisyBPSK(noisyData);
26 bitErrors = sum(data ~= decodedData);
27 ber(i) = bitErrors / numBits;
33 %% Plot simulated results
34 semilogy(snr_db, ber, 'r', 'LineWidth', 2);
37 %% Plot theoretical curve
38 %% BPSK: bit error when noise N > sqrt(Eb)
40 %% = Pr(Z > sqrt(Eb) / sqrt(N0/2))
42 ber_th = qfunc(sqrt(2 * snr));
43 semilogy(snr_db, ber_th, 'b', 'LineWidth', 1);
46 xlabel('$E_b/N_0$ (dB)');
48 legend('Simulated', '$Q\left(\sqrt{2 E_b / N_0}\right)$');
51 saveas(gcf, strcat('BPSK_BER_SNR_', num2str(numBits), '.svg'));