=================== Receiving Modem =================== .. inheritance-diagram:: hermespy.modem.modem.ReceivingModem :parts: 1 :top-classes: hermespy.core.device.Receiver, hermespy.modem.modem.BaseModem 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 :class:`ReceivingModem` is added as a type of :class:`Receiver` to a :class:`Device`, a call to :meth:`Device.receive` will be delegated to :meth:`ReceivingModem._receive()`: .. mermaid:: 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 :class:`ReceivingModem` will synchronize incoming :class:`Signals`, partitionin them into individual frames. For each frame, the :class:`ReceiveStreamCoding` configured by the :attr:`receive_stream_coding` will be used to decode the incoming base-band sample streams from each :class:`AntennaPort`. Afterwards, each decoded stream will be :meth:`demodulated`, the channel will be :meth:`estimated` and the resulting :class:`StatedSymbols` will be :meth:`picked`. The :class:`StatedSymbols` will then be :meth:`decoded` and :meth:`equalized`. Finally, the :class:`Symbols` will be :meth:`unmapped` and the error correction will be :meth:`decoded`. Note that, as a bare minimum, only the :class:`waveform` has to be configured for a fully functional :class:`ReceivingModem`. The following snippet shows how to configure a :class:`ReceivingModem` with a :class:`RootRaisedCosineWaveform` wavform implementing a :class:`CommunicationWaveform`: .. literalinclude:: ../scripts/examples/modem_ReceivingModem.py :language: python :linenos: :lines: 19-34 The barebone configuration can be extend by additional components such as :class:`Synchronization`, :class:`Stream Precoding`, :class:`Channel Estimation`, :class:`Symbol Precoding`, :class:`Channel Equalization` and :class:`Bit Encoders`: .. literalinclude:: ../scripts/examples/modem_ReceivingModem.py :language: python :linenos: :lines: 36-56 .. autoclass:: hermespy.modem.modem.ReceivingModem .. autoclass:: hermespy.modem.modem.ReceivingModemBase :private-members: _receive .. footbibliography::