OTFS¶
Orthogonal Time Frequency Space (OTFS) modulation is a modulation scheme that is designed to provide high spectral efficiency and low latency.
It is particularly well suited for high mobility scenarios, such as satellite and mobile communications.
Within HermesPy, OTFS is implemented as type of OrthogonalWaveform
and a precoding of OFDM
.
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# Link the devices
12link = SimplexLink(tx_device, rx_device)
configuring an OTFS waveform requires the specification of the resource-time grid onto which the transmitted data and pilot symbols are placed:
1# Configure an orthogonal waveform featuring 128 subcarriers
2grid_resources = [
3 GridResource(16, PrefixType.CYCLIC, .1, [GridElement(ElementType.DATA, 7), GridElement(ElementType.REFERENCE, 1)]),
4 GridResource(128, PrefixType.CYCLIC, .1, [GridElement(ElementType.DATA, 1)]),
5]
6grid_structure = [
7 SymbolSection(64, [0, 1])
8]
9waveform = OTFSWaveform(
10 grid_resources=grid_resources,
11 grid_structure=grid_structure,
12 num_subcarriers=128,
13 subcarrier_spacing=1e3,
14)
15link.waveform = waveform
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()
- class OTFSWaveform(grid_resources, grid_structure, num_subcarriers=1024, subcarrier_spacing=1000.0, dc_suppression=True, pilot_section=None, pilot_sequence=None, repeat_pilot_sequence=True, **kwargs)[source]¶
Bases:
OFDMWaveform
Orthogonal Time Frequency Space (OTFS) waveform.
- Parameters:
grid_resources (Sequence[GridResource]) – Frequency-domain resource section configurations.
grid_structure (Sequence[GridSection]) – Time-domain frame configuration.
num_subcarriers (int, optional) – Maximum number of assignable subcarriers. Unassigned subcarriers will be assumed to be zero. \(1024\) by default.
subcarrier_spacing (float, optional) – Spacing between individual subcarriers in Hz. \(1~\mathrm{kHz}\) by default.
num_subcarriers – Maximum number of assignable subcarriers. Unassigned subcarriers will be assumed to be zero. \(1024\) by default.
dc_suppression (bool, optional) – Suppress the direct current component during waveform generation. Enabled by default.
pilot_section (PilotSection, optional) – Pilot section preceding the frame’s payload. If not specified, no dedicated pilot section will be generated.
pilot_sequence (PilotSymbolSequence, optional) – Sequence of symbols used for the pilot section and reference symbols within the frame. If not specified, pseudo-random sequences will be generated from the set of data symbols.
**kwargs (Any) – Waveform generator base class initialization parameters. Refer to
CommunicationWaveform
for details.