Receiving Modem

Inheritance diagram of hermespy.modem.modem.ReceivingModem

Receiving modems represent the digital signal processing operations performed within a communication system for the point of analog-to-digital conversion up to the point of decoding the received bits.

After a ReceivingModem is added as a type of Receiver to a Device, a call to Device.receive will be delegated to ReceivingModem._receive():

sequenceDiagram Device ->>+ ReceivingModem: receive(Signal) ReceivingModem->>+CommunicationWaveform: synchronize(Signal) CommunicationWaveform->>-ReceivingModem: frame_indices loop Frame Reception ReceivingModem->>+ReceiveStreamCoding: decode(Signal) ReceiveStreamCoding->>-ReceivingModem: Signal ReceivingModem->>+CommunicationWaveform: demodulate(Signal) CommunicationWaveform->>-ReceivingModem: Symbols ReceivingModem->>+CommunicationWaveform: estimate_channel(Symbols) CommunicationWaveform->>-ReceivingModem: StatedSymbols ReceivingModem->>+CommunicationWaveform: pick(StatedSymbols) CommunicationWaveform->>-ReceivingModem: StatedSymbols ReceivingModem->>+SymbolPrecoding: decode(StatedSymbols) SymbolPrecoding->>-ReceivingModem: StatedSymbols ReceivingModem->>+CommunicationWaveform: equalize_symbols(StatedSymbols) CommunicationWaveform->>-ReceivingModem: Symbols ReceivingModem->>+CommunicationWaveform: unmap(StatedSymbols) CommunicationWaveform->>-ReceivingModem: Bits ReceivingModem->>+EncoderManager: decode(Bits) EncoderManager->>-ReceivingModem: Bits end ReceivingModem ->>- Device: CommunicationReception

Initially, the ReceivingModem will synchronize incoming Signals, partitionin them into individual frames. For each frame, the ReceiveStreamCoding configured by the receive_stream_coding will be used to decode the incoming base-band sample streams from each AntennaPort. Afterwards, each decoded stream will be demodulated, the channel will be estimated and the resulting StatedSymbols will be picked. The StatedSymbols will then be decoded and equalized. Finally, the Symbols will be unmapped and the error correction will be decoded.

Note that, as a bare minimum, only the waveform has to be configured for a fully functional ReceivingModem. The following snippet shows how to configure a ReceivingModem with a RootRaisedCosineWaveform wavform implementing a CommunicationWaveform:

 1# Initialize a new simulation considering a single device
 2simulation = Simulation()
 3device = simulation.new_device(carrier_frequency=1e10)
 5# Configure the modem modeling the device's transmit DSP
 6rx_modem = ReceivingModem(device=device)
 8# Configure the modem's waveform
 9waveform = RootRaisedCosineWaveform(
10    oversampling_factor=4,
11    symbol_rate=1e6,
12    num_preamble_symbols=16,
13    num_data_symbols=32,
14    modulation_order=64,
16rx_modem.waveform = waveform

The barebone configuration can be extend by additional components such as Synchronization, Stream Precoding, Channel Estimation, Symbol Precoding, Channel Equalization and Bit Encoders:

 1# Configure the waveform's synchronization routine
 2rx_modem.waveform.synchronization = SingleCarrierCorrelationSynchronization()
 4# Add a custom stream precoding to the modem
 5rx_modem.receive_stream_coding[0] = ConventionalBeamformer()
 7# Add a custom symbol precoding to the modem
 8rx_modem.precoding[0] = DFT()
10# Configure the waveform's channel estimation routine
11rx_modem.waveform.channel_estimation = SingleCarrierLeastSquaresChannelEstimation()
13# Add a custom symbol precoding to the modem
14rx_modem.precoding[0] = DFT()
16# Configure the waveform's channel equalization routine
17rx_modem.waveform.channel_equalization = SingleCarrierZeroForcingChannelEqualization()
19# Add forward error correction encodings to the transmitted bit stream
20rx_modem.encoder_manager.add_encoder(RepetitionEncoder(32, 3))
21rx_modem.encoder_manager.add_encoder(BlockInterleaver(192, 32))
class ReceivingModem(*args, device=None, selected_receive_ports=None, **kwargs)[source]

Bases: ReceivingModemBase[CommunicationWaveform], Receiver[CommunicationReception], Serializable

Representation of a wireless modem exclusively receiving.

  • device (Device, optional) – Device operated by the modem.

  • selected_receive_ports (Sequence[int] | None) – Indices of antenna ports selected for reception from the operated Device's antenna array. If not specified, all available antenna ports will be considered.

  • *args – Modem initialization parameters. Refer to ReceivingModemBase for further details.

  • **kwargs – Modem initialization parameters. Refer to ReceivingModemBase for further details.

property device: Device | None

Device this object is assigned to.

None if this object is currently considered floating / unassigned.

property num_receive_ports: int

Number of receive antenna ports.

property power: float

Expected power of the received signal in Watts.


Applies only to the signal-carrying parts of the transmission, silent parts shuch as guard intervals should not be considered.

property receiving_device: Device | None

Receiving device operated by the modem.

None if the device is unspecified.

property transmitting_device: Device | None

Tranmsitting device operated by the modem.

None if the device is unspecified.

yaml_tag: Optional[str] = 'RxModem'

YAML serialization tag

class ReceivingModemBase(*args, **kwargs)[source]

Bases: Generic[CWT], BaseModem[CWT]

Base class of signal processing algorithms receiving information.

  • encoding (EncoderManager, optional) – Bit coding configuration. Encodes communication bit frames during transmission and decodes them during reception.

  • precoding (SymbolPrecoding, optional) – Modulation symbol coding configuration.

  • waveform (CWT, optional) – The waveform to be transmitted by this modem.

  • seed (int, optional) – Seed used to initialize the pseudo-random number generator.

Return type:


property receive_stream_coding: ReceiveStreamCoding

Stream MIMO coding configuration during signal reception.

Returns: Handle to the coding configuration.