LTE Primopredajnik
Loading...
Searching...
No Matches
transmitter.ofdm.OFDMModulator Class Reference

Public Member Functions

None __init__ (self, np.ndarray resource_grid, int|None new_fft_size=None)
tuple[np.ndarray, int] modulate (self)

Public Attributes

np.ndarray resource_grid = np.asarray(resource_grid)
int|None new_fft_size = new_fft_size
 num_subcarriers
np.ndarray num_ofdm_symbols = self.resource_grid.shape
int ndlrb = self.num_subcarriers // 12
tuple normal_cp = (self.num_ofdm_symbols % 14 == 0)
tuple extended_cp = (self.num_ofdm_symbols % 12 == 0)
int num_subframes = self.num_ofdm_symbols // 14
int N = self._determine_fft_size()
int sample_rate = self.N * 15000
np.ndarray Ncp = multiplier * np.array([10] + [9] * 6)
np.ndarray Ecp = multiplier * np.array([32] * 6)
int n_symbols_per_slot = 7
np.ndarray cp_lengths = self.Ncp
int output_length = self.num_subframes * (self.N * 14 + 2 * self.Ncp[0] + 12 * self.Ncp[1])

Protected Member Functions

int _determine_fft_size (self)

Detailed Description

OFDM modulator za LTE signale (downlink, baseband).

Ova klasa generiše vremenski OFDM talasni oblik iz LTE resource grida:
- mapira centralnih ``12 * NDLRB`` podnosioca u IFFT ulaz,
- postavlja DC bin na nulu,
- računa IFFT (skalirano sa ``N``),
- dodaje ciklički prefiks (CP) za svaki OFDM simbol,
- spaja sve simbole u jedan vremenski signal.

Parametri
----------
resource_grid : np.ndarray
    Kompleksna 2D matrica oblika ``(12*NDLRB, Nsym)`` gdje:
    - redovi predstavljaju podnosioca (subcarrier index u gridu),
    - kolone predstavljaju OFDM simbole.
new_fft_size : int, opcionalno
    Ručni override FFT veličine. Ako je zadano, mora biti u listi
    ``[128, 256, 512, 1024, 1408, 1536, 2048]`` i biće uzeto
    ``max(base_fft, new_fft_size)``.

Atributi
--------
ndlrb : int
    Broj downlink resource blokova (NDLRB), izveden iz broja podnosioca.
normal_cp : bool
    True ako je broj simbola djeljiv sa 14 (normal CP).
extended_cp : bool
    True ako je broj simbola djeljiv sa 12 (extended CP).
N : int
    FFT veličina koja se koristi za IFFT.
sample_rate : int
    Sampling frekvencija u Hz (``N * 15000``).
output_length : int
    Ukupan broj uzoraka vremenskog signala nakon dodavanja CP.

Raises
------
ValueError
    Ako `resource_grid` nije 2D, ako broj podnosioca nije višekratnik 12,
    ili ako broj OFDM simbola nije kompatibilan sa LTE (14 ili 12 po subfrejmu).
RuntimeError
    Ako dođe do nekonzistentnosti u popunjavanju izlaznog signala.

Primjer
-------
Minimalni primjer (NDLRB=6, 1 subframe, normal CP)::

    >>> import numpy as np
    >>> from transmitter.ofdm import OFDMModulator
    >>>
    >>> # Prazan grid (72 podnosioca, 14 simbola)
    >>> grid = np.zeros((72, 14), dtype=np.complex64)
    >>>
    >>> # Npr. ubaci jedan simbol na neki podnosioc/simbol
    >>> grid[10, 0] = 1 + 1j
    >>>
    >>> ofdm = OFDMModulator(grid)
    >>> waveform, fs = ofdm.modulate()
    >>> waveform.shape
    (2048,)
    >>> fs
    1920000

Member Function Documentation

◆ _determine_fft_size()

int transmitter.ofdm.OFDMModulator._determine_fft_size ( self)
protected
Određuje minimalnu FFT veličinu prema NDLRB.

Returns
-------
int
    FFT veličina (N) koja se koristi u IFFT.

Raises
------
ValueError
    Ako NDLRB nije podržan ili je `new_fft_size` nevalidan.

◆ modulate()

tuple[np.ndarray, int] transmitter.ofdm.OFDMModulator.modulate ( self)
Izvršava OFDM modulaciju nad resource gridom.

Za svaki OFDM simbol:
1) kreira IFFT ulaz dužine `N`,
2) mapira podnosioca oko DC bina (`N/2`) i ostavlja DC na nuli,
3) računa IFFT (skalirano: ``N * ifft``),
4) dodaje CP odgovarajuće dužine,
5) konkatenira u izlazni signal.

Returns
-------
output_waveform : np.ndarray
    Kompleksni vremenski signal sa CP (1D niz).
sample_rate : int
    Sampling frekvencija u Hz.

Raises
------
RuntimeError
    Ako dođe do prelaska preko `output_length` ili ako izlaz nije
    potpuno popunjen.

Primjer
-------
::

    >>> import numpy as np
    >>> from transmitter.ofdm import OFDMModulator
    >>> grid = np.zeros((72, 14), dtype=np.complex64)
    >>> grid[36, 0] = 1 + 0j
    >>> ofdm = OFDMModulator(grid)
    >>> y, fs = ofdm.modulate()
    >>> y.shape[0] == ofdm.output_length
    True

The documentation for this class was generated from the following file:
  • transmitter/ofdm.py