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(device=None, *args, **kwargs)[source]#

Bases: BaseModem, Receiver[CommunicationReception], Serializable

Representation of a wireless modem exclusively receiving.

  • 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 (CommunicationWaveform, optional) – The waveform to be transmitted by this modem.

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


Process a received signal by the receiver.

Subroutine of the public receive method that performs the pipeline-specific receive processing and consolidates the inferred information into a single Reception object.


signal (Signal) – Multi-stream signal model to be processed.

Return type:



Information inferred from the received signal.

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 receive_stream_coding: ReceiveStreamCoding#

Stream MIMO coding configuration during signal reception.

Returns: Handle to the coding configuration.

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