Orthogonal

Orthogonal waveforms are HermesPy’s base class for all multicarrier waveforms such as OFDM, OCDM and OTFS that encode multiple data streams into a time-resource grid.

Considering a simplex-link scenario of two modems communicating over a 3GPP 5G TDL channel

 1# Initialize a simulation with two dedicated devices for transmission and reception
 2carrier_frequency = 3.7e9
 3simulation = Simulation()
 4tx_device = simulation.new_device(carrier_frequency=carrier_frequency)
 5rx_device = simulation.new_device(carrier_frequency=carrier_frequency)
 6
 7# Assume a 5G TDL channel model
 8channel = TDL(TDLType.A, 1e-7, doppler_frequency=10)
 9simulation.set_channel(tx_device, rx_device, channel)
10
11# Configure an orthogonal waveform featuring 128 subcarriers
12grid_resources = [

configuring an orthogonal waveform requires the specification of the resource-time grid onto which the transmitted data and pilot symbols are placed:

 1    GridResource(128, PrefixType.CYCLIC, .1, [GridElement(ElementType.DATA, 1)]),
 2]
 3grid_structure = [
 4    SymbolSection(64, [0, 1])
 5]
 6waveform = OrthogonalWaveform(
 7    grid_resources=grid_resources,
 8    grid_structure=grid_structure,
 9    num_subcarriers=128,
10)
11
12# Configure the link to connect both devices
13link = SimplexLink(waveform=waveform)
14link.connect(tx_device, rx_device)

The grid considers \(128\) orthogonal subcarriers each modulated with a unique symbol, with 128 repetitions in time-domain, so that overall \(16384\) symbols are transmitted per frame. The grid alternates between two types of symbol sections, one carrying a reference element on every \(8\)-th subcarrier and one consisting only of data symbols.

Additionally, post-processing routines for channel estimation and channel equalization may be specified on the waveform level

1# Configure channel estimation and equalization
2waveform.channel_estimation = OrthogonalLeastSquaresChannelEstimation()
3waveform.channel_equalization = ZeroForcingChannelEqualization()
4
5# Configure frame synchronization
6waveform.pilot_section = PilotSection()
7waveform.synchronization = CorrelationSynchronization()

Naturally, the abstract base class OrthogonalWaveform is not meant to be used directly, and has to be replaced by one of the available implementations such as OFDM and OCDM.