blob: d7274de0f5fa75a75a4305d387123b3c950b6773 [file] [log] [blame]
# SPDX-License-Identifier: MPL-2.0
# Copyright (c) 2022 Philipp Le <philipp@philipple.de>.
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
from __future__ import annotations
from abc import ABC, abstractmethod
from typing import List
from .signal import Signal
class TxBasebandGenerator(ABC):
@abstractmethod
def generate_tx_baseband_signal(self, sample_rate: float) -> Signal:
...
def __add__(self, other: TxBasebandGenerator) -> TxBasebandGenerator:
class _Combined(TxBasebandGenerator):
def __init__(self, gen1: TxBasebandGenerator, gen2: TxBasebandGenerator):
self.ops: List[TxBasebandGenerator] = [gen1, gen2]
def generate_tx_baseband_signal(self, sample_rate: float) -> Signal:
summed = self.ops[0].generate_tx_baseband_signal(sample_rate)
for sig in self.ops[1:]:
summed = summed + sig.generate_tx_baseband_signal(sample_rate)
return summed
def __add__(self, other: TxBasebandGenerator):
self.ops.append(other)
return _Combined(self, other)
class RfBandGenerator(ABC):
@abstractmethod
def generate_rf_signal(self, sample_rate: float) -> Signal:
...
def __add__(self, other: RfBandGenerator) -> RfBandGenerator:
class _Combined(RfBandGenerator):
def __init__(self, gen1: RfBandGenerator, gen2: RfBandGenerator):
self.ops: List[RfBandGenerator] = [gen1, gen2]
def generate_rf_signal(self, sample_rate: float) -> Signal:
summed = self.ops[0].generate_rf_signal(sample_rate)
for sig in self.ops[1:]:
summed = summed + sig.generate_rf_signal(sample_rate)
return summed
def __add__(self, other: RfBandGenerator):
self.ops.append(other)
return _Combined(self, other)
class RxBasebandGenerator(ABC):
@abstractmethod
def generate_rx_baseband_signal(self, sample_rate: float) -> Signal:
...
def __add__(self, other: RxBasebandGenerator) -> RxBasebandGenerator:
class _Combined(RxBasebandGenerator):
def __init__(self, gen1: RxBasebandGenerator, gen2: RxBasebandGenerator):
self.ops: List[RxBasebandGenerator] = [gen1, gen2]
def generate_rx_baseband_signal(self, sample_rate: float) -> Signal:
summed = self.ops[0].generate_rx_baseband_signal(sample_rate)
for sig in self.ops[1:]:
summed = summed + sig.generate_rx_baseband_signal(sample_rate)
return summed
def __add__(self, other: RxBasebandGenerator):
self.ops.append(other)
return _Combined(self, other)
class RxCorrelationGenerator(ABC):
@abstractmethod
def generate_rx_correlation(self, sample_rate: float) -> Signal:
...
def __add__(self, other: RxCorrelationGenerator) -> RxCorrelationGenerator:
class _Combined(RxCorrelationGenerator):
def __init__(self, gen1: RxCorrelationGenerator, gen2: RxCorrelationGenerator):
self.ops: List[RxCorrelationGenerator] = [gen1, gen2]
def generate_rx_correlation(self, sample_rate: float) -> Signal:
summed = self.ops[0].generate_rx_correlation(sample_rate)
for sig in self.ops[1:]:
summed = summed + sig.generate_rx_correlation(sample_rate)
return summed
def __add__(self, other: RxCorrelationGenerator):
self.ops.append(other)
return _Combined(self, other)