Skip to content

BER test

BER(input, output)

Calculating BER (Bit Error Rate) for two seqences of bits.

Parameters:

Name Type Description Default
input NDArray[uint8]

Sent bits (not yet affected by noise in channel).

required
output NDArray[uint8]

Received bits after transmission.

required

Returns:

Type Description
float

BER value.

Source code in src\BER_test.py
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def BER(input: NDArray[np.uint8], output: NDArray[np.uint8]) -> float:
    """
    Calculating BER (Bit Error Rate) for two seqences of bits.

    Parameters
    ----------
    input : NDArray[np.uint8]
        Sent bits (not yet affected by noise in channel).
    output : NDArray[np.uint8]
        Received bits after transmission.

    Returns
    -------
    float
        BER value.
    """

    return (input != output).sum()/input.size

avg_BER(EbN0dB_values, K_values)

Calculating average BER values for different Eb/N0 [dB].

Parameters:

Name Type Description Default
EbN0dB_values NDArray[float64]

Array with various Eb/N0 [dB] values.

required
K_values NDArray[uint16]

Array with various sizes of messages.

required

Returns:

Type Description
NDArray[float64]

Values of average BER for different Eb/N0 [dB] values.

Source code in src\BER_test.py
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
def avg_BER(EbN0dB_values: NDArray[np.float64], K_values: NDArray[np.uint16]) -> NDArray[np.float64]:
    """
    Calculating average BER values for different Eb/N0 [dB].

    Parameters
    ----------
    EbN0dB_values : NDArray[np.float64]
        Array with various Eb/N0 [dB] values. 
    K_values : NDArray[np.uint16]
        Array with various sizes of messages. 

    Returns
    -------
    NDArray[np.float64]
        Values of average BER for different Eb/N0 [dB] values.
    """

    path_1 = "tables\\fixed_interleaving_pattern_table.txt"
    path_2 = "tables\\polar_sequence_and_its_corresponding_reliability.txt"

    pi_max_il = load_fixed_interleaving_pattern_table(path_1)
    Q = load_polar_sequence_and_reliability_table(path_2)

    ### actors
    encoder = Encoder(pi_max_il, Q)
    modulator = Modulator()
    channel = Channel("gwn")
    decoder = Decoder(Q)
    ###

    avg_ber_arr = np.zeros(EbN0dB_values.size, dtype=np.float64)
    for msg in generate_messages(K_values):
        code_word = encoder.encode(msg, E=msg.size) # encoding
        bpsk_out = modulator.bpsk(code_word) # BPSK modulating 

        for i, EbN0dB in enumerate(EbN0dB_values):     
            channel_out = channel.send_through(mod_seq=bpsk_out, EbN0dB=EbN0dB, K=msg.size) # adding white noise
            _, decoded_seq = decoder.decode(r=channel_out, K=msg.size) # decoding

            avg_ber_arr[i] += BER(msg, decoded_seq)/K_values.size # calculating average BER for next Eb/N0 [dB] values

    return avg_ber_arr

generate_messages(K_values)

Generates random messages of sizes provided by K_values parameter.

Parameters:

Name Type Description Default
K_values NDArray[uint16]

Sizes of messages arrays that will be generated.

required

Yields:

Type Description
Generator[NDArray[uint16], None, None]

Messages of sizes defined in K_values parameter.

Source code in src\BER_test.py
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
def generate_messages(K_values: NDArray[np.uint16]) -> Generator[NDArray[np.uint16], None, None]:
    """
    Generates random messages of sizes provided by K_values parameter.

    Parameters
    ----------
    K_values : NDArray[np.uint16]
        Sizes of messages arrays that will be generated.

    Yields
    ------
    Generator[NDArray[np.uint16], None, None]
        Messages of sizes defined in K_values parameter.
    """

    for K in K_values:
        yield np.random.randint(low=0, high=2, size=K, dtype=np.uint8)