Commit | Line | Data |
---|---|---|
54255896 AIL |
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 |