Bit Error Rate#

Inheritance diagram of hermespy.modem.evaluators.BitErrorEvaluator, hermespy.modem.evaluators.BitErrorArtifact, hermespy.modem.evaluators.BitErrorEvaluation

Considering two linked modems denoted by \((\alpha)\) and \((\beta)\), with modem \((\alpha)\) transmitting a bit stream

\[\mathbf{b}_{\mathrm{Tx}}^{(\alpha)} = \left[ b_{\mathrm{Tx}}^{(\alpha,1)}, b_{\mathrm{Tx}}^{(\alpha,2)}, \ldots, b_{\mathrm{Tx}}^{(\alpha,B)} \right]^{\mathsf{T}} \in \lbrace 0, 1 \rbrace^{B}\]

and modem \((\beta)\) receiving a bit stream

\[\mathbf{b}_{\mathrm{Rx}}^{(\beta)} = \left[ b_{\mathrm{Rx}}^{(\beta,1)}, b_{\mathrm{rx}}^{(\beta,2)}, \ldots, b_{\mathrm{Rx}}^{(\beta,B)} \right]^{\mathsf{T}} \in \lbrace 0, 1 \rbrace^{B}\]

Hermes defines the bit error rate (BER) as the average number of bit errors between the streams

\[\mathrm{BER}^{(\alpha,\beta)} = \frac{ \lVert \mathbf{b}_{\mathrm{Tx}}^{(\alpha)} - \mathbf{b}_{\mathrm{Rx}}^{(\beta)} \rVert_2^2 }{ B} \ \text{.}\]

In practice, the number of bits \(B\) may differ between transmitter and receiver. In this case, the shorter bit stream is padded with zeros.

The following minimal examples outlines how to configure this evaluator within the context of a simulation campaign:

 1# Create a new simulation featuring two devices
 2simulation = Simulation()
 3device_alpha = simulation.new_device()
 4device_beta = simulation.new_device()
 6# Create a transmitting and receiving modem for each device, respectively
 7modem_alpha = TransmittingModem(device=device_alpha)
 8modem_beta = ReceivingModem(device=device_beta)
10# Configure the modem's waveform
11waveform_configuration = {
12    'symbol_rate': 1e8,
13    'num_preamble_symbols': 10,
14    'num_data_symbols': 100,
16modem_alpha.waveform = RootRaisedCosineWaveform(**waveform_configuration)
17modem_beta.waveform = RootRaisedCosineWaveform(**waveform_configuration)
19simulation.add_evaluator(BitErrorEvaluator(modem_alpha, modem_beta))
20simulation.new_dimension('snr', dB(0, 2, 4, 8, 10, 12, 14, 16, 18, 20), device_beta)
21simulation.num_samples = 1000
22result =
class BitErrorEvaluator(transmitting_modem, receiving_modem, plot_surface=True)[source]#

Bases: CommunicationEvaluator, Serializable

Evaluate bit errors between two modems exchanging information.

  • transmitting_modem (TransmittingModem) – Modem transmitting information.

  • receiving_modem (ReceivingModem) – Modem receiving information.

  • plot_surface (bool, optional) – Plot the surface of the evaluation result in two-dimensional grids. Defaults to True.


Evaluate the state of an investigated object.

Implements the process of extracting an arbitrary performance indicator, represented by the returned Artifact \(X_m\).

Returns: Artifact \(X_m\) resulting from the evaluation.

Return type:


property abbreviation: str#

Short string representation of this evaluator.

Used as a label for console output and plot axes annotations.

property title: str#

Long string representation of this evaluator.

Used as plot title.

class BitErrorArtifact(artifact)[source]#

Bases: ArtifactTemplate[float64]

Artifact of a bit error evaluation between two modems exchanging information.

Generated by artifact() of BitErrorEvaluation.


artifact (AT) – Artifact value.

class BitErrorEvaluation(evaluation)[source]#

Bases: EvaluationTemplate[ndarray]

Bit error evaluation between two modems exchanging information.

Generated by evaluate() of BitErrorEvaluator.


Generate an artifact from this evaluation.

Returns: The evaluation artifact.

Return type:


property title: str#

Title of the visualizable.