Source code for hermespy.modem.precoding.dft
# -*- coding: utf-8 -*-
from __future__ import annotations
from typing import Literal
import numpy as np
from hermespy.core import Serializable
from ..symbols import StatedSymbols
from .symbol_precoding import SymbolPrecoder
__author__ = "Jan Adler"
__copyright__ = "Copyright 2023, Barkhausen Institut gGmbH"
__credits__ = ["Jan Adler"]
__license__ = "AGPLv3"
__version__ = "1.1.0"
__maintainer__ = "Jan Adler"
__email__ = "jan.adler@barkhauseninstitut.org"
__status__ = "Prototype"
[docs]
class DFT(SymbolPrecoder, Serializable):
"""A precoder applying the Discrete Fourier Transform to each data stream."""
yaml_tag = "DFT"
__fft_norm: Literal["backward", "ortho", "forward"]
def __init__(self, fft_norm: Literal["backward", "ortho", "forward"] = "ortho") -> None:
"""
Args:
fft_norm (str, optional):
The norm applied to the discrete fourier transform.
See also numpy.fft.fft for details
"""
# Initialize base class
SymbolPrecoder.__init__(self)
# Initialize attributes
self.__fft_norm = fft_norm
[docs]
def encode(self, symbols: StatedSymbols) -> StatedSymbols:
encoded_symbols = symbols.copy()
encoded_symbols.raw = np.fft.fft(symbols.raw, axis=1, norm=self.__fft_norm)
return encoded_symbols
[docs]
def decode(self, symbols: StatedSymbols) -> StatedSymbols:
decoded_symbols = symbols.copy()
decoded_symbols.raw = np.fft.ifft(symbols.raw, axis=1, norm=self.__fft_norm)
return decoded_symbols
@property
def num_input_streams(self) -> int:
# DFT precoding does not alter the number of symbol streams
return self.precoding.required_outputs(self)
@property
def num_output_streams(self) -> int:
# DFT precoding does not alter the number of symbol streams
return self.precoding.required_outputs(self)