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)
 4
 5# Configure the modem modeling the device's transmit DSP
 6rx_modem = ReceivingModem()
 7device.receivers.add(rx_modem)
 8
 9# Configure the modem's waveform
10waveform = RootRaisedCosineWaveform(
11    oversampling_factor=4,
12    symbol_rate=1e6,
13    num_preamble_symbols=16,
14    num_data_symbols=32,
15    modulation_order=64,
16)

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

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

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

Representation of a wireless modem exclusively receiving.

Parameters:
  • 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 power: float

Expected power of the received signal in Watts.

Note

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

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.

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

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

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

_receive(signal, device)[source]
Return type:

CommunicationReception

property receive_signal_coding: ReceiveSignalCoding

Stream MIMO coding configuration during signal reception.

property receive_symbol_coding: ReceiveSymbolCoding

Complex communication symbol coding configuration during reception.