Core#

Observing signals inside a chain#

A chain describes the communication system and nothing else: there are no recorder, logger or scope blocks to insert between the processors. To observe a signal, name the block and declare it as an observation:

chain = Sequential([SymbolGenerator(16, name="tx"), SymbolMapper(alphabet),
                    AWGN(snr_dB=15, name="awgn")], observations=["tx", "awgn"])
y = chain(1000)
plot_iq(chain.observation("awgn"))

observations is chain metadata: each observed block costs one dictionary store of a reference (no copy), and observation() returns the recorded array afterwards. Plotting and reporting are plain functions applied to the extracted arrays – see Visualizers and comnumpy.core.metrics.signal_report.

Processor Vs Compensator#

The comnumpy library distinguishes between two types of signal processing components: Processors and Compensators.

This separation is based on the nature of their operations and how they interact with the input signals.

  • Processors: These components apply fixed transformations to the input signals, regardless of the signal’s content. Examples include amplifiers and clippers.

  • Compensators: These components, on the other hand, adapt their behavior based on the input signal to achieve a desired output characteristic. Examples include normalizers and DC offset correctors.