Receiving Modem¶
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.
- property receive_signal_coding: ReceiveSignalCoding¶
Stream MIMO coding configuration during signal reception.
- property receive_symbol_coding: ReceiveSymbolCoding¶
Complex communication symbol coding configuration during reception.